@reserve-protocol/dtf-sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/abi/distributor.d.ts +21 -0
  2. package/dist/abi/distributor.d.ts.map +1 -0
  3. package/dist/abi/facade-read.d.ts +140 -0
  4. package/dist/abi/facade-read.d.ts.map +1 -0
  5. package/dist/abi/main.d.ts +102 -0
  6. package/dist/abi/main.d.ts.map +1 -0
  7. package/dist/abi/st-rsr.d.ts +104 -0
  8. package/dist/abi/st-rsr.d.ts.map +1 -0
  9. package/dist/ccip-9vnc6854.js +14 -0
  10. package/dist/ccip-tn8s4j8m.js +14 -0
  11. package/dist/constants.d.ts +2 -0
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/index-aarnj29d.js +2889 -0
  14. package/dist/index-azrx1hqn.js +6105 -0
  15. package/dist/index-qp8fkhx7.js +2109 -0
  16. package/dist/index-sdksp5px.js +30 -0
  17. package/dist/index-tdmavmz7.js +6097 -0
  18. package/dist/index-wjqsw4fc.js +357 -0
  19. package/dist/index.d.ts +14 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +18227 -73
  22. package/dist/secp256k1-53bx94th.js +16 -0
  23. package/dist/types.d.ts +51 -0
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/utils/query-subgraph.d.ts +2 -1
  26. package/dist/utils/query-subgraph.d.ts.map +1 -1
  27. package/dist/yield-dtf/detect-dtf-type.d.ts +13 -0
  28. package/dist/yield-dtf/detect-dtf-type.d.ts.map +1 -0
  29. package/dist/yield-dtf/issue.d.ts +22 -0
  30. package/dist/yield-dtf/issue.d.ts.map +1 -0
  31. package/dist/yield-dtf/read-backing.d.ts +15 -0
  32. package/dist/yield-dtf/read-backing.d.ts.map +1 -0
  33. package/dist/yield-dtf/read-basket.d.ts +10 -0
  34. package/dist/yield-dtf/read-basket.d.ts.map +1 -0
  35. package/dist/yield-dtf/read-components.d.ts +8 -0
  36. package/dist/yield-dtf/read-components.d.ts.map +1 -0
  37. package/dist/yield-dtf/read-config.d.ts +8 -0
  38. package/dist/yield-dtf/read-config.d.ts.map +1 -0
  39. package/dist/yield-dtf/read-distribution.d.ts +8 -0
  40. package/dist/yield-dtf/read-distribution.d.ts.map +1 -0
  41. package/dist/yield-dtf/read-st-rsr.d.ts +7 -0
  42. package/dist/yield-dtf/read-st-rsr.d.ts.map +1 -0
  43. package/package.json +5 -3
  44. package/dist/abi/deployer.js +0 -178
  45. package/dist/abi/deployer.js.map +0 -1
  46. package/dist/abi/erc20.js +0 -58
  47. package/dist/abi/erc20.js.map +0 -1
  48. package/dist/abi/folio.js +0 -1430
  49. package/dist/abi/folio.js.map +0 -1
  50. package/dist/abi/governance-deployer.js +0 -77
  51. package/dist/abi/governance-deployer.js.map +0 -1
  52. package/dist/abi/governor.js +0 -1661
  53. package/dist/abi/governor.js.map +0 -1
  54. package/dist/abi/proxy-admin.js +0 -42
  55. package/dist/abi/proxy-admin.js.map +0 -1
  56. package/dist/abi/spells.js +0 -61
  57. package/dist/abi/spells.js.map +0 -1
  58. package/dist/abi/timelock.js +0 -469
  59. package/dist/abi/timelock.js.map +0 -1
  60. package/dist/abi/vote-lock.js +0 -116
  61. package/dist/abi/vote-lock.js.map +0 -1
  62. package/dist/clients/chains.js +0 -23
  63. package/dist/clients/chains.js.map +0 -1
  64. package/dist/clients/create-clients.js +0 -32
  65. package/dist/clients/create-clients.js.map +0 -1
  66. package/dist/clients/create-price-client.js +0 -15
  67. package/dist/clients/create-price-client.js.map +0 -1
  68. package/dist/constants.js +0 -100
  69. package/dist/constants.js.map +0 -1
  70. package/dist/deploy/build-deploy.js +0 -84
  71. package/dist/deploy/build-deploy.js.map +0 -1
  72. package/dist/deploy/extract-deployed-address.js +0 -36
  73. package/dist/deploy/extract-deployed-address.js.map +0 -1
  74. package/dist/deploy/permissionless-defaults.js +0 -76
  75. package/dist/deploy/permissionless-defaults.js.map +0 -1
  76. package/dist/deploy/token-registry.js +0 -68
  77. package/dist/deploy/token-registry.js.map +0 -1
  78. package/dist/deploy/zap-deploy.js +0 -50
  79. package/dist/deploy/zap-deploy.js.map +0 -1
  80. package/dist/dtf/fees.js +0 -103
  81. package/dist/dtf/fees.js.map +0 -1
  82. package/dist/dtf/fetch-analytics.js +0 -63
  83. package/dist/dtf/fetch-analytics.js.map +0 -1
  84. package/dist/dtf/fetch-basket.js +0 -32
  85. package/dist/dtf/fetch-basket.js.map +0 -1
  86. package/dist/dtf/fetch-discover.js +0 -17
  87. package/dist/dtf/fetch-discover.js.map +0 -1
  88. package/dist/dtf/fetch-dtf.js +0 -39
  89. package/dist/dtf/fetch-dtf.js.map +0 -1
  90. package/dist/dtf/mint.js +0 -82
  91. package/dist/dtf/mint.js.map +0 -1
  92. package/dist/dtf/read-basket.js +0 -20
  93. package/dist/dtf/read-basket.js.map +0 -1
  94. package/dist/dtf/read-config.js +0 -80
  95. package/dist/dtf/read-config.js.map +0 -1
  96. package/dist/dtf/read-dtf.js +0 -32
  97. package/dist/dtf/read-dtf.js.map +0 -1
  98. package/dist/dtf/read-rebalance-control.js +0 -14
  99. package/dist/dtf/read-rebalance-control.js.map +0 -1
  100. package/dist/dtf/read-roles.js +0 -29
  101. package/dist/dtf/read-roles.js.map +0 -1
  102. package/dist/dtf/read-version.js +0 -9
  103. package/dist/dtf/read-version.js.map +0 -1
  104. package/dist/dtf/redeem.js +0 -27
  105. package/dist/dtf/redeem.js.map +0 -1
  106. package/dist/governance/build-proposal.js +0 -78
  107. package/dist/governance/build-proposal.js.map +0 -1
  108. package/dist/governance/build-settings-calldata.js +0 -145
  109. package/dist/governance/build-settings-calldata.js.map +0 -1
  110. package/dist/governance/compute-proposal-state.js +0 -87
  111. package/dist/governance/compute-proposal-state.js.map +0 -1
  112. package/dist/governance/decode-proposal.js +0 -164
  113. package/dist/governance/decode-proposal.js.map +0 -1
  114. package/dist/governance/fetch-proposals.js +0 -173
  115. package/dist/governance/fetch-proposals.js.map +0 -1
  116. package/dist/governance/read-governance.js +0 -97
  117. package/dist/governance/read-governance.js.map +0 -1
  118. package/dist/governance/read-proposals.js +0 -104
  119. package/dist/governance/read-proposals.js.map +0 -1
  120. package/dist/governance/read-voting-power.js +0 -25
  121. package/dist/governance/read-voting-power.js.map +0 -1
  122. package/dist/index.js.map +0 -1
  123. package/dist/prices/chainlink.js +0 -116
  124. package/dist/prices/chainlink.js.map +0 -1
  125. package/dist/prices/reserve-api.js +0 -47
  126. package/dist/prices/reserve-api.js.map +0 -1
  127. package/dist/rebalance/build-auction.js +0 -73
  128. package/dist/rebalance/build-auction.js.map +0 -1
  129. package/dist/rebalance/build-rebalance.js +0 -30
  130. package/dist/rebalance/build-rebalance.js.map +0 -1
  131. package/dist/rebalance/read-auction.js +0 -31
  132. package/dist/rebalance/read-auction.js.map +0 -1
  133. package/dist/rebalance/read-rebalance.js +0 -50
  134. package/dist/rebalance/read-rebalance.js.map +0 -1
  135. package/dist/rebalance/transform.js +0 -47
  136. package/dist/rebalance/transform.js.map +0 -1
  137. package/dist/revenue/compute-revenue.js +0 -216
  138. package/dist/revenue/compute-revenue.js.map +0 -1
  139. package/dist/revenue/fetch-revenue.js +0 -182
  140. package/dist/revenue/fetch-revenue.js.map +0 -1
  141. package/dist/revenue/fetch-rsr-burns.js +0 -106
  142. package/dist/revenue/fetch-rsr-burns.js.map +0 -1
  143. package/dist/types.js +0 -2
  144. package/dist/types.js.map +0 -1
  145. package/dist/utils/assert.js +0 -5
  146. package/dist/utils/assert.js.map +0 -1
  147. package/dist/utils/fetch-token-metadata.js +0 -29
  148. package/dist/utils/fetch-token-metadata.js.map +0 -1
  149. package/dist/utils/fetch-with-retry.js +0 -38
  150. package/dist/utils/fetch-with-retry.js.map +0 -1
  151. package/dist/utils/query-subgraph.js +0 -25
  152. package/dist/utils/query-subgraph.js.map +0 -1
  153. package/dist/utils/validate-price-control.js +0 -6
  154. package/dist/utils/validate-price-control.js.map +0 -1
  155. package/dist/vote-lock/build-vote-lock.js +0 -73
  156. package/dist/vote-lock/build-vote-lock.js.map +0 -1
  157. package/dist/vote-lock/read-vote-lock.js +0 -64
  158. package/dist/vote-lock/read-vote-lock.js.map +0 -1
@@ -1,73 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-auction.js","sourceRoot":"","sources":["../../src/rebalance/build-auction.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,31 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,50 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,47 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,216 +0,0 @@
1
- /**
2
- * Convert raw revenue (BigDecimal in DTF shares) to USD.
3
- * WHY: Subgraph BigDecimal is in wei-scale (e.g. "6277028174388650175775" for 6277 shares).
4
- * Must divide by 10^decimals before multiplying by price.
5
- */
6
- export function computeRevenueUsd(raw, price) {
7
- const decimals = raw.token.decimals;
8
- const divisor = 10 ** decimals;
9
- return {
10
- address: raw.address,
11
- chainId: raw.chainId,
12
- symbol: raw.token.symbol,
13
- totalUsd: (Number(raw.totalRevenue) / divisor) * price,
14
- protocolUsd: (Number(raw.protocolRevenue) / divisor) * price,
15
- governanceUsd: (Number(raw.governanceRevenue) / divisor) * price,
16
- externalUsd: (Number(raw.externalRevenue) / divisor) * price,
17
- };
18
- }
19
- export function aggregateEcosystemRevenue(items) {
20
- let totalUsd = 0;
21
- let protocolUsd = 0;
22
- let governanceUsd = 0;
23
- let externalUsd = 0;
24
- for (const item of items) {
25
- totalUsd += item.totalUsd;
26
- protocolUsd += item.protocolUsd;
27
- governanceUsd += item.governanceUsd;
28
- externalUsd += item.externalUsd;
29
- }
30
- const sorted = [...items].sort((a, b) => b.totalUsd - a.totalUsd);
31
- return {
32
- totalUsd,
33
- protocolUsd,
34
- governanceUsd,
35
- externalUsd,
36
- protocolPercent: totalUsd > 0 ? (protocolUsd / totalUsd) * 100 : 0,
37
- governancePercent: totalUsd > 0 ? (governanceUsd / totalUsd) * 100 : 0,
38
- externalPercent: totalUsd > 0 ? (externalUsd / totalUsd) * 100 : 0,
39
- dtfCount: items.length,
40
- topDtfs: sorted,
41
- };
42
- }
43
- /**
44
- * Compute weighted (by TVL) and simple average fee metrics.
45
- * Fees are D18 in subgraph — divide by 1e18 for decimal.
46
- */
47
- export function computeFeeMetrics(raws, prices) {
48
- let totalTvl = 0;
49
- let weightedMinting = 0;
50
- let weightedTvl = 0;
51
- let sumMinting = 0;
52
- let sumTvl = 0;
53
- for (const raw of raws) {
54
- const price = prices[raw.address.toLowerCase()] ?? 0;
55
- // WHY: totalSupply is wei-scale BigDecimal from subgraph, must divide by 10^decimals
56
- const supply = Number(raw.token.totalSupply) / 10 ** raw.token.decimals;
57
- const tvl = supply * price;
58
- const mintFee = Number(raw.mintingFee) / 1e18;
59
- const tvlFee = Number(raw.annualizedTvlFee) / 1e18;
60
- totalTvl += tvl;
61
- weightedMinting += mintFee * tvl;
62
- weightedTvl += tvlFee * tvl;
63
- sumMinting += mintFee;
64
- sumTvl += tvlFee;
65
- }
66
- const count = raws.length || 1;
67
- return {
68
- weightedMintingFee: totalTvl > 0 ? weightedMinting / totalTvl : 0,
69
- weightedTvlFee: totalTvl > 0 ? weightedTvl / totalTvl : 0,
70
- averageMintingFee: sumMinting / count,
71
- averageTvlFee: sumTvl / count,
72
- };
73
- }
74
- /**
75
- * Compute RSR burn projection from actual burn history + theoretical model.
76
- *
77
- * WHY: The theoretical "5% of TVL" formula overestimates by ~5x.
78
- * Trailing average from actual monthly snapshots is the primary signal.
79
- * Theoretical is kept as "Protocol Target" for context.
80
- */
81
- export function computeRsrBurnProjection(burnData, rsrPrice, totalTvl) {
82
- // -- Trailing average from actual monthly snapshots --
83
- // WHY: Use up to 3 months for a stable average that still responds to trends
84
- const snapshots = burnData.monthlySnapshots.slice(0, 3);
85
- const monthsUsed = snapshots.length;
86
- let trailingMonthlyRsr = 0;
87
- if (monthsUsed > 0) {
88
- const totalRsr = snapshots.reduce((sum, s) => sum + Number(s.monthlyBurnAmount) / 1e18, 0);
89
- trailingMonthlyRsr = totalRsr / monthsUsed;
90
- }
91
- const trailingMonthlyUsd = trailingMonthlyRsr * rsrPrice;
92
- const trailingAnnualRsr = trailingMonthlyRsr * 12;
93
- const trailingAnnualUsd = trailingMonthlyUsd * 12;
94
- // -- Theoretical target (protocol fee model) --
95
- const platformTierPercent = getPlatformTierPercent(totalTvl);
96
- const theoreticalAnnualUsd = totalTvl * 0.05 * (platformTierPercent / 100);
97
- const theoreticalMonthlyUsd = theoreticalAnnualUsd / 12;
98
- const theoreticalMonthlyRsr = rsrPrice > 0 ? theoreticalMonthlyUsd / rsrPrice : 0;
99
- // -- Effective burn rate: what % of TVL is actually burned annually --
100
- const effectiveBurnRate = totalTvl > 0 ? trailingAnnualUsd / totalTvl : 0;
101
- const totalBurnedRsr = Number(burnData.totalBurned) / 1e18;
102
- const totalBurnedUsd = totalBurnedRsr * rsrPrice;
103
- return {
104
- trailing: {
105
- monthlyBurnRsr: trailingMonthlyRsr,
106
- monthlyBurnUsd: trailingMonthlyUsd,
107
- annualBurnRsr: trailingAnnualRsr,
108
- annualBurnUsd: trailingAnnualUsd,
109
- monthsUsed,
110
- },
111
- theoretical: {
112
- annualBurnUsd: theoreticalAnnualUsd,
113
- monthlyBurnUsd: theoreticalMonthlyUsd,
114
- monthlyBurnRsr: theoreticalMonthlyRsr,
115
- platformTierPercent,
116
- },
117
- effectiveBurnRate,
118
- totalBurnedRsr,
119
- totalBurnedUsd,
120
- };
121
- }
122
- function getPlatformTierPercent(tvl) {
123
- if (tvl < 100_000_000)
124
- return 50;
125
- if (tvl < 1_000_000_000)
126
- return 40;
127
- if (tvl < 10_000_000_000)
128
- return 30;
129
- if (tvl < 100_000_000_000)
130
- return 20;
131
- return 10;
132
- }
133
- /**
134
- * Compare latest month's burn vs trailing average.
135
- * WHY: "Accuracy" against a broken theoretical was meaningless.
136
- * Comparing latest vs trailing shows whether burns are accelerating or decelerating.
137
- */
138
- export function computeBurnAccuracy(projection, burnData, rsrPrice) {
139
- const trailingMonthlyRsr = projection.trailing.monthlyBurnRsr;
140
- const latestSnapshot = burnData.monthlySnapshots[0];
141
- const latestMonthlyRsr = latestSnapshot
142
- ? Number(latestSnapshot.monthlyBurnAmount) / 1e18
143
- : 0;
144
- const latestVsTrailingPct = trailingMonthlyRsr > 0
145
- ? (latestMonthlyRsr / trailingMonthlyRsr) * 100
146
- : 0;
147
- return {
148
- trailingMonthlyRsr,
149
- latestMonthlyRsr,
150
- latestVsTrailingPct,
151
- totalBurnedRsr: projection.totalBurnedRsr,
152
- totalBurnedUsd: projection.totalBurnedUsd,
153
- };
154
- }
155
- /**
156
- * Calculate total RSR locked in DTF stTokens.
157
- * Checks each DTF's stToken.underlying.address against known RSR addresses.
158
- */
159
- export function computeLockedRsr(raws, rsrAddresses) {
160
- const rsrSet = new Set(rsrAddresses.map((a) => a.toLowerCase()));
161
- let total = 0;
162
- for (const raw of raws) {
163
- if (!raw.stToken)
164
- continue;
165
- const underlyingAddr = raw.stToken.underlying.address.toLowerCase();
166
- if (!rsrSet.has(underlyingAddr))
167
- continue;
168
- const supply = Number(raw.stToken.token.totalSupply);
169
- const decimals = raw.stToken.token.decimals;
170
- // WHY: stToken.token.totalSupply might be wei or BigDecimal depending on subgraph.
171
- // Register divides by 10^decimals, so we do the same defensively.
172
- total += supply / 10 ** decimals;
173
- }
174
- return total;
175
- }
176
- /**
177
- * Binary search for the closest price record to a given timestamp.
178
- * Expects prices sorted by timestamp ascending.
179
- * Returns 0 if empty.
180
- */
181
- export function nearestPrice(timestamp, prices) {
182
- if (prices.length === 0)
183
- return 0;
184
- let lo = 0;
185
- let hi = prices.length - 1;
186
- while (lo < hi) {
187
- const mid = (lo + hi) >> 1;
188
- if (prices[mid].timestamp < timestamp) {
189
- lo = mid + 1;
190
- }
191
- else {
192
- hi = mid;
193
- }
194
- }
195
- // lo is the first index >= timestamp. Compare lo and lo-1 for closest.
196
- if (lo === 0)
197
- return prices[0].priceUsd;
198
- const before = prices[lo - 1];
199
- const after = prices[lo];
200
- const diffBefore = timestamp - before.timestamp;
201
- const diffAfter = after.timestamp - timestamp;
202
- return diffBefore <= diffAfter ? before.priceUsd : after.priceUsd;
203
- }
204
- /**
205
- * Compute total historical USD value of burns using time-matched prices.
206
- */
207
- export function computeHistoricalBurnTotals(burns, prices) {
208
- let totalBurnedUsdHistorical = 0;
209
- for (const burn of burns) {
210
- const amountRsr = Number(burn.amount) / 1e18;
211
- const price = nearestPrice(burn.timestamp, prices);
212
- totalBurnedUsdHistorical += amountRsr * price;
213
- }
214
- return { totalBurnedUsdHistorical };
215
- }
216
- //# sourceMappingURL=compute-revenue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compute-revenue.js","sourceRoot":"","sources":["../../src/revenue/compute-revenue.ts"],"names":[],"mappings":"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"}
@@ -1,182 +0,0 @@
1
- import { SUPPORTED_CHAINS } from '../constants';
2
- import { querySubgraph } from '../utils/query-subgraph';
3
- const REVENUE_QUERY = `
4
- query GetDTFRevenue($id: String!) {
5
- dtf(id: $id) {
6
- id
7
- totalRevenue
8
- protocolRevenue
9
- governanceRevenue
10
- externalRevenue
11
- mintingFee
12
- tvlFee
13
- annualizedTvlFee
14
- token {
15
- decimals
16
- symbol
17
- totalSupply
18
- }
19
- stToken {
20
- id
21
- token {
22
- totalSupply
23
- decimals
24
- }
25
- underlying {
26
- symbol
27
- id
28
- decimals
29
- }
30
- }
31
- }
32
- }
33
- `;
34
- const ECOSYSTEM_REVENUE_QUERY = `
35
- query GetEcosystemRevenue {
36
- dtfs(first: 100, where: { totalRevenue_gt: "0" }) {
37
- id
38
- totalRevenue
39
- protocolRevenue
40
- governanceRevenue
41
- externalRevenue
42
- mintingFee
43
- tvlFee
44
- annualizedTvlFee
45
- token {
46
- decimals
47
- symbol
48
- totalSupply
49
- }
50
- stToken {
51
- id
52
- token {
53
- totalSupply
54
- decimals
55
- }
56
- underlying {
57
- symbol
58
- id
59
- decimals
60
- }
61
- }
62
- }
63
- }
64
- `;
65
- const DAILY_SNAPSHOTS_QUERY = `
66
- query GetDailySnapshots($tokenId: String!, $first: Int!) {
67
- tokenDailySnapshots(
68
- first: $first
69
- orderBy: timestamp
70
- orderDirection: desc
71
- where: { token: $tokenId }
72
- ) {
73
- timestamp
74
- totalRevenue
75
- protocolRevenue
76
- governanceRevenue
77
- externalRevenue
78
- }
79
- }
80
- `;
81
- const MONTHLY_SNAPSHOTS_QUERY = `
82
- query GetMonthlySnapshots($tokenId: String!, $first: Int!) {
83
- tokenMonthlySnapshots(
84
- first: $first
85
- orderBy: timestamp
86
- orderDirection: desc
87
- where: { token: $tokenId }
88
- ) {
89
- timestamp
90
- totalRevenue
91
- protocolRevenue
92
- governanceRevenue
93
- externalRevenue
94
- }
95
- }
96
- `;
97
- function parseDtfRevenue(raw, chainId) {
98
- return {
99
- address: raw.id,
100
- chainId,
101
- totalRevenue: raw.totalRevenue ?? '0',
102
- protocolRevenue: raw.protocolRevenue ?? '0',
103
- governanceRevenue: raw.governanceRevenue ?? '0',
104
- externalRevenue: raw.externalRevenue ?? '0',
105
- mintingFee: raw.mintingFee ?? '0',
106
- tvlFee: raw.tvlFee ?? '0',
107
- annualizedTvlFee: raw.annualizedTvlFee ?? '0',
108
- token: {
109
- // WHY: DTF share tokens are always 18 decimals (protocol enforced).
110
- // The default is safe here unlike general ERC20s.
111
- decimals: Number(raw.token?.decimals ?? 18),
112
- symbol: raw.token?.symbol ?? '',
113
- totalSupply: raw.token?.totalSupply ?? '0',
114
- },
115
- stToken: raw.stToken
116
- ? {
117
- id: raw.stToken.id,
118
- token: {
119
- totalSupply: raw.stToken.token?.totalSupply ?? '0',
120
- // WHY: stToken (vote-lock) is always 18 decimals — wraps the underlying RSR/DTF token.
121
- decimals: Number(raw.stToken.token?.decimals ?? 18),
122
- },
123
- underlying: {
124
- symbol: raw.stToken.underlying?.symbol ?? '',
125
- address: raw.stToken.underlying?.id ?? '',
126
- // WHY: Underlying is RSR (18 dec) or a DTF share token (18 dec). Safe default.
127
- decimals: Number(raw.stToken.underlying?.decimals ?? 18),
128
- },
129
- }
130
- : undefined,
131
- };
132
- }
133
- export async function fetchDtfRevenue(chainId, folioAddress) {
134
- const data = await querySubgraph(chainId, REVENUE_QUERY, {
135
- id: folioAddress.toLowerCase(),
136
- });
137
- const dtf = data?.dtf;
138
- if (!dtf) {
139
- throw new Error(`DTF not found for revenue: ${folioAddress} on chain ${chainId}`);
140
- }
141
- return parseDtfRevenue(dtf, chainId);
142
- }
143
- export async function fetchEcosystemRevenue(chains) {
144
- const targetChains = chains ?? SUPPORTED_CHAINS;
145
- const results = await Promise.allSettled(targetChains.map(async (chainId) => {
146
- const data = await querySubgraph(chainId, ECOSYSTEM_REVENUE_QUERY);
147
- const dtfs = data?.dtfs ?? [];
148
- return dtfs.map((raw) => parseDtfRevenue(raw, chainId));
149
- }));
150
- const all = [];
151
- for (const result of results) {
152
- if (result.status === 'fulfilled') {
153
- all.push(...result.value);
154
- }
155
- // WHY: Skip failed chains (BSC subgraph might be down)
156
- }
157
- return all;
158
- }
159
- export async function fetchRevenueSnapshots(chainId, folioAddress, opts) {
160
- const period = opts?.period ?? 'monthly';
161
- const first = opts?.first ?? 12;
162
- const query = period === 'daily' ? DAILY_SNAPSHOTS_QUERY : MONTHLY_SNAPSHOTS_QUERY;
163
- const vars = { tokenId: folioAddress.toLowerCase(), first };
164
- let snapshots;
165
- if (period === 'daily') {
166
- const data = await querySubgraph(chainId, query, vars);
167
- snapshots = data?.tokenDailySnapshots ?? [];
168
- }
169
- else {
170
- const data = await querySubgraph(chainId, query, vars);
171
- snapshots = data?.tokenMonthlySnapshots ?? [];
172
- }
173
- return snapshots.map((s) => ({
174
- timestamp: Number(s.timestamp),
175
- totalRevenue: s.totalRevenue ?? '0',
176
- protocolRevenue: s.protocolRevenue ?? '0',
177
- governanceRevenue: s.governanceRevenue ?? '0',
178
- externalRevenue: s.externalRevenue ?? '0',
179
- period,
180
- }));
181
- }
182
- //# sourceMappingURL=fetch-revenue.js.map