@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.
Files changed (234) hide show
  1. package/README.md +134 -0
  2. package/dist/abi/deployer.d.ts +281 -0
  3. package/dist/abi/deployer.d.ts.map +1 -0
  4. package/dist/abi/deployer.js +178 -0
  5. package/dist/abi/deployer.js.map +1 -0
  6. package/dist/abi/erc20.d.ts +73 -0
  7. package/dist/abi/erc20.d.ts.map +1 -0
  8. package/dist/abi/erc20.js +58 -0
  9. package/dist/abi/erc20.js.map +1 -0
  10. package/dist/abi/folio.d.ts +1950 -0
  11. package/dist/abi/folio.d.ts.map +1 -0
  12. package/dist/abi/folio.js +1430 -0
  13. package/dist/abi/folio.js.map +1 -0
  14. package/dist/abi/governance-deployer.d.ts +130 -0
  15. package/dist/abi/governance-deployer.d.ts.map +1 -0
  16. package/dist/abi/governance-deployer.js +77 -0
  17. package/dist/abi/governance-deployer.js.map +1 -0
  18. package/dist/abi/governor.d.ts +1276 -0
  19. package/dist/abi/governor.d.ts.map +1 -0
  20. package/dist/abi/governor.js +1661 -0
  21. package/dist/abi/governor.js.map +1 -0
  22. package/dist/abi/proxy-admin.d.ts +49 -0
  23. package/dist/abi/proxy-admin.d.ts.map +1 -0
  24. package/dist/abi/proxy-admin.js +42 -0
  25. package/dist/abi/proxy-admin.js.map +1 -0
  26. package/dist/abi/spells.d.ts +67 -0
  27. package/dist/abi/spells.d.ts.map +1 -0
  28. package/dist/abi/spells.js +61 -0
  29. package/dist/abi/spells.js.map +1 -0
  30. package/dist/abi/timelock.d.ts +673 -0
  31. package/dist/abi/timelock.d.ts.map +1 -0
  32. package/dist/abi/timelock.js +469 -0
  33. package/dist/abi/timelock.js.map +1 -0
  34. package/dist/abi/vote-lock.d.ts +164 -0
  35. package/dist/abi/vote-lock.d.ts.map +1 -0
  36. package/dist/abi/vote-lock.js +116 -0
  37. package/dist/abi/vote-lock.js.map +1 -0
  38. package/dist/clients/chains.d.ts +5 -0
  39. package/dist/clients/chains.d.ts.map +1 -0
  40. package/dist/clients/chains.js +23 -0
  41. package/dist/clients/chains.js.map +1 -0
  42. package/dist/clients/create-clients.d.ts +14 -0
  43. package/dist/clients/create-clients.d.ts.map +1 -0
  44. package/dist/clients/create-clients.js +32 -0
  45. package/dist/clients/create-clients.js.map +1 -0
  46. package/dist/clients/create-price-client.d.ts +7 -0
  47. package/dist/clients/create-price-client.d.ts.map +1 -0
  48. package/dist/clients/create-price-client.js +15 -0
  49. package/dist/clients/create-price-client.js.map +1 -0
  50. package/dist/constants.d.ts +35 -0
  51. package/dist/constants.d.ts.map +1 -0
  52. package/dist/constants.js +100 -0
  53. package/dist/constants.js.map +1 -0
  54. package/dist/deploy/build-deploy.d.ts +7 -0
  55. package/dist/deploy/build-deploy.d.ts.map +1 -0
  56. package/dist/deploy/build-deploy.js +84 -0
  57. package/dist/deploy/build-deploy.js.map +1 -0
  58. package/dist/deploy/extract-deployed-address.d.ts +8 -0
  59. package/dist/deploy/extract-deployed-address.d.ts.map +1 -0
  60. package/dist/deploy/extract-deployed-address.js +36 -0
  61. package/dist/deploy/extract-deployed-address.js.map +1 -0
  62. package/dist/deploy/permissionless-defaults.d.ts +35 -0
  63. package/dist/deploy/permissionless-defaults.d.ts.map +1 -0
  64. package/dist/deploy/permissionless-defaults.js +76 -0
  65. package/dist/deploy/permissionless-defaults.js.map +1 -0
  66. package/dist/deploy/token-registry.d.ts +9 -0
  67. package/dist/deploy/token-registry.d.ts.map +1 -0
  68. package/dist/deploy/token-registry.js +68 -0
  69. package/dist/deploy/token-registry.js.map +1 -0
  70. package/dist/deploy/zap-deploy.d.ts +4 -0
  71. package/dist/deploy/zap-deploy.d.ts.map +1 -0
  72. package/dist/deploy/zap-deploy.js +50 -0
  73. package/dist/deploy/zap-deploy.js.map +1 -0
  74. package/dist/dtf/fees.d.ts +10 -0
  75. package/dist/dtf/fees.d.ts.map +1 -0
  76. package/dist/dtf/fees.js +103 -0
  77. package/dist/dtf/fees.js.map +1 -0
  78. package/dist/dtf/fetch-analytics.d.ts +27 -0
  79. package/dist/dtf/fetch-analytics.d.ts.map +1 -0
  80. package/dist/dtf/fetch-analytics.js +63 -0
  81. package/dist/dtf/fetch-analytics.js.map +1 -0
  82. package/dist/dtf/fetch-basket.d.ts +16 -0
  83. package/dist/dtf/fetch-basket.d.ts.map +1 -0
  84. package/dist/dtf/fetch-basket.js +32 -0
  85. package/dist/dtf/fetch-basket.js.map +1 -0
  86. package/dist/dtf/fetch-discover.d.ts +10 -0
  87. package/dist/dtf/fetch-discover.d.ts.map +1 -0
  88. package/dist/dtf/fetch-discover.js +17 -0
  89. package/dist/dtf/fetch-discover.js.map +1 -0
  90. package/dist/dtf/fetch-dtf.d.ts +25 -0
  91. package/dist/dtf/fetch-dtf.d.ts.map +1 -0
  92. package/dist/dtf/fetch-dtf.js +39 -0
  93. package/dist/dtf/fetch-dtf.js.map +1 -0
  94. package/dist/dtf/mint.d.ts +9 -0
  95. package/dist/dtf/mint.d.ts.map +1 -0
  96. package/dist/dtf/mint.js +82 -0
  97. package/dist/dtf/mint.js.map +1 -0
  98. package/dist/dtf/read-basket.d.ts +4 -0
  99. package/dist/dtf/read-basket.d.ts.map +1 -0
  100. package/dist/dtf/read-basket.js +20 -0
  101. package/dist/dtf/read-basket.js.map +1 -0
  102. package/dist/dtf/read-config.d.ts +4 -0
  103. package/dist/dtf/read-config.d.ts.map +1 -0
  104. package/dist/dtf/read-config.js +80 -0
  105. package/dist/dtf/read-config.js.map +1 -0
  106. package/dist/dtf/read-dtf.d.ts +6 -0
  107. package/dist/dtf/read-dtf.d.ts.map +1 -0
  108. package/dist/dtf/read-dtf.js +32 -0
  109. package/dist/dtf/read-dtf.js.map +1 -0
  110. package/dist/dtf/read-rebalance-control.d.ts +4 -0
  111. package/dist/dtf/read-rebalance-control.d.ts.map +1 -0
  112. package/dist/dtf/read-rebalance-control.js +14 -0
  113. package/dist/dtf/read-rebalance-control.js.map +1 -0
  114. package/dist/dtf/read-roles.d.ts +4 -0
  115. package/dist/dtf/read-roles.d.ts.map +1 -0
  116. package/dist/dtf/read-roles.js +29 -0
  117. package/dist/dtf/read-roles.js.map +1 -0
  118. package/dist/dtf/read-version.d.ts +3 -0
  119. package/dist/dtf/read-version.d.ts.map +1 -0
  120. package/dist/dtf/read-version.js +9 -0
  121. package/dist/dtf/read-version.js.map +1 -0
  122. package/dist/dtf/redeem.d.ts +5 -0
  123. package/dist/dtf/redeem.d.ts.map +1 -0
  124. package/dist/dtf/redeem.js +27 -0
  125. package/dist/dtf/redeem.js.map +1 -0
  126. package/dist/governance/build-proposal.d.ts +11 -0
  127. package/dist/governance/build-proposal.d.ts.map +1 -0
  128. package/dist/governance/build-proposal.js +78 -0
  129. package/dist/governance/build-proposal.js.map +1 -0
  130. package/dist/governance/build-settings-calldata.d.ts +39 -0
  131. package/dist/governance/build-settings-calldata.d.ts.map +1 -0
  132. package/dist/governance/build-settings-calldata.js +145 -0
  133. package/dist/governance/build-settings-calldata.js.map +1 -0
  134. package/dist/governance/compute-proposal-state.d.ts +18 -0
  135. package/dist/governance/compute-proposal-state.d.ts.map +1 -0
  136. package/dist/governance/compute-proposal-state.js +87 -0
  137. package/dist/governance/compute-proposal-state.js.map +1 -0
  138. package/dist/governance/decode-proposal.d.ts +22 -0
  139. package/dist/governance/decode-proposal.d.ts.map +1 -0
  140. package/dist/governance/decode-proposal.js +164 -0
  141. package/dist/governance/decode-proposal.js.map +1 -0
  142. package/dist/governance/fetch-proposals.d.ts +41 -0
  143. package/dist/governance/fetch-proposals.d.ts.map +1 -0
  144. package/dist/governance/fetch-proposals.js +173 -0
  145. package/dist/governance/fetch-proposals.js.map +1 -0
  146. package/dist/governance/read-governance.d.ts +7 -0
  147. package/dist/governance/read-governance.d.ts.map +1 -0
  148. package/dist/governance/read-governance.js +97 -0
  149. package/dist/governance/read-governance.js.map +1 -0
  150. package/dist/governance/read-proposals.d.ts +11 -0
  151. package/dist/governance/read-proposals.d.ts.map +1 -0
  152. package/dist/governance/read-proposals.js +104 -0
  153. package/dist/governance/read-proposals.js.map +1 -0
  154. package/dist/governance/read-voting-power.d.ts +8 -0
  155. package/dist/governance/read-voting-power.d.ts.map +1 -0
  156. package/dist/governance/read-voting-power.js +25 -0
  157. package/dist/governance/read-voting-power.js.map +1 -0
  158. package/dist/index.d.ts +57 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +73 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/prices/chainlink.d.ts +8 -0
  163. package/dist/prices/chainlink.d.ts.map +1 -0
  164. package/dist/prices/chainlink.js +116 -0
  165. package/dist/prices/chainlink.js.map +1 -0
  166. package/dist/prices/reserve-api.d.ts +7 -0
  167. package/dist/prices/reserve-api.d.ts.map +1 -0
  168. package/dist/prices/reserve-api.js +47 -0
  169. package/dist/prices/reserve-api.js.map +1 -0
  170. package/dist/rebalance/build-auction.d.ts +25 -0
  171. package/dist/rebalance/build-auction.d.ts.map +1 -0
  172. package/dist/rebalance/build-auction.js +73 -0
  173. package/dist/rebalance/build-auction.js.map +1 -0
  174. package/dist/rebalance/build-rebalance.d.ts +22 -0
  175. package/dist/rebalance/build-rebalance.d.ts.map +1 -0
  176. package/dist/rebalance/build-rebalance.js +30 -0
  177. package/dist/rebalance/build-rebalance.js.map +1 -0
  178. package/dist/rebalance/read-auction.d.ts +4 -0
  179. package/dist/rebalance/read-auction.d.ts.map +1 -0
  180. package/dist/rebalance/read-auction.js +31 -0
  181. package/dist/rebalance/read-auction.js.map +1 -0
  182. package/dist/rebalance/read-rebalance.d.ts +4 -0
  183. package/dist/rebalance/read-rebalance.d.ts.map +1 -0
  184. package/dist/rebalance/read-rebalance.js +50 -0
  185. package/dist/rebalance/read-rebalance.js.map +1 -0
  186. package/dist/rebalance/transform.d.ts +22 -0
  187. package/dist/rebalance/transform.d.ts.map +1 -0
  188. package/dist/rebalance/transform.js +47 -0
  189. package/dist/rebalance/transform.js.map +1 -0
  190. package/dist/revenue/compute-revenue.d.ts +45 -0
  191. package/dist/revenue/compute-revenue.d.ts.map +1 -0
  192. package/dist/revenue/compute-revenue.js +216 -0
  193. package/dist/revenue/compute-revenue.js.map +1 -0
  194. package/dist/revenue/fetch-revenue.d.ts +8 -0
  195. package/dist/revenue/fetch-revenue.d.ts.map +1 -0
  196. package/dist/revenue/fetch-revenue.js +182 -0
  197. package/dist/revenue/fetch-revenue.js.map +1 -0
  198. package/dist/revenue/fetch-rsr-burns.d.ts +9 -0
  199. package/dist/revenue/fetch-rsr-burns.d.ts.map +1 -0
  200. package/dist/revenue/fetch-rsr-burns.js +106 -0
  201. package/dist/revenue/fetch-rsr-burns.js.map +1 -0
  202. package/dist/types.d.ts +546 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +2 -0
  205. package/dist/types.js.map +1 -0
  206. package/dist/utils/assert.d.ts +2 -0
  207. package/dist/utils/assert.d.ts.map +1 -0
  208. package/dist/utils/assert.js +5 -0
  209. package/dist/utils/assert.js.map +1 -0
  210. package/dist/utils/fetch-token-metadata.d.ts +7 -0
  211. package/dist/utils/fetch-token-metadata.d.ts.map +1 -0
  212. package/dist/utils/fetch-token-metadata.js +29 -0
  213. package/dist/utils/fetch-token-metadata.js.map +1 -0
  214. package/dist/utils/fetch-with-retry.d.ts +7 -0
  215. package/dist/utils/fetch-with-retry.d.ts.map +1 -0
  216. package/dist/utils/fetch-with-retry.js +38 -0
  217. package/dist/utils/fetch-with-retry.js.map +1 -0
  218. package/dist/utils/query-subgraph.d.ts +7 -0
  219. package/dist/utils/query-subgraph.d.ts.map +1 -0
  220. package/dist/utils/query-subgraph.js +25 -0
  221. package/dist/utils/query-subgraph.js.map +1 -0
  222. package/dist/utils/validate-price-control.d.ts +3 -0
  223. package/dist/utils/validate-price-control.d.ts.map +1 -0
  224. package/dist/utils/validate-price-control.js +6 -0
  225. package/dist/utils/validate-price-control.js.map +1 -0
  226. package/dist/vote-lock/build-vote-lock.d.ts +10 -0
  227. package/dist/vote-lock/build-vote-lock.d.ts.map +1 -0
  228. package/dist/vote-lock/build-vote-lock.js +73 -0
  229. package/dist/vote-lock/build-vote-lock.js.map +1 -0
  230. package/dist/vote-lock/read-vote-lock.d.ts +7 -0
  231. package/dist/vote-lock/read-vote-lock.d.ts.map +1 -0
  232. package/dist/vote-lock/read-vote-lock.js +64 -0
  233. package/dist/vote-lock/read-vote-lock.js.map +1 -0
  234. package/package.json +28 -0
@@ -0,0 +1,145 @@
1
+ import { encodeFunctionData } from 'viem';
2
+ import folioAbi from '../abi/folio';
3
+ import governorAbi from '../abi/governor';
4
+ import timelockAbi from '../abi/timelock';
5
+ // -- DTF settings (target: folio, via ownerGovernance) --
6
+ export function encodeMintFee(fee) {
7
+ return encodeFunctionData({
8
+ abi: folioAbi,
9
+ functionName: 'setMintFee',
10
+ args: [fee],
11
+ });
12
+ }
13
+ export function encodeTvlFee(fee) {
14
+ return encodeFunctionData({
15
+ abi: folioAbi,
16
+ functionName: 'setTVLFee',
17
+ args: [fee],
18
+ });
19
+ }
20
+ export function encodeFeeRecipients(recipients) {
21
+ return encodeFunctionData({
22
+ abi: folioAbi,
23
+ functionName: 'setFeeRecipients',
24
+ args: [recipients],
25
+ });
26
+ }
27
+ export function encodeMandate(mandate) {
28
+ return encodeFunctionData({
29
+ abi: folioAbi,
30
+ functionName: 'setMandate',
31
+ args: [mandate],
32
+ });
33
+ }
34
+ export function encodeAuctionLength(seconds) {
35
+ return encodeFunctionData({
36
+ abi: folioAbi,
37
+ functionName: 'setAuctionLength',
38
+ args: [seconds],
39
+ });
40
+ }
41
+ export function encodeRebalanceControl(weightControl, priceControl) {
42
+ return encodeFunctionData({
43
+ abi: folioAbi,
44
+ functionName: 'setRebalanceControl',
45
+ args: [{ weightControl, priceControl }],
46
+ });
47
+ }
48
+ export function encodeTrustedFillerRegistry(registry, enabled) {
49
+ return encodeFunctionData({
50
+ abi: folioAbi,
51
+ functionName: 'setTrustedFillerRegistry',
52
+ args: [registry, enabled],
53
+ });
54
+ }
55
+ // -- Role management (target: folio, via ownerGovernance) --
56
+ export function encodeGrantRole(role, account) {
57
+ return encodeFunctionData({
58
+ abi: folioAbi,
59
+ functionName: 'grantRole',
60
+ args: [role, account],
61
+ });
62
+ }
63
+ export function encodeRevokeRole(role, account) {
64
+ return encodeFunctionData({
65
+ abi: folioAbi,
66
+ functionName: 'revokeRole',
67
+ args: [role, account],
68
+ });
69
+ }
70
+ // -- Basket changes (target: folio, via tradingGovernance) --
71
+ export function encodeStartRebalance(tokens, limits, launcherWindow, ttl) {
72
+ return encodeFunctionData({
73
+ abi: folioAbi,
74
+ functionName: 'startRebalance',
75
+ args: [tokens, limits, launcherWindow, ttl],
76
+ });
77
+ }
78
+ export function encodeAddToBasket(token) {
79
+ return encodeFunctionData({
80
+ abi: folioAbi,
81
+ functionName: 'addToBasket',
82
+ args: [token],
83
+ });
84
+ }
85
+ export function encodeRemoveFromBasket(token) {
86
+ return encodeFunctionData({
87
+ abi: folioAbi,
88
+ functionName: 'removeFromBasket',
89
+ args: [token],
90
+ });
91
+ }
92
+ // -- Governor settings (target: governor, via its own governance) --
93
+ // WHY: ABI uses uint48 for votingDelay → viem maps to number. Accept bigint for SDK ergonomics.
94
+ export function encodeVotingDelay(delay) {
95
+ return encodeFunctionData({
96
+ abi: governorAbi,
97
+ functionName: 'setVotingDelay',
98
+ args: [Number(delay)],
99
+ });
100
+ }
101
+ // WHY: ABI uses uint32 for votingPeriod → viem maps to number. Accept bigint for SDK ergonomics.
102
+ export function encodeVotingPeriod(period) {
103
+ return encodeFunctionData({
104
+ abi: governorAbi,
105
+ functionName: 'setVotingPeriod',
106
+ args: [Number(period)],
107
+ });
108
+ }
109
+ export function encodeProposalThreshold(threshold) {
110
+ return encodeFunctionData({
111
+ abi: governorAbi,
112
+ functionName: 'setProposalThreshold',
113
+ args: [threshold],
114
+ });
115
+ }
116
+ export function encodeQuorumNumerator(numerator) {
117
+ return encodeFunctionData({
118
+ abi: governorAbi,
119
+ functionName: 'updateQuorumNumerator',
120
+ args: [numerator],
121
+ });
122
+ }
123
+ // -- Timelock settings (target: timelock, via its own governance) --
124
+ export function encodeTimelockDelay(delay) {
125
+ return encodeFunctionData({
126
+ abi: timelockAbi,
127
+ functionName: 'updateDelay',
128
+ args: [delay],
129
+ });
130
+ }
131
+ export function encodeTimelockGrantRole(role, account) {
132
+ return encodeFunctionData({
133
+ abi: timelockAbi,
134
+ functionName: 'grantRole',
135
+ args: [role, account],
136
+ });
137
+ }
138
+ export function encodeTimelockRevokeRole(role, account) {
139
+ return encodeFunctionData({
140
+ abi: timelockAbi,
141
+ functionName: 'revokeRole',
142
+ args: [role, account],
143
+ });
144
+ }
145
+ //# sourceMappingURL=build-settings-calldata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-settings-calldata.js","sourceRoot":"","sources":["../../src/governance/build-settings-calldata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ProposalSummary } from './fetch-proposals';
2
+ import type { ProposalState, ComputedProposalState } from '../types';
3
+ export declare const PROPOSAL_STATES: Record<string, ProposalState>;
4
+ /**
5
+ * Compute the real proposal state from subgraph data + current time.
6
+ *
7
+ * WHY: The subgraph only tracks on-chain events. States like DEFEATED, EXPIRED,
8
+ * and SUCCEEDED are computed by the governor contract but never written on-chain
9
+ * unless someone calls execute/cancel. This function replicates the governor's
10
+ * state machine using timestamps, matching Register's `getProposalState`.
11
+ *
12
+ * @param proposal - Proposal data from subgraph (via fetchProposals or fetchAllProposals)
13
+ * @param nowSeconds - Current unix timestamp in seconds. Defaults to Date.now()/1000.
14
+ * NOTE: Uses client clock, not block timestamp. Clock skew = wrong state.
15
+ * Pass a block timestamp for canonical results.
16
+ */
17
+ export declare function computeProposalState(proposal: ProposalSummary, nowSeconds?: number): ComputedProposalState;
18
+ //# sourceMappingURL=compute-proposal-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-proposal-state.d.ts","sourceRoot":"","sources":["../../src/governance/compute-proposal-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEpE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAUzD,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,qBAAqB,CA2EvB"}
@@ -0,0 +1,87 @@
1
+ export const PROPOSAL_STATES = {
2
+ PENDING: 'PENDING',
3
+ ACTIVE: 'ACTIVE',
4
+ CANCELED: 'CANCELED',
5
+ DEFEATED: 'DEFEATED',
6
+ QUORUM_NOT_REACHED: 'QUORUM_NOT_REACHED',
7
+ SUCCEEDED: 'SUCCEEDED',
8
+ QUEUED: 'QUEUED',
9
+ EXPIRED: 'EXPIRED',
10
+ EXECUTED: 'EXECUTED',
11
+ };
12
+ /**
13
+ * Compute the real proposal state from subgraph data + current time.
14
+ *
15
+ * WHY: The subgraph only tracks on-chain events. States like DEFEATED, EXPIRED,
16
+ * and SUCCEEDED are computed by the governor contract but never written on-chain
17
+ * unless someone calls execute/cancel. This function replicates the governor's
18
+ * state machine using timestamps, matching Register's `getProposalState`.
19
+ *
20
+ * @param proposal - Proposal data from subgraph (via fetchProposals or fetchAllProposals)
21
+ * @param nowSeconds - Current unix timestamp in seconds. Defaults to Date.now()/1000.
22
+ * NOTE: Uses client clock, not block timestamp. Clock skew = wrong state.
23
+ * Pass a block timestamp for canonical results.
24
+ */
25
+ export function computeProposalState(proposal, nowSeconds) {
26
+ const now = nowSeconds ?? Math.floor(Date.now() / 1000);
27
+ const voteStart = Number(proposal.voteStart);
28
+ const voteEnd = Number(proposal.voteEnd);
29
+ const forVotes = Number(proposal.forWeightedVotes);
30
+ const againstVotes = Number(proposal.againstWeightedVotes);
31
+ const abstainVotes = Number(proposal.abstainWeightedVotes);
32
+ const quorum = Number(proposal.quorumVotes);
33
+ const totalVotes = forVotes + againstVotes + abstainVotes;
34
+ const quorumReached = forVotes > 0 && forVotes + abstainVotes >= quorum;
35
+ const forPercent = totalVotes > 0 ? (forVotes / totalVotes) * 100 : 0;
36
+ const againstPercent = totalVotes > 0 ? (againstVotes / totalVotes) * 100 : 0;
37
+ const abstainPercent = totalVotes > 0 ? (abstainVotes / totalVotes) * 100 : 0;
38
+ const base = {
39
+ quorumReached,
40
+ forPercent,
41
+ againstPercent,
42
+ abstainPercent,
43
+ };
44
+ // Terminal states — subgraph is authoritative
45
+ if (proposal.state === PROPOSAL_STATES.EXECUTED ||
46
+ proposal.state === PROPOSAL_STATES.CANCELED) {
47
+ return { ...base, state: proposal.state, deadline: null };
48
+ }
49
+ // QUEUED — waiting for execution
50
+ if (proposal.state === PROPOSAL_STATES.QUEUED) {
51
+ return { ...base, state: 'QUEUED', deadline: null };
52
+ }
53
+ // PENDING — voting hasn't started yet, or it has (subgraph didn't update)
54
+ if (proposal.state === PROPOSAL_STATES.PENDING) {
55
+ if (now > voteEnd) {
56
+ // WHY: Voting window passed entirely while still marked PENDING
57
+ return { ...base, state: 'EXPIRED', deadline: null };
58
+ }
59
+ if (now >= voteStart && now <= voteEnd) {
60
+ // WHY: Voting started but subgraph still says PENDING
61
+ return { ...base, state: 'ACTIVE', deadline: voteEnd - now };
62
+ }
63
+ // Genuinely pending — voting hasn't started
64
+ return { ...base, state: 'PENDING', deadline: voteStart - now };
65
+ }
66
+ // ACTIVE — voting in progress, or ended (subgraph didn't update)
67
+ if (proposal.state === PROPOSAL_STATES.ACTIVE) {
68
+ if (now <= voteEnd) {
69
+ // Still in voting window
70
+ return { ...base, state: 'ACTIVE', deadline: voteEnd - now };
71
+ }
72
+ // Voting ended — compute result
73
+ // WHY: Defeat if against >= for, OR if nobody voted for
74
+ if (againstVotes >= forVotes || forVotes === 0) {
75
+ return { ...base, state: 'DEFEATED', deadline: null };
76
+ }
77
+ // WHY: Quorum check — for + abstain must meet threshold
78
+ if (forVotes + abstainVotes < quorum) {
79
+ return { ...base, state: 'QUORUM_NOT_REACHED', deadline: null };
80
+ }
81
+ // Passed all checks
82
+ return { ...base, state: 'SUCCEEDED', deadline: null };
83
+ }
84
+ // Fallback — unknown state from subgraph, pass through
85
+ return { ...base, state: proposal.state, deadline: null };
86
+ }
87
+ //# sourceMappingURL=compute-proposal-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-proposal-state.js","sourceRoot":"","sources":["../../src/governance/compute-proposal-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Abi, type Address, type Hex } from 'viem';
2
+ import type { SupportedChainId, DtfAddressMap, ProposalPreview } from '../types';
3
+ /**
4
+ * Build ABI mapping from contract addresses to their ABIs.
5
+ * WHY: Different contracts have different ABIs. The folio uses the full V5 ABI,
6
+ * governors and timelocks use their respective ABIs, spells use minimal ABIs.
7
+ */
8
+ export declare function buildAbiMap(addresses: DtfAddressMap, chainId: SupportedChainId): Record<string, Abi>;
9
+ /**
10
+ * Map an address to a human-readable label.
11
+ */
12
+ export declare function labelAddress(address: Address, addresses: DtfAddressMap, chainId: SupportedChainId): string;
13
+ /**
14
+ * Map a role hash to a human-readable name.
15
+ */
16
+ export declare function formatRoleName(roleHash: Hex): string;
17
+ /**
18
+ * Decode raw proposal targets/calldatas/values into structured actions.
19
+ * Pure function — no RPC, no React.
20
+ */
21
+ export declare function decodeProposalActions(targets: Address[], calldatas: Hex[], values: bigint[], addresses: DtfAddressMap, chainId: SupportedChainId): ProposalPreview;
22
+ //# sourceMappingURL=decode-proposal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-proposal.d.ts","sourceRoot":"","sources":["../../src/governance/decode-proposal.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,GAAG,EACT,MAAM,MAAM,CAAA;AAYb,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAEb,eAAe,EAChB,MAAM,UAAU,CAAA;AAEjB;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAuCrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,gBAAgB,GACxB,MAAM,CA8CR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAKpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAAE,EAClB,SAAS,EAAE,GAAG,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,gBAAgB,GACxB,eAAe,CAkEjB"}
@@ -0,0 +1,164 @@
1
+ import { decodeFunctionData, getAbiItem, } from 'viem';
2
+ import folioAbi from '../abi/folio';
3
+ import governorAbi from '../abi/governor';
4
+ import timelockAbi from '../abi/timelock';
5
+ import proxyAdminAbi from '../abi/proxy-admin';
6
+ import { v5SpellAbi, v4SpellAbi, governanceSpellAbi } from '../abi/spells';
7
+ import { V5_SPELL_ADDRESS, V4_SPELL_ADDRESS, GOVERNANCE_SPELL_ADDRESS, ROLE_NAMES, } from '../constants';
8
+ /**
9
+ * Build ABI mapping from contract addresses to their ABIs.
10
+ * WHY: Different contracts have different ABIs. The folio uses the full V5 ABI,
11
+ * governors and timelocks use their respective ABIs, spells use minimal ABIs.
12
+ */
13
+ export function buildAbiMap(addresses, chainId) {
14
+ const map = {};
15
+ // Folio gets the full V5 ABI (covers most function selectors)
16
+ map[addresses.folio.toLowerCase()] = folioAbi;
17
+ if (addresses.proxyAdmin) {
18
+ map[addresses.proxyAdmin.toLowerCase()] = proxyAdminAbi;
19
+ }
20
+ // All governors share the same ABI
21
+ for (const addr of [
22
+ addresses.ownerGovernor,
23
+ addresses.tradingGovernor,
24
+ addresses.stTokenGovernor,
25
+ ]) {
26
+ if (addr)
27
+ map[addr.toLowerCase()] = governorAbi;
28
+ }
29
+ // All timelocks share the same ABI
30
+ for (const addr of [
31
+ addresses.ownerTimelock,
32
+ addresses.tradingTimelock,
33
+ addresses.stTokenTimelock,
34
+ ]) {
35
+ if (addr)
36
+ map[addr.toLowerCase()] = timelockAbi;
37
+ }
38
+ // Spell contracts
39
+ const v5Spell = V5_SPELL_ADDRESS[chainId];
40
+ if (v5Spell)
41
+ map[v5Spell.toLowerCase()] = v5SpellAbi;
42
+ const v4Spell = V4_SPELL_ADDRESS[chainId];
43
+ if (v4Spell)
44
+ map[v4Spell.toLowerCase()] = v4SpellAbi;
45
+ const govSpell = GOVERNANCE_SPELL_ADDRESS[chainId];
46
+ if (govSpell)
47
+ map[govSpell.toLowerCase()] = governanceSpellAbi;
48
+ return map;
49
+ }
50
+ /**
51
+ * Map an address to a human-readable label.
52
+ */
53
+ export function labelAddress(address, addresses, chainId) {
54
+ const lower = address.toLowerCase();
55
+ if (lower === addresses.folio.toLowerCase())
56
+ return 'Folio';
57
+ if (addresses.proxyAdmin && lower === addresses.proxyAdmin.toLowerCase())
58
+ return 'ProxyAdmin';
59
+ if (addresses.ownerGovernor &&
60
+ lower === addresses.ownerGovernor.toLowerCase())
61
+ return 'Owner Governance';
62
+ if (addresses.ownerTimelock && lower === addresses.ownerTimelock.toLowerCase())
63
+ return 'Owner Timelock';
64
+ if (addresses.tradingGovernor &&
65
+ lower === addresses.tradingGovernor.toLowerCase())
66
+ return 'Trading Governance';
67
+ if (addresses.tradingTimelock &&
68
+ lower === addresses.tradingTimelock.toLowerCase())
69
+ return 'Trading Timelock';
70
+ if (addresses.stTokenGovernor &&
71
+ lower === addresses.stTokenGovernor.toLowerCase())
72
+ return 'Lock Governance';
73
+ if (addresses.stTokenTimelock &&
74
+ lower === addresses.stTokenTimelock.toLowerCase())
75
+ return 'Lock Timelock';
76
+ if (addresses.stToken && lower === addresses.stToken.toLowerCase())
77
+ return 'StToken';
78
+ const v5Spell = V5_SPELL_ADDRESS[chainId];
79
+ if (v5Spell && lower === v5Spell.toLowerCase())
80
+ return 'V5 Upgrade Spell';
81
+ const v4Spell = V4_SPELL_ADDRESS[chainId];
82
+ if (v4Spell && lower === v4Spell.toLowerCase())
83
+ return 'V4 Upgrade Spell';
84
+ const govSpell = GOVERNANCE_SPELL_ADDRESS[chainId];
85
+ if (govSpell && lower === govSpell.toLowerCase())
86
+ return 'Governance Spell';
87
+ return 'Unknown';
88
+ }
89
+ /**
90
+ * Map a role hash to a human-readable name.
91
+ */
92
+ export function formatRoleName(roleHash) {
93
+ const name = ROLE_NAMES[roleHash.toLowerCase()];
94
+ if (name)
95
+ return name;
96
+ // Fallback: truncated hash
97
+ return `${roleHash.slice(0, 10)}...`;
98
+ }
99
+ /**
100
+ * Decode raw proposal targets/calldatas/values into structured actions.
101
+ * Pure function — no RPC, no React.
102
+ */
103
+ export function decodeProposalActions(targets, calldatas, values, addresses, chainId) {
104
+ const abiMap = buildAbiMap(addresses, chainId);
105
+ const actions = [];
106
+ const unknownTargets = [];
107
+ for (let i = 0; i < targets.length; i++) {
108
+ const target = targets[i];
109
+ const calldata = calldatas[i];
110
+ const value = values[i] ?? 0n;
111
+ const targetLabel = labelAddress(target, addresses, chainId);
112
+ const abi = abiMap[target.toLowerCase()];
113
+ if (!abi) {
114
+ unknownTargets.push(target);
115
+ actions.push({
116
+ target,
117
+ targetLabel,
118
+ functionName: 'unknown',
119
+ parameters: [],
120
+ rawCalldata: calldata,
121
+ value,
122
+ decoded: false,
123
+ });
124
+ continue;
125
+ }
126
+ try {
127
+ const decoded = decodeFunctionData({ abi, data: calldata });
128
+ // Extract parameter names and types from the ABI item
129
+ const abiItem = getAbiItem({
130
+ abi,
131
+ name: decoded.functionName,
132
+ });
133
+ const parameters = (abiItem?.inputs ?? []).map((input, idx) => ({
134
+ name: input.name,
135
+ type: input.type,
136
+ value: decoded.args?.[idx],
137
+ }));
138
+ actions.push({
139
+ target,
140
+ targetLabel,
141
+ functionName: decoded.functionName,
142
+ parameters,
143
+ rawCalldata: calldata,
144
+ value,
145
+ decoded: true,
146
+ });
147
+ }
148
+ catch {
149
+ // ABI exists but selector doesn't match — likely a version mismatch
150
+ unknownTargets.push(target);
151
+ actions.push({
152
+ target,
153
+ targetLabel,
154
+ functionName: 'unknown',
155
+ parameters: [],
156
+ rawCalldata: calldata,
157
+ value,
158
+ decoded: false,
159
+ });
160
+ }
161
+ }
162
+ return { actions, unknownTargets };
163
+ }
164
+ //# sourceMappingURL=decode-proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-proposal.js","sourceRoot":"","sources":["../../src/governance/decode-proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { SupportedChainId } from '../types';
2
+ import type { Address } from 'viem';
3
+ export type ProposalSummary = {
4
+ proposalId: string;
5
+ proposer: Address;
6
+ state: string;
7
+ description: string;
8
+ forWeightedVotes: string;
9
+ againstWeightedVotes: string;
10
+ abstainWeightedVotes: string;
11
+ quorumVotes: string;
12
+ voteStart: string;
13
+ voteEnd: string;
14
+ creationTime: number;
15
+ executionTime: number | null;
16
+ cancellationTime: number | null;
17
+ };
18
+ export type EcosystemProposal = ProposalSummary & {
19
+ governorAddress: Address;
20
+ };
21
+ /**
22
+ * Fetch proposals for a governor address from the subgraph.
23
+ * Returns most recent proposals first.
24
+ *
25
+ * NOTE: Subgraph only tracks on-chain events. States like DEFEATED, EXPIRED,
26
+ * and SUCCEEDED are computed by the governor contract and require RPC calls.
27
+ * The state field here reflects the last on-chain event state.
28
+ */
29
+ export declare function fetchProposals(chainId: SupportedChainId, governorAddress: Address, first?: number): Promise<ProposalSummary[]>;
30
+ /**
31
+ * Fetch proposals across ALL DTFs from the subgraph (no governor filter).
32
+ * Optionally filter by state. Returns most recent proposals first.
33
+ *
34
+ * NOTE: Same subgraph state caveat as fetchProposals — states like DEFEATED,
35
+ * EXPIRED, and SUCCEEDED are computed by the governor contract, not the subgraph.
36
+ */
37
+ export declare function fetchAllProposals(chainId: SupportedChainId, opts?: {
38
+ states?: string[];
39
+ first?: number;
40
+ }): Promise<EcosystemProposal[]>;
41
+ //# sourceMappingURL=fetch-proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-proposals.d.ts","sourceRoot":"","sources":["../../src/governance/fetch-proposals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG;IAChD,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AA+GD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,EACzB,eAAe,EAAE,OAAO,EACxB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC,CAgD5B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,EACzB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAuD9B"}