@reserve-protocol/dtf-sdk 0.1.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/README.md +134 -0
- package/dist/abi/deployer.d.ts +281 -0
- package/dist/abi/deployer.d.ts.map +1 -0
- package/dist/abi/deployer.js +178 -0
- package/dist/abi/deployer.js.map +1 -0
- package/dist/abi/erc20.d.ts +73 -0
- package/dist/abi/erc20.d.ts.map +1 -0
- package/dist/abi/erc20.js +58 -0
- package/dist/abi/erc20.js.map +1 -0
- package/dist/abi/folio.d.ts +1950 -0
- package/dist/abi/folio.d.ts.map +1 -0
- package/dist/abi/folio.js +1430 -0
- package/dist/abi/folio.js.map +1 -0
- package/dist/abi/governance-deployer.d.ts +130 -0
- package/dist/abi/governance-deployer.d.ts.map +1 -0
- package/dist/abi/governance-deployer.js +77 -0
- package/dist/abi/governance-deployer.js.map +1 -0
- package/dist/abi/governor.d.ts +1276 -0
- package/dist/abi/governor.d.ts.map +1 -0
- package/dist/abi/governor.js +1661 -0
- package/dist/abi/governor.js.map +1 -0
- package/dist/abi/proxy-admin.d.ts +49 -0
- package/dist/abi/proxy-admin.d.ts.map +1 -0
- package/dist/abi/proxy-admin.js +42 -0
- package/dist/abi/proxy-admin.js.map +1 -0
- package/dist/abi/spells.d.ts +67 -0
- package/dist/abi/spells.d.ts.map +1 -0
- package/dist/abi/spells.js +61 -0
- package/dist/abi/spells.js.map +1 -0
- package/dist/abi/timelock.d.ts +673 -0
- package/dist/abi/timelock.d.ts.map +1 -0
- package/dist/abi/timelock.js +469 -0
- package/dist/abi/timelock.js.map +1 -0
- package/dist/abi/vote-lock.d.ts +164 -0
- package/dist/abi/vote-lock.d.ts.map +1 -0
- package/dist/abi/vote-lock.js +116 -0
- package/dist/abi/vote-lock.js.map +1 -0
- package/dist/clients/chains.d.ts +5 -0
- package/dist/clients/chains.d.ts.map +1 -0
- package/dist/clients/chains.js +23 -0
- package/dist/clients/chains.js.map +1 -0
- package/dist/clients/create-clients.d.ts +14 -0
- package/dist/clients/create-clients.d.ts.map +1 -0
- package/dist/clients/create-clients.js +32 -0
- package/dist/clients/create-clients.js.map +1 -0
- package/dist/clients/create-price-client.d.ts +7 -0
- package/dist/clients/create-price-client.d.ts.map +1 -0
- package/dist/clients/create-price-client.js +15 -0
- package/dist/clients/create-price-client.js.map +1 -0
- package/dist/constants.d.ts +35 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +100 -0
- package/dist/constants.js.map +1 -0
- package/dist/deploy/build-deploy.d.ts +7 -0
- package/dist/deploy/build-deploy.d.ts.map +1 -0
- package/dist/deploy/build-deploy.js +84 -0
- package/dist/deploy/build-deploy.js.map +1 -0
- package/dist/deploy/extract-deployed-address.d.ts +8 -0
- package/dist/deploy/extract-deployed-address.d.ts.map +1 -0
- package/dist/deploy/extract-deployed-address.js +36 -0
- package/dist/deploy/extract-deployed-address.js.map +1 -0
- package/dist/deploy/permissionless-defaults.d.ts +35 -0
- package/dist/deploy/permissionless-defaults.d.ts.map +1 -0
- package/dist/deploy/permissionless-defaults.js +76 -0
- package/dist/deploy/permissionless-defaults.js.map +1 -0
- package/dist/deploy/token-registry.d.ts +9 -0
- package/dist/deploy/token-registry.d.ts.map +1 -0
- package/dist/deploy/token-registry.js +68 -0
- package/dist/deploy/token-registry.js.map +1 -0
- package/dist/deploy/zap-deploy.d.ts +4 -0
- package/dist/deploy/zap-deploy.d.ts.map +1 -0
- package/dist/deploy/zap-deploy.js +50 -0
- package/dist/deploy/zap-deploy.js.map +1 -0
- package/dist/dtf/fees.d.ts +10 -0
- package/dist/dtf/fees.d.ts.map +1 -0
- package/dist/dtf/fees.js +103 -0
- package/dist/dtf/fees.js.map +1 -0
- package/dist/dtf/fetch-analytics.d.ts +27 -0
- package/dist/dtf/fetch-analytics.d.ts.map +1 -0
- package/dist/dtf/fetch-analytics.js +63 -0
- package/dist/dtf/fetch-analytics.js.map +1 -0
- package/dist/dtf/fetch-basket.d.ts +16 -0
- package/dist/dtf/fetch-basket.d.ts.map +1 -0
- package/dist/dtf/fetch-basket.js +32 -0
- package/dist/dtf/fetch-basket.js.map +1 -0
- package/dist/dtf/fetch-discover.d.ts +10 -0
- package/dist/dtf/fetch-discover.d.ts.map +1 -0
- package/dist/dtf/fetch-discover.js +17 -0
- package/dist/dtf/fetch-discover.js.map +1 -0
- package/dist/dtf/fetch-dtf.d.ts +25 -0
- package/dist/dtf/fetch-dtf.d.ts.map +1 -0
- package/dist/dtf/fetch-dtf.js +39 -0
- package/dist/dtf/fetch-dtf.js.map +1 -0
- package/dist/dtf/mint.d.ts +9 -0
- package/dist/dtf/mint.d.ts.map +1 -0
- package/dist/dtf/mint.js +82 -0
- package/dist/dtf/mint.js.map +1 -0
- package/dist/dtf/read-basket.d.ts +4 -0
- package/dist/dtf/read-basket.d.ts.map +1 -0
- package/dist/dtf/read-basket.js +20 -0
- package/dist/dtf/read-basket.js.map +1 -0
- package/dist/dtf/read-config.d.ts +4 -0
- package/dist/dtf/read-config.d.ts.map +1 -0
- package/dist/dtf/read-config.js +80 -0
- package/dist/dtf/read-config.js.map +1 -0
- package/dist/dtf/read-dtf.d.ts +6 -0
- package/dist/dtf/read-dtf.d.ts.map +1 -0
- package/dist/dtf/read-dtf.js +32 -0
- package/dist/dtf/read-dtf.js.map +1 -0
- package/dist/dtf/read-rebalance-control.d.ts +4 -0
- package/dist/dtf/read-rebalance-control.d.ts.map +1 -0
- package/dist/dtf/read-rebalance-control.js +14 -0
- package/dist/dtf/read-rebalance-control.js.map +1 -0
- package/dist/dtf/read-roles.d.ts +4 -0
- package/dist/dtf/read-roles.d.ts.map +1 -0
- package/dist/dtf/read-roles.js +29 -0
- package/dist/dtf/read-roles.js.map +1 -0
- package/dist/dtf/read-version.d.ts +3 -0
- package/dist/dtf/read-version.d.ts.map +1 -0
- package/dist/dtf/read-version.js +9 -0
- package/dist/dtf/read-version.js.map +1 -0
- package/dist/dtf/redeem.d.ts +5 -0
- package/dist/dtf/redeem.d.ts.map +1 -0
- package/dist/dtf/redeem.js +27 -0
- package/dist/dtf/redeem.js.map +1 -0
- package/dist/governance/build-proposal.d.ts +11 -0
- package/dist/governance/build-proposal.d.ts.map +1 -0
- package/dist/governance/build-proposal.js +78 -0
- package/dist/governance/build-proposal.js.map +1 -0
- package/dist/governance/build-settings-calldata.d.ts +39 -0
- package/dist/governance/build-settings-calldata.d.ts.map +1 -0
- package/dist/governance/build-settings-calldata.js +145 -0
- package/dist/governance/build-settings-calldata.js.map +1 -0
- package/dist/governance/compute-proposal-state.d.ts +18 -0
- package/dist/governance/compute-proposal-state.d.ts.map +1 -0
- package/dist/governance/compute-proposal-state.js +87 -0
- package/dist/governance/compute-proposal-state.js.map +1 -0
- package/dist/governance/decode-proposal.d.ts +22 -0
- package/dist/governance/decode-proposal.d.ts.map +1 -0
- package/dist/governance/decode-proposal.js +164 -0
- package/dist/governance/decode-proposal.js.map +1 -0
- package/dist/governance/fetch-proposals.d.ts +41 -0
- package/dist/governance/fetch-proposals.d.ts.map +1 -0
- package/dist/governance/fetch-proposals.js +173 -0
- package/dist/governance/fetch-proposals.js.map +1 -0
- package/dist/governance/read-governance.d.ts +7 -0
- package/dist/governance/read-governance.d.ts.map +1 -0
- package/dist/governance/read-governance.js +97 -0
- package/dist/governance/read-governance.js.map +1 -0
- package/dist/governance/read-proposals.d.ts +11 -0
- package/dist/governance/read-proposals.d.ts.map +1 -0
- package/dist/governance/read-proposals.js +104 -0
- package/dist/governance/read-proposals.js.map +1 -0
- package/dist/governance/read-voting-power.d.ts +8 -0
- package/dist/governance/read-voting-power.d.ts.map +1 -0
- package/dist/governance/read-voting-power.js +25 -0
- package/dist/governance/read-voting-power.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/prices/chainlink.d.ts +8 -0
- package/dist/prices/chainlink.d.ts.map +1 -0
- package/dist/prices/chainlink.js +116 -0
- package/dist/prices/chainlink.js.map +1 -0
- package/dist/prices/reserve-api.d.ts +7 -0
- package/dist/prices/reserve-api.d.ts.map +1 -0
- package/dist/prices/reserve-api.js +47 -0
- package/dist/prices/reserve-api.js.map +1 -0
- package/dist/rebalance/build-auction.d.ts +25 -0
- package/dist/rebalance/build-auction.d.ts.map +1 -0
- package/dist/rebalance/build-auction.js +73 -0
- package/dist/rebalance/build-auction.js.map +1 -0
- package/dist/rebalance/build-rebalance.d.ts +22 -0
- package/dist/rebalance/build-rebalance.d.ts.map +1 -0
- package/dist/rebalance/build-rebalance.js +30 -0
- package/dist/rebalance/build-rebalance.js.map +1 -0
- package/dist/rebalance/read-auction.d.ts +4 -0
- package/dist/rebalance/read-auction.d.ts.map +1 -0
- package/dist/rebalance/read-auction.js +31 -0
- package/dist/rebalance/read-auction.js.map +1 -0
- package/dist/rebalance/read-rebalance.d.ts +4 -0
- package/dist/rebalance/read-rebalance.d.ts.map +1 -0
- package/dist/rebalance/read-rebalance.js +50 -0
- package/dist/rebalance/read-rebalance.js.map +1 -0
- package/dist/rebalance/transform.d.ts +22 -0
- package/dist/rebalance/transform.d.ts.map +1 -0
- package/dist/rebalance/transform.js +47 -0
- package/dist/rebalance/transform.js.map +1 -0
- package/dist/revenue/compute-revenue.d.ts +45 -0
- package/dist/revenue/compute-revenue.d.ts.map +1 -0
- package/dist/revenue/compute-revenue.js +216 -0
- package/dist/revenue/compute-revenue.js.map +1 -0
- package/dist/revenue/fetch-revenue.d.ts +8 -0
- package/dist/revenue/fetch-revenue.d.ts.map +1 -0
- package/dist/revenue/fetch-revenue.js +182 -0
- package/dist/revenue/fetch-revenue.js.map +1 -0
- package/dist/revenue/fetch-rsr-burns.d.ts +9 -0
- package/dist/revenue/fetch-rsr-burns.d.ts.map +1 -0
- package/dist/revenue/fetch-rsr-burns.js +106 -0
- package/dist/revenue/fetch-rsr-burns.js.map +1 -0
- package/dist/types.d.ts +546 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/assert.d.ts +2 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +5 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/fetch-token-metadata.d.ts +7 -0
- package/dist/utils/fetch-token-metadata.d.ts.map +1 -0
- package/dist/utils/fetch-token-metadata.js +29 -0
- package/dist/utils/fetch-token-metadata.js.map +1 -0
- package/dist/utils/fetch-with-retry.d.ts +7 -0
- package/dist/utils/fetch-with-retry.d.ts.map +1 -0
- package/dist/utils/fetch-with-retry.js +38 -0
- package/dist/utils/fetch-with-retry.js.map +1 -0
- package/dist/utils/query-subgraph.d.ts +7 -0
- package/dist/utils/query-subgraph.d.ts.map +1 -0
- package/dist/utils/query-subgraph.js +25 -0
- package/dist/utils/query-subgraph.js.map +1 -0
- package/dist/utils/validate-price-control.d.ts +3 -0
- package/dist/utils/validate-price-control.d.ts.map +1 -0
- package/dist/utils/validate-price-control.js +6 -0
- package/dist/utils/validate-price-control.js.map +1 -0
- package/dist/vote-lock/build-vote-lock.d.ts +10 -0
- package/dist/vote-lock/build-vote-lock.d.ts.map +1 -0
- package/dist/vote-lock/build-vote-lock.js +73 -0
- package/dist/vote-lock/build-vote-lock.js.map +1 -0
- package/dist/vote-lock/read-vote-lock.d.ts +7 -0
- package/dist/vote-lock/read-vote-lock.d.ts.map +1 -0
- package/dist/vote-lock/read-vote-lock.js +64 -0
- package/dist/vote-lock/read-vote-lock.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PublicClient } from 'viem';
|
|
2
|
+
import type { PriceRecord } from '../types';
|
|
3
|
+
export declare function readChainlinkPrice(priceClient: PublicClient, feedAddress?: string): Promise<{
|
|
4
|
+
record: PriceRecord;
|
|
5
|
+
isStale: boolean;
|
|
6
|
+
} | null>;
|
|
7
|
+
export declare function backfillChainlinkPrices(priceClient: PublicClient, days: number, batchSize?: number, feedAddress?: string): Promise<PriceRecord[]>;
|
|
8
|
+
//# sourceMappingURL=chainlink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlink.d.ts","sourceRoot":"","sources":["../../src/prices/chainlink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAMxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AA4C3C,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,YAAY,EACzB,WAAW,GAAE,MAA0B,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkB3D;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAW,EACtB,WAAW,GAAE,MAA0B,GACtC,OAAO,CAAC,WAAW,EAAE,CAAC,CAsExB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { CHAINLINK_BTC_USD, CHAINLINK_DECIMALS, STALE_PRICE_THRESHOLD_S, } from '../constants';
|
|
2
|
+
const AGGREGATOR_V3_ABI = [
|
|
3
|
+
{
|
|
4
|
+
name: 'latestRoundData',
|
|
5
|
+
type: 'function',
|
|
6
|
+
stateMutability: 'view',
|
|
7
|
+
inputs: [],
|
|
8
|
+
outputs: [
|
|
9
|
+
{ name: 'roundId', type: 'uint80' },
|
|
10
|
+
{ name: 'answer', type: 'int256' },
|
|
11
|
+
{ name: 'startedAt', type: 'uint256' },
|
|
12
|
+
{ name: 'updatedAt', type: 'uint256' },
|
|
13
|
+
{ name: 'answeredInRound', type: 'uint80' },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'getRoundData',
|
|
18
|
+
type: 'function',
|
|
19
|
+
stateMutability: 'view',
|
|
20
|
+
inputs: [{ name: '_roundId', type: 'uint80' }],
|
|
21
|
+
outputs: [
|
|
22
|
+
{ name: 'roundId', type: 'uint80' },
|
|
23
|
+
{ name: 'answer', type: 'int256' },
|
|
24
|
+
{ name: 'startedAt', type: 'uint256' },
|
|
25
|
+
{ name: 'updatedAt', type: 'uint256' },
|
|
26
|
+
{ name: 'answeredInRound', type: 'uint80' },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
function parseRoundData(result) {
|
|
31
|
+
const [roundId, answer, , updatedAt] = result;
|
|
32
|
+
if (updatedAt === 0n || answer <= 0n)
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
roundId: roundId.toString(),
|
|
36
|
+
priceUsd: Number(answer) / 10 ** CHAINLINK_DECIMALS,
|
|
37
|
+
timestamp: Number(updatedAt),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function readChainlinkPrice(priceClient, feedAddress = CHAINLINK_BTC_USD) {
|
|
41
|
+
if (!feedAddress.startsWith('0x') || feedAddress.length !== 42) {
|
|
42
|
+
throw new Error(`Invalid Chainlink feed address: ${feedAddress}`);
|
|
43
|
+
}
|
|
44
|
+
const result = (await priceClient.readContract({
|
|
45
|
+
address: feedAddress,
|
|
46
|
+
abi: AGGREGATOR_V3_ABI,
|
|
47
|
+
functionName: 'latestRoundData',
|
|
48
|
+
}));
|
|
49
|
+
const record = parseRoundData(result);
|
|
50
|
+
if (!record)
|
|
51
|
+
return null;
|
|
52
|
+
const now = Math.floor(Date.now() / 1000);
|
|
53
|
+
const isStale = now - record.timestamp > STALE_PRICE_THRESHOLD_S;
|
|
54
|
+
return { record, isStale };
|
|
55
|
+
}
|
|
56
|
+
export async function backfillChainlinkPrices(priceClient, days, batchSize = 50, feedAddress = CHAINLINK_BTC_USD) {
|
|
57
|
+
if (days <= 0)
|
|
58
|
+
throw new Error(`backfillChainlinkPrices: days must be > 0, got ${days}`);
|
|
59
|
+
if (batchSize <= 0)
|
|
60
|
+
throw new Error(`backfillChainlinkPrices: batchSize must be > 0, got ${batchSize}`);
|
|
61
|
+
if (!feedAddress.startsWith('0x') || feedAddress.length !== 42) {
|
|
62
|
+
throw new Error(`Invalid Chainlink feed address: ${feedAddress}`);
|
|
63
|
+
}
|
|
64
|
+
const latest = (await priceClient.readContract({
|
|
65
|
+
address: feedAddress,
|
|
66
|
+
abi: AGGREGATOR_V3_ABI,
|
|
67
|
+
functionName: 'latestRoundData',
|
|
68
|
+
}));
|
|
69
|
+
const latestRoundId = latest[0];
|
|
70
|
+
const phaseId = latestRoundId >> 64n;
|
|
71
|
+
const mask = (1n << 64n) - 1n;
|
|
72
|
+
let aggRoundId = latestRoundId & mask;
|
|
73
|
+
const targetTimestamp = Math.floor(Date.now() / 1000) - days * 86400;
|
|
74
|
+
const records = [];
|
|
75
|
+
let consecutiveErrors = 0;
|
|
76
|
+
const latestRecord = parseRoundData(latest);
|
|
77
|
+
if (latestRecord)
|
|
78
|
+
records.push(latestRecord);
|
|
79
|
+
while (aggRoundId > 1n && consecutiveErrors < 5) {
|
|
80
|
+
const currentBatchSize = Math.min(batchSize, Number(aggRoundId));
|
|
81
|
+
const roundIds = [];
|
|
82
|
+
for (let i = 1; i <= currentBatchSize; i++) {
|
|
83
|
+
const rid = (phaseId << 64n) | (aggRoundId - BigInt(i));
|
|
84
|
+
roundIds.push(rid);
|
|
85
|
+
}
|
|
86
|
+
const results = await priceClient.multicall({
|
|
87
|
+
contracts: roundIds.map((rid) => ({
|
|
88
|
+
address: feedAddress,
|
|
89
|
+
abi: AGGREGATOR_V3_ABI,
|
|
90
|
+
functionName: 'getRoundData',
|
|
91
|
+
args: [rid],
|
|
92
|
+
})),
|
|
93
|
+
});
|
|
94
|
+
let reachedTarget = false;
|
|
95
|
+
for (const res of results) {
|
|
96
|
+
if (res.status === 'failure') {
|
|
97
|
+
consecutiveErrors++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
consecutiveErrors = 0;
|
|
101
|
+
const record = parseRoundData(res.result);
|
|
102
|
+
if (!record)
|
|
103
|
+
continue;
|
|
104
|
+
if (record.timestamp < targetTimestamp) {
|
|
105
|
+
reachedTarget = true;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
records.push(record);
|
|
109
|
+
}
|
|
110
|
+
if (reachedTarget)
|
|
111
|
+
break;
|
|
112
|
+
aggRoundId -= BigInt(currentBatchSize);
|
|
113
|
+
}
|
|
114
|
+
return records;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=chainlink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlink.js","sourceRoot":"","sources":["../../src/prices/chainlink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import type { Volatility } from '../types';
|
|
3
|
+
export declare function volatilityToPriceError(volatility: Volatility | string): number;
|
|
4
|
+
export declare function proposalVolatilityToPriceError(volatility: Volatility | string): number;
|
|
5
|
+
export declare function fetchTokenPrices(chainId: number, tokenAddresses: (Address | string)[], baseUrl?: string): Promise<Record<string, number>>;
|
|
6
|
+
export declare function fetchTokenVolatility(chainId: number, baseUrl?: string): Promise<Record<string, Volatility>>;
|
|
7
|
+
//# sourceMappingURL=reserve-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserve-api.d.ts","sourceRoot":"","sources":["../../src/prices/reserve-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAOnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AA6B1C,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAI9E;AAED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,UAAU,GAAG,MAAM,GAC9B,MAAM,CAIR;AAID,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE,EACpC,OAAO,GAAE,MAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqBjC;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAwBrC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { RESERVE_API_BASE_URL, VOLATILITY_TO_PRICE_ERROR, PROPOSAL_VOLATILITY_TO_PRICE_ERROR, } from '../constants';
|
|
2
|
+
import { fetchWithRetry } from '../utils/fetch-with-retry';
|
|
3
|
+
const VALID_VOLATILITIES = new Set(['low', 'medium', 'high', 'degen']);
|
|
4
|
+
// -- Volatility mapping --
|
|
5
|
+
export function volatilityToPriceError(volatility) {
|
|
6
|
+
return (VOLATILITY_TO_PRICE_ERROR[volatility] ?? 0.10);
|
|
7
|
+
}
|
|
8
|
+
export function proposalVolatilityToPriceError(volatility) {
|
|
9
|
+
return (PROPOSAL_VOLATILITY_TO_PRICE_ERROR[volatility] ?? 0.75);
|
|
10
|
+
}
|
|
11
|
+
// -- API functions --
|
|
12
|
+
export async function fetchTokenPrices(chainId, tokenAddresses, baseUrl = RESERVE_API_BASE_URL) {
|
|
13
|
+
const tokens = tokenAddresses.map((a) => a.toLowerCase()).join(',');
|
|
14
|
+
const url = `${baseUrl}/current/prices?chainId=${chainId}&tokens=${tokens}`;
|
|
15
|
+
const response = await fetchWithRetry(url);
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Reserve API prices failed: ${response.status} ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
const data = (await response.json());
|
|
20
|
+
const prices = {};
|
|
21
|
+
for (const item of data) {
|
|
22
|
+
if (item.price > 0) {
|
|
23
|
+
prices[item.address.toLowerCase()] = item.price;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return prices;
|
|
27
|
+
}
|
|
28
|
+
export async function fetchTokenVolatility(chainId, baseUrl = RESERVE_API_BASE_URL) {
|
|
29
|
+
const url = `${baseUrl}/zapper/tokens?chainId=${chainId}`;
|
|
30
|
+
const response = await fetchWithRetry(url);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`Reserve API tokens failed: ${response.status} ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
const data = (await response.json());
|
|
35
|
+
const volatility = {};
|
|
36
|
+
const tokens = Array.isArray(data) ? data : data.tokens;
|
|
37
|
+
for (const token of tokens) {
|
|
38
|
+
// WHY: Default unknown volatility values to 'high' for safety.
|
|
39
|
+
// If the API adds new volatility tiers, we use conservative bounds.
|
|
40
|
+
const vol = VALID_VOLATILITIES.has(token.volatility)
|
|
41
|
+
? token.volatility
|
|
42
|
+
: 'high';
|
|
43
|
+
volatility[token.address.toLowerCase()] = vol;
|
|
44
|
+
}
|
|
45
|
+
return volatility;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=reserve-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserve-api.js","sourceRoot":"","sources":["../../src/prices/reserve-api.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,GACnC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAyB9E,2BAA2B;AAE3B,MAAM,UAAU,sBAAsB,CAAC,UAA+B;IACpE,OAAO,CACL,yBAAyB,CAAC,UAAwB,CAAC,IAAI,IAAI,CAC5D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,UAA+B;IAE/B,OAAO,CACL,kCAAkC,CAAC,UAAwB,CAAC,IAAI,IAAI,CACrE,CAAA;AACH,CAAC;AAED,sBAAsB;AAEtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,cAAoC,EACpC,UAAkB,oBAAoB;IAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnE,MAAM,GAAG,GAAG,GAAG,OAAO,2BAA2B,OAAO,WAAW,MAAM,EAAE,CAAA;IAE3E,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACvE,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAA;IACrD,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,UAAkB,oBAAoB;IAEtC,MAAM,GAAG,GAAG,GAAG,OAAO,0BAA0B,OAAO,EAAE,CAAA;IAEzD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACvE,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAA;IACtD,MAAM,UAAU,GAA+B,EAAE,CAAA;IAEjD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,+DAA+D;QAC/D,oEAAoE;QACpE,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;YAClD,CAAC,CAAE,KAAK,CAAC,UAAyB;YAClC,CAAC,CAAC,MAAM,CAAA;QACV,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAA;IAC/C,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Address, type Hex } from 'viem';
|
|
2
|
+
import type { Rebalance, OpenAuctionArgs, AuctionMetrics, WeightRange } from '@reserve-protocol/dtf-rebalance-lib/dist/types';
|
|
3
|
+
import type { TransactionRequest } from '../types';
|
|
4
|
+
export type ComputeOpenAuctionInput = {
|
|
5
|
+
rebalance: Rebalance;
|
|
6
|
+
supply: bigint;
|
|
7
|
+
initialSupply: bigint;
|
|
8
|
+
initialAssets: bigint[] | undefined;
|
|
9
|
+
assets: bigint[];
|
|
10
|
+
decimals: number[];
|
|
11
|
+
prices: number[];
|
|
12
|
+
priceError: number[];
|
|
13
|
+
finalStageAt: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function computeTargetBasket(weights: WeightRange[], prices: number[], decimals: number[]): bigint[];
|
|
16
|
+
export declare function computeOpenAuctionParams(input: ComputeOpenAuctionInput): {
|
|
17
|
+
args: OpenAuctionArgs;
|
|
18
|
+
metrics: AuctionMetrics;
|
|
19
|
+
};
|
|
20
|
+
export declare function buildOpenAuctionCalldata(folioAddress: Address, args: OpenAuctionArgs): TransactionRequest;
|
|
21
|
+
export declare function buildOpenAuctionUnrestrictedCalldata(folioAddress: Address, nonce: bigint): TransactionRequest;
|
|
22
|
+
export declare function buildCloseAuctionCalldata(folioAddress: Address, auctionId: bigint): TransactionRequest;
|
|
23
|
+
export declare function buildBidCalldata(folioAddress: Address, auctionId: bigint, sellToken: Address, buyToken: Address, sellAmount: bigint, maxBuyAmount: bigint, withCallback?: boolean, data?: Hex): TransactionRequest;
|
|
24
|
+
export type { OpenAuctionArgs, AuctionMetrics, Rebalance, WeightRange };
|
|
25
|
+
//# sourceMappingURL=build-auction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-auction.d.ts","sourceRoot":"","sources":["../../src/rebalance/build-auction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAA;AAOjE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,cAAc,EACd,WAAW,EACZ,MAAM,gDAAgD,CAAA;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IACnC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,EAAE,CAIV;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,uBAAuB,GAC7B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAsBpD;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,OAAO,EACrB,IAAI,EAAE,eAAe,GACpB,kBAAkB,CAepB;AAED,wBAAgB,oCAAoC,CAClD,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,MAAM,GACZ,kBAAkB,CASpB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,OAAO,EACrB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CASpB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,OAAO,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,OAAe,EAC7B,IAAI,GAAE,GAAU,GACf,kBAAkB,CAkBpB;AAED,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { encodeFunctionData } from 'viem';
|
|
2
|
+
import { assert } from '../utils/assert';
|
|
3
|
+
import { getOpenAuction, getTargetBasket, FolioVersion, } from '@reserve-protocol/dtf-rebalance-lib';
|
|
4
|
+
import folioAbi from '../abi/folio';
|
|
5
|
+
export function computeTargetBasket(weights, prices, decimals) {
|
|
6
|
+
// WHY: dtf-rebalance-lib expects decimals as bigint[], SDK accepts number[] for ergonomics
|
|
7
|
+
const decimalsBigInt = decimals.map((d) => BigInt(d));
|
|
8
|
+
return getTargetBasket(weights, prices, decimalsBigInt);
|
|
9
|
+
}
|
|
10
|
+
export function computeOpenAuctionParams(input) {
|
|
11
|
+
const decimalsBigInt = input.decimals.map((d) => BigInt(d));
|
|
12
|
+
// WHY: target basket is derived from current weights + prices, not stored on-chain
|
|
13
|
+
const weights = input.rebalance.tokens.map((t) => t.weight);
|
|
14
|
+
const targetBasket = getTargetBasket(weights, input.prices, decimalsBigInt);
|
|
15
|
+
const [args, metrics] = getOpenAuction(FolioVersion.V5, input.rebalance, input.supply, input.initialSupply, input.initialAssets, targetBasket, input.assets, decimalsBigInt, input.prices, input.priceError, input.finalStageAt);
|
|
16
|
+
return { args, metrics };
|
|
17
|
+
}
|
|
18
|
+
export function buildOpenAuctionCalldata(folioAddress, args) {
|
|
19
|
+
return {
|
|
20
|
+
to: folioAddress,
|
|
21
|
+
data: encodeFunctionData({
|
|
22
|
+
abi: folioAbi,
|
|
23
|
+
functionName: 'openAuction',
|
|
24
|
+
args: [
|
|
25
|
+
args.rebalanceNonce,
|
|
26
|
+
args.tokens,
|
|
27
|
+
args.newWeights,
|
|
28
|
+
args.newPrices,
|
|
29
|
+
args.newLimits,
|
|
30
|
+
],
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function buildOpenAuctionUnrestrictedCalldata(folioAddress, nonce) {
|
|
35
|
+
return {
|
|
36
|
+
to: folioAddress,
|
|
37
|
+
data: encodeFunctionData({
|
|
38
|
+
abi: folioAbi,
|
|
39
|
+
functionName: 'openAuctionUnrestricted',
|
|
40
|
+
args: [nonce],
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function buildCloseAuctionCalldata(folioAddress, auctionId) {
|
|
45
|
+
return {
|
|
46
|
+
to: folioAddress,
|
|
47
|
+
data: encodeFunctionData({
|
|
48
|
+
abi: folioAbi,
|
|
49
|
+
functionName: 'closeAuction',
|
|
50
|
+
args: [auctionId],
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function buildBidCalldata(folioAddress, auctionId, sellToken, buyToken, sellAmount, maxBuyAmount, withCallback = false, data = '0x') {
|
|
55
|
+
assert(sellAmount > 0n, 'sellAmount must be greater than 0');
|
|
56
|
+
return {
|
|
57
|
+
to: folioAddress,
|
|
58
|
+
data: encodeFunctionData({
|
|
59
|
+
abi: folioAbi,
|
|
60
|
+
functionName: 'bid',
|
|
61
|
+
args: [
|
|
62
|
+
auctionId,
|
|
63
|
+
sellToken,
|
|
64
|
+
buyToken,
|
|
65
|
+
sellAmount,
|
|
66
|
+
maxBuyAmount,
|
|
67
|
+
withCallback,
|
|
68
|
+
data,
|
|
69
|
+
],
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=build-auction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-auction.js","sourceRoot":"","sources":["../../src/rebalance/build-auction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Address } from 'viem';
|
|
2
|
+
import { FolioVersion } from '@reserve-protocol/dtf-rebalance-lib';
|
|
3
|
+
import type { StartRebalanceArgsPartial } from '@reserve-protocol/dtf-rebalance-lib/dist/types';
|
|
4
|
+
import type { TransactionRequest } from '../types';
|
|
5
|
+
export type ComputeStartRebalanceInput = {
|
|
6
|
+
supply: bigint;
|
|
7
|
+
tokens: string[];
|
|
8
|
+
assets: bigint[];
|
|
9
|
+
decimals: number[];
|
|
10
|
+
targetBasket: bigint[];
|
|
11
|
+
prices: number[];
|
|
12
|
+
priceError: number[];
|
|
13
|
+
maxAuctionSizes: number[];
|
|
14
|
+
weightControl: boolean;
|
|
15
|
+
deferWeights: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function computeStartRebalanceParams(input: ComputeStartRebalanceInput): StartRebalanceArgsPartial;
|
|
18
|
+
export declare function buildStartRebalanceCalldata(folioAddress: Address, params: StartRebalanceArgsPartial, launcherWindow: bigint, ttl: bigint): TransactionRequest;
|
|
19
|
+
export declare function buildEndRebalanceCalldata(folioAddress: Address): TransactionRequest;
|
|
20
|
+
export { FolioVersion };
|
|
21
|
+
export type { StartRebalanceArgsPartial };
|
|
22
|
+
//# sourceMappingURL=build-rebalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rebalance.d.ts","sourceRoot":"","sources":["../../src/rebalance/build-rebalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AACvD,OAAO,EAEL,YAAY,EACb,MAAM,qCAAqC,CAAA;AAC5C,OAAO,KAAK,EACV,yBAAyB,EAC1B,MAAM,gDAAgD,CAAA;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,0BAA0B,GAChC,yBAAyB,CAiB3B;AAED,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,yBAAyB,EACjC,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,GACV,kBAAkB,CAUpB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,OAAO,GACpB,kBAAkB,CAQpB;AAED,OAAO,EAAE,YAAY,EAAE,CAAA;AACvB,YAAY,EAAE,yBAAyB,EAAE,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { encodeFunctionData } from 'viem';
|
|
2
|
+
import { getStartRebalance, FolioVersion, } from '@reserve-protocol/dtf-rebalance-lib';
|
|
3
|
+
import folioAbi from '../abi/folio';
|
|
4
|
+
export function computeStartRebalanceParams(input) {
|
|
5
|
+
// WHY: dtf-rebalance-lib expects decimals as bigint[], not number[]
|
|
6
|
+
const decimalsBigInt = input.decimals.map((d) => BigInt(d));
|
|
7
|
+
return getStartRebalance(FolioVersion.V5, input.supply, input.tokens, input.assets, decimalsBigInt, input.targetBasket, input.prices, input.priceError, input.maxAuctionSizes, input.weightControl, input.deferWeights);
|
|
8
|
+
}
|
|
9
|
+
export function buildStartRebalanceCalldata(folioAddress, params, launcherWindow, ttl) {
|
|
10
|
+
return {
|
|
11
|
+
to: folioAddress,
|
|
12
|
+
data: encodeFunctionData({
|
|
13
|
+
abi: folioAbi,
|
|
14
|
+
functionName: 'startRebalance',
|
|
15
|
+
// WHY: rebalance-lib returns token as string, ABI expects `0x${string}`
|
|
16
|
+
args: [params.tokens, params.limits, launcherWindow, ttl],
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function buildEndRebalanceCalldata(folioAddress) {
|
|
21
|
+
return {
|
|
22
|
+
to: folioAddress,
|
|
23
|
+
data: encodeFunctionData({
|
|
24
|
+
abi: folioAbi,
|
|
25
|
+
functionName: 'endRebalance',
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export { FolioVersion };
|
|
30
|
+
//# sourceMappingURL=build-rebalance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-rebalance.js","sourceRoot":"","sources":["../../src/rebalance/build-rebalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,MAAM,CAAA;AACvD,OAAO,EACL,iBAAiB,EACjB,YAAY,GACb,MAAM,qCAAqC,CAAA;AAI5C,OAAO,QAAQ,MAAM,cAAc,CAAA;AAgBnC,MAAM,UAAU,2BAA2B,CACzC,KAAiC;IAEjC,oEAAoE;IACpE,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAE3D,OAAO,iBAAiB,CACtB,YAAY,CAAC,EAAE,EACf,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,EACZ,cAAc,EACd,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACU,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAAqB,EACrB,MAAiC,EACjC,cAAsB,EACtB,GAAW;IAEX,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,gBAAgB;YAC9B,wEAAwE;YACxE,IAAI,EAAE,CAAC,MAAM,CAAC,MAAgL,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC;SACpO,CAAC;KACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,YAAqB;IAErB,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,cAAc;SAC7B,CAAC;KACH,CAAA;AACH,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-auction.d.ts","sourceRoot":"","sources":["../../src/rebalance/read-auction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA+B7B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import folioAbi from '../abi/folio';
|
|
2
|
+
export async function readActiveAuction(publicClient, folioAddress) {
|
|
3
|
+
const nextAuctionId = (await publicClient.readContract({
|
|
4
|
+
address: folioAddress,
|
|
5
|
+
abi: folioAbi,
|
|
6
|
+
functionName: 'nextAuctionId',
|
|
7
|
+
}));
|
|
8
|
+
if (nextAuctionId === 0n)
|
|
9
|
+
return null;
|
|
10
|
+
const lastAuctionId = nextAuctionId - 1n;
|
|
11
|
+
const auction = (await publicClient.readContract({
|
|
12
|
+
address: folioAddress,
|
|
13
|
+
abi: folioAbi,
|
|
14
|
+
functionName: 'auctions',
|
|
15
|
+
args: [lastAuctionId],
|
|
16
|
+
}));
|
|
17
|
+
const [rebalanceNonce, startTime, endTime] = auction;
|
|
18
|
+
// WHY: Uses client clock (Date.now()), not block.timestamp. Clock skew on the user's machine
|
|
19
|
+
// could make isActive wrong by seconds. An extra getBlock() call would be canonical but adds
|
|
20
|
+
// latency. Acceptable tradeoff for a display-only field. Same pattern as readRebalanceState.
|
|
21
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
22
|
+
const isActive = now < endTime;
|
|
23
|
+
return {
|
|
24
|
+
auctionId: lastAuctionId,
|
|
25
|
+
rebalanceNonce,
|
|
26
|
+
startTime,
|
|
27
|
+
endTime,
|
|
28
|
+
isActive,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=read-auction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-auction.js","sourceRoot":"","sources":["../../src/rebalance/read-auction.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,cAAc,CAAA;AAGnC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAA0B,EAC1B,YAAqB;IAErB,MAAM,aAAa,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;QACrD,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,QAAQ;QACb,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAW,CAAA;IAEb,IAAI,aAAa,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAErC,MAAM,aAAa,GAAG,aAAa,GAAG,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;QAC/C,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,QAAQ;QACb,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,aAAa,CAAC;KACtB,CAAC,CAA6B,CAAA;IAE/B,MAAM,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IACpD,6FAA6F;IAC7F,6FAA6F;IAC7F,6FAA6F;IAC7F,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,CAAA;IAE9B,OAAO;QACL,SAAS,EAAE,aAAa;QACxB,cAAc;QACd,SAAS;QACT,OAAO;QACP,QAAQ;KACT,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Address, PublicClient } from 'viem';
|
|
2
|
+
import type { RebalanceInfo } from '../types';
|
|
3
|
+
export declare function readRebalanceState(publicClient: PublicClient, folioAddress: Address): Promise<RebalanceInfo | null>;
|
|
4
|
+
//# sourceMappingURL=read-rebalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-rebalance.d.ts","sourceRoot":"","sources":["../../src/rebalance/read-rebalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAGjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAG7C,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6D/B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ContractFunctionExecutionError } from 'viem';
|
|
2
|
+
import folioAbi from '../abi/folio';
|
|
3
|
+
import { validatePriceControl } from '../utils/validate-price-control';
|
|
4
|
+
export async function readRebalanceState(publicClient, folioAddress) {
|
|
5
|
+
let raw;
|
|
6
|
+
try {
|
|
7
|
+
raw = (await publicClient.readContract({
|
|
8
|
+
address: folioAddress,
|
|
9
|
+
abi: folioAbi,
|
|
10
|
+
functionName: 'getRebalance',
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
// WHY: getRebalance() reverts when there's no active rebalance (nonce 0, never started).
|
|
15
|
+
// Only swallow contract reverts — rethrow network/transport errors.
|
|
16
|
+
if (err instanceof ContractFunctionExecutionError)
|
|
17
|
+
return null;
|
|
18
|
+
throw err;
|
|
19
|
+
}
|
|
20
|
+
const [nonce, priceControl, tokenParams, limits, timestamps, bidsEnabled] = raw;
|
|
21
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
22
|
+
// WHY: Check availableUntil, not nonce. Nonce 0 can be an active rebalance.
|
|
23
|
+
const isActive = timestamps.availableUntil > now;
|
|
24
|
+
const isInLauncherWindow = isActive && now < timestamps.restrictedUntil;
|
|
25
|
+
const isInCommunityWindow = isActive && now >= timestamps.restrictedUntil;
|
|
26
|
+
const isExpired = timestamps.availableUntil > 0n && now >= timestamps.availableUntil;
|
|
27
|
+
return {
|
|
28
|
+
nonce,
|
|
29
|
+
priceControl: validatePriceControl(priceControl),
|
|
30
|
+
bidsEnabled,
|
|
31
|
+
isActive,
|
|
32
|
+
isInLauncherWindow,
|
|
33
|
+
isInCommunityWindow,
|
|
34
|
+
isExpired,
|
|
35
|
+
tokens: tokenParams.map((t) => ({
|
|
36
|
+
address: t.token,
|
|
37
|
+
weight: { low: t.weight.low, spot: t.weight.spot, high: t.weight.high },
|
|
38
|
+
price: { low: t.price.low, high: t.price.high },
|
|
39
|
+
maxAuctionSize: t.maxAuctionSize,
|
|
40
|
+
inRebalance: t.inRebalance,
|
|
41
|
+
})),
|
|
42
|
+
limits: { low: limits.low, spot: limits.spot, high: limits.high },
|
|
43
|
+
timestamps: {
|
|
44
|
+
startedAt: timestamps.startedAt,
|
|
45
|
+
restrictedUntil: timestamps.restrictedUntil,
|
|
46
|
+
availableUntil: timestamps.availableUntil,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=read-rebalance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-rebalance.js","sourceRoot":"","sources":["../../src/rebalance/read-rebalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,MAAM,CAAA;AACrD,OAAO,QAAQ,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,YAAqB;IAErB,IAAI,GAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;YACrC,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAuB,CAAA;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yFAAyF;QACzF,oEAAoE;QACpE,IAAI,GAAG,YAAY,8BAA8B;YAAE,OAAO,IAAI,CAAA;QAC9D,MAAM,GAAG,CAAA;IACX,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,GACvE,GAaC,CAAA;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACjD,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,GAAG,GAAG,CAAA;IAChD,MAAM,kBAAkB,GAAG,QAAQ,IAAI,GAAG,GAAG,UAAU,CAAC,eAAe,CAAA;IACvE,MAAM,mBAAmB,GACvB,QAAQ,IAAI,GAAG,IAAI,UAAU,CAAC,eAAe,CAAA;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,GAAG,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,cAAc,CAAA;IAEpF,OAAO;QACL,KAAK;QACL,YAAY,EAAE,oBAAoB,CAAC,YAAY,CAAC;QAChD,WAAW;QACX,QAAQ;QACR,kBAAkB;QAClB,mBAAmB;QACnB,SAAS;QACT,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE,CAAC,CAAC,KAAK;YAChB,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACvE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YAC/C,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;QACH,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;QACjE,UAAU,EAAE;YACV,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,eAAe,EAAE,UAAU,CAAC,eAAe;YAC3C,cAAc,EAAE,UAAU,CAAC,cAAc;SAC1C;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Address } from 'viem';
|
|
2
|
+
import type { Rebalance } from '@reserve-protocol/dtf-rebalance-lib/dist/types';
|
|
3
|
+
/**
|
|
4
|
+
* Transform raw getRebalance() V5 return value into the Rebalance type
|
|
5
|
+
* expected by dtf-rebalance-lib.
|
|
6
|
+
*/
|
|
7
|
+
export declare function transformV5Rebalance(raw: readonly unknown[]): Rebalance;
|
|
8
|
+
/**
|
|
9
|
+
* Map token addresses to balances for easy lookup.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mapAssets(addresses: readonly Address[], balances: readonly bigint[]): Map<string, bigint>;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate USD price per whole token from on-chain D27 price range.
|
|
14
|
+
* WHY: On-chain prices are D27{USD/smallestUnit}. formatUnits(x, 36) = x / 10^36.
|
|
15
|
+
* This gives USD per (10^9 smallest units). Multiplying by 10^tokenDecimals converts
|
|
16
|
+
* to USD per whole token. Net effect: price = x / 10^(36 - tokenDecimals).
|
|
17
|
+
*/
|
|
18
|
+
export declare function calculatePriceFromRange(priceRange: {
|
|
19
|
+
low: bigint;
|
|
20
|
+
high: bigint;
|
|
21
|
+
}, tokenDecimals: number): number;
|
|
22
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/rebalance/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AAChD,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,gDAAgD,CAAA;AAEvD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,SAAS,OAAO,EAAE,GACtB,SAAS,CAiCX;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,SAAS,OAAO,EAAE,EAC7B,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMrB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACzC,aAAa,EAAE,MAAM,GACpB,MAAM,CAIR"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { formatUnits } from 'viem';
|
|
2
|
+
/**
|
|
3
|
+
* Transform raw getRebalance() V5 return value into the Rebalance type
|
|
4
|
+
* expected by dtf-rebalance-lib.
|
|
5
|
+
*/
|
|
6
|
+
export function transformV5Rebalance(raw) {
|
|
7
|
+
const [nonce, priceControl, tokenParams, limits, timestamps] = raw;
|
|
8
|
+
return {
|
|
9
|
+
nonce,
|
|
10
|
+
priceControl: priceControl,
|
|
11
|
+
tokens: tokenParams.map((t) => ({
|
|
12
|
+
token: t.token,
|
|
13
|
+
weight: { low: t.weight.low, spot: t.weight.spot, high: t.weight.high },
|
|
14
|
+
price: { low: t.price.low, high: t.price.high },
|
|
15
|
+
maxAuctionSize: t.maxAuctionSize,
|
|
16
|
+
inRebalance: t.inRebalance,
|
|
17
|
+
})),
|
|
18
|
+
limits: { low: limits.low, spot: limits.spot, high: limits.high },
|
|
19
|
+
timestamps: {
|
|
20
|
+
startedAt: timestamps.startedAt,
|
|
21
|
+
restrictedUntil: timestamps.restrictedUntil,
|
|
22
|
+
availableUntil: timestamps.availableUntil,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Map token addresses to balances for easy lookup.
|
|
28
|
+
*/
|
|
29
|
+
export function mapAssets(addresses, balances) {
|
|
30
|
+
const map = new Map();
|
|
31
|
+
for (let i = 0; i < addresses.length; i++) {
|
|
32
|
+
map.set(addresses[i].toLowerCase(), balances[i]);
|
|
33
|
+
}
|
|
34
|
+
return map;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calculate USD price per whole token from on-chain D27 price range.
|
|
38
|
+
* WHY: On-chain prices are D27{USD/smallestUnit}. formatUnits(x, 36) = x / 10^36.
|
|
39
|
+
* This gives USD per (10^9 smallest units). Multiplying by 10^tokenDecimals converts
|
|
40
|
+
* to USD per whole token. Net effect: price = x / 10^(36 - tokenDecimals).
|
|
41
|
+
*/
|
|
42
|
+
export function calculatePriceFromRange(priceRange, tokenDecimals) {
|
|
43
|
+
const lowPrice = Number(formatUnits(priceRange.low, 36));
|
|
44
|
+
const highPrice = Number(formatUnits(priceRange.high, 36));
|
|
45
|
+
return Math.sqrt(lowPrice * highPrice) * Math.pow(10, tokenDecimals);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/rebalance/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgB,MAAM,MAAM,CAAA;AAUhD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAuB;IAEvB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,GAa9D,CAAA;IAED,OAAO;QACL,KAAK;QACL,YAAY,EAAE,YAAuC;QACrD,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,CAAC,KAAe;YACxB,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACvE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YAC/C,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;QACH,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;QACjE,UAAU,EAAE;YACV,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,eAAe,EAAE,UAAU,CAAC,eAAe;YAC3C,cAAc,EAAE,UAAU,CAAC,cAAc;SAC1C;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,SAA6B,EAC7B,QAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAyC,EACzC,aAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;AACtE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { BurnAccuracy, DtfRevenueRaw, DtfRevenueUsd, EcosystemRevenue, FeeMetrics, PriceRecord, RsrBurnData, RsrBurnEvent, RsrBurnProjection } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Convert raw revenue (BigDecimal in DTF shares) to USD.
|
|
4
|
+
* WHY: Subgraph BigDecimal is in wei-scale (e.g. "6277028174388650175775" for 6277 shares).
|
|
5
|
+
* Must divide by 10^decimals before multiplying by price.
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeRevenueUsd(raw: DtfRevenueRaw, price: number): DtfRevenueUsd;
|
|
8
|
+
export declare function aggregateEcosystemRevenue(items: DtfRevenueUsd[]): EcosystemRevenue;
|
|
9
|
+
/**
|
|
10
|
+
* Compute weighted (by TVL) and simple average fee metrics.
|
|
11
|
+
* Fees are D18 in subgraph — divide by 1e18 for decimal.
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeFeeMetrics(raws: DtfRevenueRaw[], prices: Record<string, number>): FeeMetrics;
|
|
14
|
+
/**
|
|
15
|
+
* Compute RSR burn projection from actual burn history + theoretical model.
|
|
16
|
+
*
|
|
17
|
+
* WHY: The theoretical "5% of TVL" formula overestimates by ~5x.
|
|
18
|
+
* Trailing average from actual monthly snapshots is the primary signal.
|
|
19
|
+
* Theoretical is kept as "Protocol Target" for context.
|
|
20
|
+
*/
|
|
21
|
+
export declare function computeRsrBurnProjection(burnData: RsrBurnData, rsrPrice: number, totalTvl: number): RsrBurnProjection;
|
|
22
|
+
/**
|
|
23
|
+
* Compare latest month's burn vs trailing average.
|
|
24
|
+
* WHY: "Accuracy" against a broken theoretical was meaningless.
|
|
25
|
+
* Comparing latest vs trailing shows whether burns are accelerating or decelerating.
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeBurnAccuracy(projection: RsrBurnProjection, burnData: RsrBurnData, rsrPrice: number): BurnAccuracy;
|
|
28
|
+
/**
|
|
29
|
+
* Calculate total RSR locked in DTF stTokens.
|
|
30
|
+
* Checks each DTF's stToken.underlying.address against known RSR addresses.
|
|
31
|
+
*/
|
|
32
|
+
export declare function computeLockedRsr(raws: DtfRevenueRaw[], rsrAddresses: string[]): number;
|
|
33
|
+
/**
|
|
34
|
+
* Binary search for the closest price record to a given timestamp.
|
|
35
|
+
* Expects prices sorted by timestamp ascending.
|
|
36
|
+
* Returns 0 if empty.
|
|
37
|
+
*/
|
|
38
|
+
export declare function nearestPrice(timestamp: number, prices: PriceRecord[]): number;
|
|
39
|
+
/**
|
|
40
|
+
* Compute total historical USD value of burns using time-matched prices.
|
|
41
|
+
*/
|
|
42
|
+
export declare function computeHistoricalBurnTotals(burns: RsrBurnEvent[], prices: PriceRecord[]): {
|
|
43
|
+
totalBurnedUsdHistorical: number;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=compute-revenue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-revenue.d.ts","sourceRoot":"","sources":["../../src/revenue/compute-revenue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,iBAAiB,EAClB,MAAM,UAAU,CAAA;AAEjB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,GACZ,aAAa,CAaf;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EAAE,GACrB,gBAAgB,CA0BlB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EAAE,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,UAAU,CA+BZ;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAiDnB;AAUD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,GACf,YAAY,CAoBd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CAiBR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EAAE,GACpB,MAAM,CAsBR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,wBAAwB,EAAE,MAAM,CAAA;CAAE,CAUtC"}
|