@claw-network/protocol 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/dist/contracts/events.d.ts +238 -0
- package/dist/contracts/events.d.ts.map +1 -0
- package/dist/contracts/events.js +499 -0
- package/dist/contracts/events.js.map +1 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +5 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/state.d.ts +16 -0
- package/dist/contracts/state.d.ts.map +1 -0
- package/dist/contracts/state.js +399 -0
- package/dist/contracts/state.js.map +1 -0
- package/dist/contracts/store.d.ts +19 -0
- package/dist/contracts/store.d.ts.map +1 -0
- package/dist/contracts/store.js +22 -0
- package/dist/contracts/store.js.map +1 -0
- package/dist/contracts/types.d.ts +81 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +2 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/dao/events.d.ts +191 -0
- package/dist/dao/events.d.ts.map +1 -0
- package/dist/dao/events.js +294 -0
- package/dist/dao/events.js.map +1 -0
- package/dist/dao/index.d.ts +6 -0
- package/dist/dao/index.d.ts.map +1 -0
- package/dist/dao/index.js +6 -0
- package/dist/dao/index.js.map +1 -0
- package/dist/dao/state.d.ts +44 -0
- package/dist/dao/state.d.ts.map +1 -0
- package/dist/dao/state.js +373 -0
- package/dist/dao/state.js.map +1 -0
- package/dist/dao/store.d.ts +47 -0
- package/dist/dao/store.d.ts.map +1 -0
- package/dist/dao/store.js +52 -0
- package/dist/dao/store.js.map +1 -0
- package/dist/dao/types.d.ts +149 -0
- package/dist/dao/types.d.ts.map +1 -0
- package/dist/dao/types.js +95 -0
- package/dist/dao/types.js.map +1 -0
- package/dist/dao/voting.d.ts +56 -0
- package/dist/dao/voting.d.ts.map +1 -0
- package/dist/dao/voting.js +129 -0
- package/dist/dao/voting.js.map +1 -0
- package/dist/identity/document.d.ts +35 -0
- package/dist/identity/document.d.ts.map +1 -0
- package/dist/identity/document.js +84 -0
- package/dist/identity/document.js.map +1 -0
- package/dist/identity/events.d.ts +96 -0
- package/dist/identity/events.d.ts.map +1 -0
- package/dist/identity/events.js +165 -0
- package/dist/identity/events.js.map +1 -0
- package/dist/identity/index.d.ts +4 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +4 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/resolver.d.ts +10 -0
- package/dist/identity/resolver.d.ts.map +1 -0
- package/dist/identity/resolver.js +10 -0
- package/dist/identity/resolver.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/markets/broadcast.d.ts +5 -0
- package/dist/markets/broadcast.d.ts.map +1 -0
- package/dist/markets/broadcast.js +9 -0
- package/dist/markets/broadcast.js.map +1 -0
- package/dist/markets/capability.d.ts +129 -0
- package/dist/markets/capability.d.ts.map +1 -0
- package/dist/markets/capability.js +262 -0
- package/dist/markets/capability.js.map +1 -0
- package/dist/markets/events.d.ts +448 -0
- package/dist/markets/events.d.ts.map +1 -0
- package/dist/markets/events.js +1074 -0
- package/dist/markets/events.js.map +1 -0
- package/dist/markets/index.d.ts +12 -0
- package/dist/markets/index.d.ts.map +1 -0
- package/dist/markets/index.js +12 -0
- package/dist/markets/index.js.map +1 -0
- package/dist/markets/info-flow.d.ts +144 -0
- package/dist/markets/info-flow.d.ts.map +1 -0
- package/dist/markets/info-flow.js +257 -0
- package/dist/markets/info-flow.js.map +1 -0
- package/dist/markets/info-store.d.ts +80 -0
- package/dist/markets/info-store.d.ts.map +1 -0
- package/dist/markets/info-store.js +384 -0
- package/dist/markets/info-store.js.map +1 -0
- package/dist/markets/info.d.ts +118 -0
- package/dist/markets/info.d.ts.map +1 -0
- package/dist/markets/info.js +123 -0
- package/dist/markets/info.js.map +1 -0
- package/dist/markets/search.d.ts +70 -0
- package/dist/markets/search.d.ts.map +1 -0
- package/dist/markets/search.js +659 -0
- package/dist/markets/search.js.map +1 -0
- package/dist/markets/state.d.ts +30 -0
- package/dist/markets/state.d.ts.map +1 -0
- package/dist/markets/state.js +610 -0
- package/dist/markets/state.js.map +1 -0
- package/dist/markets/store.d.ts +43 -0
- package/dist/markets/store.d.ts.map +1 -0
- package/dist/markets/store.js +460 -0
- package/dist/markets/store.js.map +1 -0
- package/dist/markets/task.d.ts +96 -0
- package/dist/markets/task.d.ts.map +1 -0
- package/dist/markets/task.js +286 -0
- package/dist/markets/task.js.map +1 -0
- package/dist/markets/types.d.ts +340 -0
- package/dist/markets/types.d.ts.map +1 -0
- package/dist/markets/types.js +88 -0
- package/dist/markets/types.js.map +1 -0
- package/dist/p2p/codec.d.ts +42 -0
- package/dist/p2p/codec.d.ts.map +1 -0
- package/dist/p2p/codec.js +187 -0
- package/dist/p2p/codec.js.map +1 -0
- package/dist/p2p/flatbuffers.d.ts +57 -0
- package/dist/p2p/flatbuffers.d.ts.map +1 -0
- package/dist/p2p/flatbuffers.js +418 -0
- package/dist/p2p/flatbuffers.js.map +1 -0
- package/dist/p2p/index.d.ts +3 -0
- package/dist/p2p/index.d.ts.map +1 -0
- package/dist/p2p/index.js +3 -0
- package/dist/p2p/index.js.map +1 -0
- package/dist/p2p/types.d.ts +79 -0
- package/dist/p2p/types.d.ts.map +1 -0
- package/dist/p2p/types.js +15 -0
- package/dist/p2p/types.js.map +1 -0
- package/dist/reputation/anti-cheat.d.ts +24 -0
- package/dist/reputation/anti-cheat.d.ts.map +1 -0
- package/dist/reputation/anti-cheat.js +109 -0
- package/dist/reputation/anti-cheat.js.map +1 -0
- package/dist/reputation/events.d.ts +29 -0
- package/dist/reputation/events.d.ts.map +1 -0
- package/dist/reputation/events.js +122 -0
- package/dist/reputation/events.js.map +1 -0
- package/dist/reputation/index.d.ts +6 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +6 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/scoring.d.ts +40 -0
- package/dist/reputation/scoring.d.ts.map +1 -0
- package/dist/reputation/scoring.js +114 -0
- package/dist/reputation/scoring.js.map +1 -0
- package/dist/reputation/state.d.ts +48 -0
- package/dist/reputation/state.d.ts.map +1 -0
- package/dist/reputation/state.js +135 -0
- package/dist/reputation/state.js.map +1 -0
- package/dist/reputation/store.d.ts +23 -0
- package/dist/reputation/store.d.ts.map +1 -0
- package/dist/reputation/store.js +33 -0
- package/dist/reputation/store.js.map +1 -0
- package/dist/wallet/events.d.ts +121 -0
- package/dist/wallet/events.d.ts.map +1 -0
- package/dist/wallet/events.js +175 -0
- package/dist/wallet/events.js.map +1 -0
- package/dist/wallet/finality.d.ts +4 -0
- package/dist/wallet/finality.d.ts.map +1 -0
- package/dist/wallet/finality.js +32 -0
- package/dist/wallet/finality.js.map +1 -0
- package/dist/wallet/index.d.ts +4 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +4 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/state.d.ts +32 -0
- package/dist/wallet/state.d.ts.map +1 -0
- package/dist/wallet/state.js +170 -0
- package/dist/wallet/state.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAO Governance — State & Reducer
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic state transitions for DAO events.
|
|
5
|
+
*/
|
|
6
|
+
import { eventHashHex } from '@claw-network/core/protocol';
|
|
7
|
+
import { isProposalStatus, PROPOSAL_THRESHOLDS } from './types.js';
|
|
8
|
+
export function createDaoState() {
|
|
9
|
+
return {
|
|
10
|
+
proposals: {},
|
|
11
|
+
proposalEvents: {},
|
|
12
|
+
votes: {},
|
|
13
|
+
voterIndex: {},
|
|
14
|
+
delegations: [],
|
|
15
|
+
delegationsByDelegator: {},
|
|
16
|
+
delegationsByDelegate: {},
|
|
17
|
+
timelock: {},
|
|
18
|
+
treasury: {
|
|
19
|
+
balance: '0',
|
|
20
|
+
allocationPolicy: {
|
|
21
|
+
development: 0.4,
|
|
22
|
+
nodeRewards: 0.3,
|
|
23
|
+
ecosystem: 0.2,
|
|
24
|
+
reserve: 0.1,
|
|
25
|
+
},
|
|
26
|
+
spendingLimits: {
|
|
27
|
+
perProposal: '1000000',
|
|
28
|
+
perQuarter: '5000000',
|
|
29
|
+
requireMultisig: '10000000',
|
|
30
|
+
},
|
|
31
|
+
totalSpent: '0',
|
|
32
|
+
spentThisQuarter: '0',
|
|
33
|
+
quarterStart: 0,
|
|
34
|
+
},
|
|
35
|
+
history: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Clone helpers
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function cloneState(state) {
|
|
42
|
+
return {
|
|
43
|
+
proposals: { ...state.proposals },
|
|
44
|
+
proposalEvents: { ...state.proposalEvents },
|
|
45
|
+
votes: { ...state.votes },
|
|
46
|
+
voterIndex: { ...state.voterIndex },
|
|
47
|
+
delegations: [...state.delegations],
|
|
48
|
+
delegationsByDelegator: { ...state.delegationsByDelegator },
|
|
49
|
+
delegationsByDelegate: { ...state.delegationsByDelegate },
|
|
50
|
+
timelock: { ...state.timelock },
|
|
51
|
+
treasury: { ...state.treasury },
|
|
52
|
+
history: [...state.history],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function parseAmount(value, field) {
|
|
56
|
+
try {
|
|
57
|
+
const parsed = BigInt(value);
|
|
58
|
+
if (parsed < 0n) {
|
|
59
|
+
throw new Error(`${field} must be >= 0`);
|
|
60
|
+
}
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new Error(`${field} must be a valid integer string`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function addAmount(current, delta, field) {
|
|
68
|
+
const base = parseAmount(current, field);
|
|
69
|
+
const next = base + delta;
|
|
70
|
+
if (next < 0n) {
|
|
71
|
+
throw new Error(`${field} would be negative`);
|
|
72
|
+
}
|
|
73
|
+
return next.toString();
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Reducer
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
export function applyDaoEvent(state, envelope) {
|
|
79
|
+
const type = String(envelope.type ?? '');
|
|
80
|
+
if (!type.startsWith('dao.')) {
|
|
81
|
+
return state;
|
|
82
|
+
}
|
|
83
|
+
const next = cloneState(state);
|
|
84
|
+
const payload = (envelope.payload ?? {});
|
|
85
|
+
const ts = typeof envelope.ts === 'number' ? envelope.ts : Date.now();
|
|
86
|
+
const issuer = typeof envelope.issuer === 'string' ? envelope.issuer : '';
|
|
87
|
+
const hash = typeof envelope.hash === 'string' && envelope.hash.length
|
|
88
|
+
? envelope.hash
|
|
89
|
+
: eventHashHex(envelope);
|
|
90
|
+
switch (type) {
|
|
91
|
+
case 'dao.proposal.create':
|
|
92
|
+
applyProposalCreate(next, payload, issuer, ts, hash);
|
|
93
|
+
break;
|
|
94
|
+
case 'dao.proposal.advance':
|
|
95
|
+
applyProposalAdvance(next, payload, hash);
|
|
96
|
+
break;
|
|
97
|
+
case 'dao.vote.cast':
|
|
98
|
+
applyVoteCast(next, payload, issuer, ts, hash);
|
|
99
|
+
break;
|
|
100
|
+
case 'dao.delegate.set':
|
|
101
|
+
applyDelegateSet(next, payload, issuer, ts);
|
|
102
|
+
break;
|
|
103
|
+
case 'dao.delegate.revoke':
|
|
104
|
+
applyDelegateRevoke(next, payload, issuer, ts);
|
|
105
|
+
break;
|
|
106
|
+
case 'dao.timelock.queue':
|
|
107
|
+
applyTimelockQueue(next, payload, ts);
|
|
108
|
+
break;
|
|
109
|
+
case 'dao.timelock.execute':
|
|
110
|
+
applyTimelockExecute(next, payload);
|
|
111
|
+
break;
|
|
112
|
+
case 'dao.timelock.cancel':
|
|
113
|
+
applyTimelockCancel(next, payload);
|
|
114
|
+
break;
|
|
115
|
+
case 'dao.treasury.deposit':
|
|
116
|
+
applyTreasuryDeposit(next, payload);
|
|
117
|
+
break;
|
|
118
|
+
case 'dao.treasury.spend':
|
|
119
|
+
applyTreasurySpend(next, payload);
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
return next;
|
|
123
|
+
}
|
|
124
|
+
next.history.push({ hash, type, ts, payload });
|
|
125
|
+
return next;
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Apply functions
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
function applyProposalCreate(state, payload, issuer, ts, hash) {
|
|
131
|
+
if (state.proposals[payload.proposalId]) {
|
|
132
|
+
throw new Error('proposal already exists');
|
|
133
|
+
}
|
|
134
|
+
const thresholds = PROPOSAL_THRESHOLDS[payload.type];
|
|
135
|
+
const discussionPeriod = payload.discussionPeriod || thresholds.discussionPeriod;
|
|
136
|
+
const votingPeriod = payload.votingPeriod || thresholds.votingPeriod;
|
|
137
|
+
const timelockDelay = payload.timelockDelay || thresholds.timelockDelay;
|
|
138
|
+
const discussionEndsAt = ts + discussionPeriod;
|
|
139
|
+
const votingStartsAt = discussionEndsAt;
|
|
140
|
+
const votingEndsAt = votingStartsAt + votingPeriod;
|
|
141
|
+
const expiresAt = votingEndsAt + timelockDelay + 30 * 24 * 60 * 60 * 1000; // 30 day grace
|
|
142
|
+
const proposal = {
|
|
143
|
+
id: payload.proposalId,
|
|
144
|
+
proposer: issuer,
|
|
145
|
+
type: payload.type,
|
|
146
|
+
title: payload.title,
|
|
147
|
+
description: payload.description,
|
|
148
|
+
discussionUrl: payload.discussionUrl,
|
|
149
|
+
actions: payload.actions,
|
|
150
|
+
timeline: {
|
|
151
|
+
createdAt: ts,
|
|
152
|
+
discussionEndsAt,
|
|
153
|
+
votingStartsAt,
|
|
154
|
+
votingEndsAt,
|
|
155
|
+
executionDelay: timelockDelay,
|
|
156
|
+
expiresAt,
|
|
157
|
+
},
|
|
158
|
+
votes: { for: '0', against: '0', abstain: '0' },
|
|
159
|
+
status: discussionPeriod > 0 ? 'discussion' : 'voting',
|
|
160
|
+
};
|
|
161
|
+
state.proposals[payload.proposalId] = proposal;
|
|
162
|
+
state.proposalEvents[payload.proposalId] = hash;
|
|
163
|
+
state.votes[payload.proposalId] = [];
|
|
164
|
+
state.voterIndex[payload.proposalId] = new Set();
|
|
165
|
+
}
|
|
166
|
+
function applyProposalAdvance(state, payload, hash) {
|
|
167
|
+
const proposal = state.proposals[payload.proposalId];
|
|
168
|
+
if (!proposal) {
|
|
169
|
+
throw new Error('proposal not found');
|
|
170
|
+
}
|
|
171
|
+
const newStatus = payload.newStatus;
|
|
172
|
+
if (!isProposalStatus(newStatus)) {
|
|
173
|
+
throw new Error('invalid proposal status');
|
|
174
|
+
}
|
|
175
|
+
// Validate status transitions
|
|
176
|
+
const validTransitions = {
|
|
177
|
+
draft: ['discussion', 'voting'],
|
|
178
|
+
discussion: ['voting'],
|
|
179
|
+
voting: ['passed', 'rejected'],
|
|
180
|
+
passed: ['queued', 'executed'],
|
|
181
|
+
queued: ['executed', 'vetoed'],
|
|
182
|
+
rejected: [],
|
|
183
|
+
executed: [],
|
|
184
|
+
expired: [],
|
|
185
|
+
vetoed: [],
|
|
186
|
+
};
|
|
187
|
+
const allowed = validTransitions[proposal.status] ?? [];
|
|
188
|
+
if (!allowed.includes(newStatus)) {
|
|
189
|
+
throw new Error(`cannot transition from ${proposal.status} to ${newStatus}`);
|
|
190
|
+
}
|
|
191
|
+
state.proposals[payload.proposalId] = { ...proposal, status: newStatus };
|
|
192
|
+
state.proposalEvents[payload.proposalId] = hash;
|
|
193
|
+
}
|
|
194
|
+
function applyVoteCast(state, payload, issuer, ts, hash) {
|
|
195
|
+
const proposal = state.proposals[payload.proposalId];
|
|
196
|
+
if (!proposal) {
|
|
197
|
+
throw new Error('proposal not found');
|
|
198
|
+
}
|
|
199
|
+
if (proposal.status !== 'voting') {
|
|
200
|
+
throw new Error('proposal is not in voting phase');
|
|
201
|
+
}
|
|
202
|
+
// Check duplicate vote
|
|
203
|
+
const voterSet = state.voterIndex[payload.proposalId];
|
|
204
|
+
if (voterSet && voterSet.has(issuer)) {
|
|
205
|
+
throw new Error('already voted');
|
|
206
|
+
}
|
|
207
|
+
const vote = {
|
|
208
|
+
voter: issuer,
|
|
209
|
+
proposalId: payload.proposalId,
|
|
210
|
+
option: payload.option,
|
|
211
|
+
power: payload.power,
|
|
212
|
+
reason: payload.reason,
|
|
213
|
+
ts,
|
|
214
|
+
hash,
|
|
215
|
+
};
|
|
216
|
+
// Record vote
|
|
217
|
+
const currentVotes = state.votes[payload.proposalId] ?? [];
|
|
218
|
+
state.votes[payload.proposalId] = [...currentVotes, vote];
|
|
219
|
+
const voterIndex = state.voterIndex[payload.proposalId] ?? new Set();
|
|
220
|
+
const newVoterIndex = new Set(voterIndex);
|
|
221
|
+
newVoterIndex.add(issuer);
|
|
222
|
+
state.voterIndex[payload.proposalId] = newVoterIndex;
|
|
223
|
+
// Update tally
|
|
224
|
+
const power = parseAmount(payload.power, 'power');
|
|
225
|
+
const updatedVotes = { ...proposal.votes };
|
|
226
|
+
updatedVotes[payload.option] = addAmount(updatedVotes[payload.option], power, payload.option);
|
|
227
|
+
state.proposals[payload.proposalId] = { ...proposal, votes: updatedVotes };
|
|
228
|
+
}
|
|
229
|
+
function applyDelegateSet(state, payload, issuer, ts) {
|
|
230
|
+
// Remove any existing delegation from this delegator to this delegate
|
|
231
|
+
state.delegations = state.delegations.filter((d) => !(d.delegator === issuer && d.delegate === payload.delegate && !d.revokedAt));
|
|
232
|
+
const delegation = {
|
|
233
|
+
delegator: issuer,
|
|
234
|
+
delegate: payload.delegate,
|
|
235
|
+
scope: payload.scope,
|
|
236
|
+
percentage: payload.percentage,
|
|
237
|
+
expiresAt: payload.expiresAt,
|
|
238
|
+
revokedAt: undefined,
|
|
239
|
+
createdAt: ts,
|
|
240
|
+
};
|
|
241
|
+
state.delegations.push(delegation);
|
|
242
|
+
// Update indices
|
|
243
|
+
const byDelegator = (state.delegationsByDelegator[issuer] ?? []).filter((d) => !(d.delegate === payload.delegate && !d.revokedAt));
|
|
244
|
+
byDelegator.push(delegation);
|
|
245
|
+
state.delegationsByDelegator[issuer] = byDelegator;
|
|
246
|
+
const byDelegate = (state.delegationsByDelegate[payload.delegate] ?? []).filter((d) => !(d.delegator === issuer && !d.revokedAt));
|
|
247
|
+
byDelegate.push(delegation);
|
|
248
|
+
state.delegationsByDelegate[payload.delegate] = byDelegate;
|
|
249
|
+
}
|
|
250
|
+
function applyDelegateRevoke(state, payload, issuer, ts) {
|
|
251
|
+
for (const d of state.delegations) {
|
|
252
|
+
if (d.delegator === issuer && d.delegate === payload.delegate && !d.revokedAt) {
|
|
253
|
+
d.revokedAt = ts;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Update indices to mark revoked
|
|
257
|
+
const byDelegator = state.delegationsByDelegator[issuer] ?? [];
|
|
258
|
+
for (const d of byDelegator) {
|
|
259
|
+
if (d.delegate === payload.delegate && !d.revokedAt) {
|
|
260
|
+
d.revokedAt = ts;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const byDelegate = state.delegationsByDelegate[payload.delegate] ?? [];
|
|
264
|
+
for (const d of byDelegate) {
|
|
265
|
+
if (d.delegator === issuer && !d.revokedAt) {
|
|
266
|
+
d.revokedAt = ts;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function applyTimelockQueue(state, payload, ts) {
|
|
271
|
+
if (state.timelock[payload.actionId]) {
|
|
272
|
+
throw new Error('action already queued');
|
|
273
|
+
}
|
|
274
|
+
state.timelock[payload.actionId] = {
|
|
275
|
+
actionId: payload.actionId,
|
|
276
|
+
proposalId: payload.proposalId,
|
|
277
|
+
action: payload.action,
|
|
278
|
+
queuedAt: ts,
|
|
279
|
+
executeAfter: payload.executeAfter,
|
|
280
|
+
status: 'queued',
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function applyTimelockExecute(state, payload) {
|
|
284
|
+
const entry = state.timelock[payload.actionId];
|
|
285
|
+
if (!entry) {
|
|
286
|
+
throw new Error('action not found');
|
|
287
|
+
}
|
|
288
|
+
if (entry.status !== 'queued') {
|
|
289
|
+
throw new Error('action is not queued');
|
|
290
|
+
}
|
|
291
|
+
state.timelock[payload.actionId] = { ...entry, status: 'executed' };
|
|
292
|
+
}
|
|
293
|
+
function applyTimelockCancel(state, payload) {
|
|
294
|
+
const entry = state.timelock[payload.actionId];
|
|
295
|
+
if (!entry) {
|
|
296
|
+
throw new Error('action not found');
|
|
297
|
+
}
|
|
298
|
+
if (entry.status !== 'queued') {
|
|
299
|
+
throw new Error('action is not queued');
|
|
300
|
+
}
|
|
301
|
+
state.timelock[payload.actionId] = { ...entry, status: 'cancelled' };
|
|
302
|
+
}
|
|
303
|
+
function applyTreasuryDeposit(state, payload) {
|
|
304
|
+
const amount = parseAmount(payload.amount, 'amount');
|
|
305
|
+
state.treasury = {
|
|
306
|
+
...state.treasury,
|
|
307
|
+
balance: addAmount(state.treasury.balance, amount, 'balance'),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
function applyTreasurySpend(state, payload) {
|
|
311
|
+
const amount = parseAmount(payload.amount, 'amount');
|
|
312
|
+
state.treasury = {
|
|
313
|
+
...state.treasury,
|
|
314
|
+
balance: addAmount(state.treasury.balance, -amount, 'balance'),
|
|
315
|
+
totalSpent: addAmount(state.treasury.totalSpent, amount, 'totalSpent'),
|
|
316
|
+
spentThisQuarter: addAmount(state.treasury.spentThisQuarter, amount, 'spentThisQuarter'),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// Query helpers
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
export function getProposal(state, proposalId) {
|
|
323
|
+
return state.proposals[proposalId];
|
|
324
|
+
}
|
|
325
|
+
export function listProposals(state, status) {
|
|
326
|
+
const all = Object.values(state.proposals);
|
|
327
|
+
if (!status)
|
|
328
|
+
return all;
|
|
329
|
+
return all.filter((p) => p.status === status);
|
|
330
|
+
}
|
|
331
|
+
export function getProposalVotes(state, proposalId) {
|
|
332
|
+
return state.votes[proposalId] ?? [];
|
|
333
|
+
}
|
|
334
|
+
export function getDelegationsFrom(state, delegator) {
|
|
335
|
+
return (state.delegationsByDelegator[delegator] ?? []).filter((d) => !d.revokedAt);
|
|
336
|
+
}
|
|
337
|
+
export function getDelegationsTo(state, delegate) {
|
|
338
|
+
return (state.delegationsByDelegate[delegate] ?? []).filter((d) => !d.revokedAt);
|
|
339
|
+
}
|
|
340
|
+
export function getTimelockEntry(state, actionId) {
|
|
341
|
+
return state.timelock[actionId];
|
|
342
|
+
}
|
|
343
|
+
export function listTimelockEntries(state) {
|
|
344
|
+
return Object.values(state.timelock);
|
|
345
|
+
}
|
|
346
|
+
export function getTreasury(state) {
|
|
347
|
+
return state.treasury;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if a proposal has passed (based on votes vs thresholds).
|
|
351
|
+
*/
|
|
352
|
+
export function checkProposalResult(state, proposalId, totalSupply) {
|
|
353
|
+
const proposal = state.proposals[proposalId];
|
|
354
|
+
if (!proposal) {
|
|
355
|
+
return { passed: false, forPct: 0, quorumMet: false };
|
|
356
|
+
}
|
|
357
|
+
const thresholds = PROPOSAL_THRESHOLDS[proposal.type];
|
|
358
|
+
const forVotes = BigInt(proposal.votes.for);
|
|
359
|
+
const againstVotes = BigInt(proposal.votes.against);
|
|
360
|
+
const abstainVotes = BigInt(proposal.votes.abstain);
|
|
361
|
+
const totalVoted = forVotes + againstVotes + abstainVotes;
|
|
362
|
+
const supply = BigInt(totalSupply);
|
|
363
|
+
const quorumMet = supply > 0n
|
|
364
|
+
? Number(totalVoted * 10000n / supply) / 10000 >= thresholds.quorum
|
|
365
|
+
: false;
|
|
366
|
+
const forPlusAgainst = forVotes + againstVotes;
|
|
367
|
+
const forPct = forPlusAgainst > 0n
|
|
368
|
+
? Number(forVotes * 10000n / forPlusAgainst) / 10000
|
|
369
|
+
: 0;
|
|
370
|
+
const passed = quorumMet && forPct >= thresholds.passThreshold;
|
|
371
|
+
return { passed, forPct, quorumMet };
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/dao/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAO Governance — Store
|
|
3
|
+
*
|
|
4
|
+
* Wraps the pure DAO state reducer behind an async interface
|
|
5
|
+
* for future persistence compatibility.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEnvelope } from '@claw-network/core/protocol';
|
|
8
|
+
import type { Proposal, ProposalStatus, Vote, Delegation, TimelockEntry, Treasury } from './types.js';
|
|
9
|
+
import { DaoState } from './state.js';
|
|
10
|
+
export interface DaoStore {
|
|
11
|
+
applyEvent(envelope: EventEnvelope): Promise<void>;
|
|
12
|
+
applyEvents(envelopes: EventEnvelope[]): Promise<void>;
|
|
13
|
+
getProposal(proposalId: string): Promise<Proposal | undefined>;
|
|
14
|
+
listProposals(status?: ProposalStatus): Promise<Proposal[]>;
|
|
15
|
+
getVotes(proposalId: string): Promise<Vote[]>;
|
|
16
|
+
getDelegationsFrom(delegator: string): Promise<Delegation[]>;
|
|
17
|
+
getDelegationsTo(delegate: string): Promise<Delegation[]>;
|
|
18
|
+
getTimelockEntry(actionId: string): Promise<TimelockEntry | undefined>;
|
|
19
|
+
listTimelockEntries(): Promise<TimelockEntry[]>;
|
|
20
|
+
getTreasury(): Promise<Treasury>;
|
|
21
|
+
checkProposalResult(proposalId: string, totalSupply: string): Promise<{
|
|
22
|
+
passed: boolean;
|
|
23
|
+
forPct: number;
|
|
24
|
+
quorumMet: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
getState(): Promise<DaoState>;
|
|
27
|
+
}
|
|
28
|
+
export declare class MemoryDaoStore implements DaoStore {
|
|
29
|
+
private state;
|
|
30
|
+
applyEvent(envelope: EventEnvelope): Promise<void>;
|
|
31
|
+
applyEvents(envelopes: EventEnvelope[]): Promise<void>;
|
|
32
|
+
getProposal(proposalId: string): Promise<Proposal | undefined>;
|
|
33
|
+
listProposals(status?: ProposalStatus): Promise<Proposal[]>;
|
|
34
|
+
getVotes(proposalId: string): Promise<Vote[]>;
|
|
35
|
+
getDelegationsFrom(delegator: string): Promise<Delegation[]>;
|
|
36
|
+
getDelegationsTo(delegate: string): Promise<Delegation[]>;
|
|
37
|
+
getTimelockEntry(actionId: string): Promise<TimelockEntry | undefined>;
|
|
38
|
+
listTimelockEntries(): Promise<TimelockEntry[]>;
|
|
39
|
+
getTreasury(): Promise<Treasury>;
|
|
40
|
+
checkProposalResult(proposalId: string, totalSupply: string): Promise<{
|
|
41
|
+
passed: boolean;
|
|
42
|
+
forPct: number;
|
|
43
|
+
quorumMet: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
getState(): Promise<DaoState>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/dao/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,UAAU,EACV,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,QAAQ,EAST,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC/D,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACvE,mBAAmB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAChD,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,mBAAmB,CACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC/B;AAMD,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAErC,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAI9D,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI3D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAI7C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI5D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAItE,mBAAmB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI/C,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAIhC,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;CAGpC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAO Governance — Store
|
|
3
|
+
*
|
|
4
|
+
* Wraps the pure DAO state reducer behind an async interface
|
|
5
|
+
* for future persistence compatibility.
|
|
6
|
+
*/
|
|
7
|
+
import { applyDaoEvent, checkProposalResult, createDaoState, getDelegationsFrom, getDelegationsTo, getProposal, getProposalVotes, getTimelockEntry, getTreasury, listProposals, listTimelockEntries, } from './state.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Memory Implementation
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export class MemoryDaoStore {
|
|
12
|
+
state = createDaoState();
|
|
13
|
+
async applyEvent(envelope) {
|
|
14
|
+
this.state = applyDaoEvent(this.state, envelope);
|
|
15
|
+
}
|
|
16
|
+
async applyEvents(envelopes) {
|
|
17
|
+
for (const envelope of envelopes) {
|
|
18
|
+
this.state = applyDaoEvent(this.state, envelope);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async getProposal(proposalId) {
|
|
22
|
+
return getProposal(this.state, proposalId);
|
|
23
|
+
}
|
|
24
|
+
async listProposals(status) {
|
|
25
|
+
return listProposals(this.state, status);
|
|
26
|
+
}
|
|
27
|
+
async getVotes(proposalId) {
|
|
28
|
+
return getProposalVotes(this.state, proposalId);
|
|
29
|
+
}
|
|
30
|
+
async getDelegationsFrom(delegator) {
|
|
31
|
+
return getDelegationsFrom(this.state, delegator);
|
|
32
|
+
}
|
|
33
|
+
async getDelegationsTo(delegate) {
|
|
34
|
+
return getDelegationsTo(this.state, delegate);
|
|
35
|
+
}
|
|
36
|
+
async getTimelockEntry(actionId) {
|
|
37
|
+
return getTimelockEntry(this.state, actionId);
|
|
38
|
+
}
|
|
39
|
+
async listTimelockEntries() {
|
|
40
|
+
return listTimelockEntries(this.state);
|
|
41
|
+
}
|
|
42
|
+
async getTreasury() {
|
|
43
|
+
return getTreasury(this.state);
|
|
44
|
+
}
|
|
45
|
+
async checkProposalResult(proposalId, totalSupply) {
|
|
46
|
+
return checkProposalResult(this.state, proposalId, totalSupply);
|
|
47
|
+
}
|
|
48
|
+
async getState() {
|
|
49
|
+
return this.state;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/dao/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EAEd,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAwBpB,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,OAAO,cAAc;IACjB,KAAK,GAAa,cAAc,EAAE,CAAC;IAE3C,KAAK,CAAC,UAAU,CAAC,QAAuB;QACtC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAA0B;QAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAuB;QACzC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC/B,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,UAAkB,EAClB,WAAmB;QAEnB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAO Governance Module — Domain Types
|
|
3
|
+
*
|
|
4
|
+
* Implements token-weighted voting with sqrt, reputation multiplier,
|
|
5
|
+
* lockup multiplier, and delegation as specified in docs/DAO.md.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PROPOSAL_TYPES: readonly ["parameter_change", "treasury_spend", "protocol_upgrade", "emergency", "signal"];
|
|
8
|
+
export type ProposalType = (typeof PROPOSAL_TYPES)[number];
|
|
9
|
+
export declare function isProposalType(value: string): value is ProposalType;
|
|
10
|
+
export declare const PROPOSAL_STATUSES: readonly ["draft", "discussion", "voting", "passed", "rejected", "queued", "executed", "expired", "vetoed"];
|
|
11
|
+
export type ProposalStatus = (typeof PROPOSAL_STATUSES)[number];
|
|
12
|
+
export declare function isProposalStatus(value: string): value is ProposalStatus;
|
|
13
|
+
export interface ParameterChangeAction {
|
|
14
|
+
type: 'parameter_change';
|
|
15
|
+
target: string;
|
|
16
|
+
currentValue: unknown;
|
|
17
|
+
newValue: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface TreasurySpendAction {
|
|
20
|
+
type: 'treasury_spend';
|
|
21
|
+
recipient: string;
|
|
22
|
+
amount: string;
|
|
23
|
+
token: string;
|
|
24
|
+
purpose: string;
|
|
25
|
+
vestingSchedule?: {
|
|
26
|
+
cliff: number;
|
|
27
|
+
duration: number;
|
|
28
|
+
interval: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface ContractUpgradeAction {
|
|
32
|
+
type: 'contract_upgrade';
|
|
33
|
+
contract: string;
|
|
34
|
+
newImplementation: string;
|
|
35
|
+
migrationData?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface EmergencyAction {
|
|
38
|
+
type: 'emergency';
|
|
39
|
+
action: 'pause' | 'unpause' | 'upgrade';
|
|
40
|
+
target: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
}
|
|
43
|
+
export type ProposalAction = ParameterChangeAction | TreasurySpendAction | ContractUpgradeAction | EmergencyAction;
|
|
44
|
+
export declare const VOTE_OPTIONS: readonly ["for", "against", "abstain"];
|
|
45
|
+
export type VoteOption = (typeof VOTE_OPTIONS)[number];
|
|
46
|
+
export declare function isVoteOption(value: string): value is VoteOption;
|
|
47
|
+
export interface Vote {
|
|
48
|
+
voter: string;
|
|
49
|
+
proposalId: string;
|
|
50
|
+
option: VoteOption;
|
|
51
|
+
power: string;
|
|
52
|
+
reason?: string;
|
|
53
|
+
ts: number;
|
|
54
|
+
hash: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ProposalTimeline {
|
|
57
|
+
createdAt: number;
|
|
58
|
+
discussionEndsAt: number;
|
|
59
|
+
votingStartsAt: number;
|
|
60
|
+
votingEndsAt: number;
|
|
61
|
+
executionDelay: number;
|
|
62
|
+
expiresAt: number;
|
|
63
|
+
}
|
|
64
|
+
export interface ProposalVotes {
|
|
65
|
+
for: string;
|
|
66
|
+
against: string;
|
|
67
|
+
abstain: string;
|
|
68
|
+
}
|
|
69
|
+
export interface Proposal {
|
|
70
|
+
id: string;
|
|
71
|
+
proposer: string;
|
|
72
|
+
type: ProposalType;
|
|
73
|
+
title: string;
|
|
74
|
+
description: string;
|
|
75
|
+
discussionUrl?: string;
|
|
76
|
+
actions: ProposalAction[];
|
|
77
|
+
timeline: ProposalTimeline;
|
|
78
|
+
votes: ProposalVotes;
|
|
79
|
+
status: ProposalStatus;
|
|
80
|
+
resourcePrev?: string | null;
|
|
81
|
+
}
|
|
82
|
+
export interface DelegationScope {
|
|
83
|
+
proposalTypes?: ProposalType[];
|
|
84
|
+
topics?: string[];
|
|
85
|
+
all?: boolean;
|
|
86
|
+
}
|
|
87
|
+
export interface Delegation {
|
|
88
|
+
delegator: string;
|
|
89
|
+
delegate: string;
|
|
90
|
+
scope: DelegationScope;
|
|
91
|
+
percentage: number;
|
|
92
|
+
expiresAt?: number;
|
|
93
|
+
revokedAt?: number;
|
|
94
|
+
createdAt: number;
|
|
95
|
+
}
|
|
96
|
+
export interface TreasuryAllocationPolicy {
|
|
97
|
+
development: number;
|
|
98
|
+
nodeRewards: number;
|
|
99
|
+
ecosystem: number;
|
|
100
|
+
reserve: number;
|
|
101
|
+
}
|
|
102
|
+
export interface TreasurySpendingLimits {
|
|
103
|
+
perProposal: string;
|
|
104
|
+
perQuarter: string;
|
|
105
|
+
requireMultisig: string;
|
|
106
|
+
}
|
|
107
|
+
export interface Treasury {
|
|
108
|
+
balance: string;
|
|
109
|
+
allocationPolicy: TreasuryAllocationPolicy;
|
|
110
|
+
spendingLimits: TreasurySpendingLimits;
|
|
111
|
+
totalSpent: string;
|
|
112
|
+
spentThisQuarter: string;
|
|
113
|
+
quarterStart: number;
|
|
114
|
+
}
|
|
115
|
+
export type TimelockStatus = 'queued' | 'executed' | 'cancelled';
|
|
116
|
+
export interface TimelockEntry {
|
|
117
|
+
actionId: string;
|
|
118
|
+
proposalId: string;
|
|
119
|
+
action: ProposalAction;
|
|
120
|
+
queuedAt: number;
|
|
121
|
+
executeAfter: number;
|
|
122
|
+
status: TimelockStatus;
|
|
123
|
+
}
|
|
124
|
+
export interface VotingPower {
|
|
125
|
+
tokenPower: number;
|
|
126
|
+
lockupMultiplier: number;
|
|
127
|
+
reputationMultiplier: number;
|
|
128
|
+
delegatedPower: number;
|
|
129
|
+
totalPower: number;
|
|
130
|
+
}
|
|
131
|
+
export interface ProposalThreshold {
|
|
132
|
+
createThreshold: number;
|
|
133
|
+
passThreshold: number;
|
|
134
|
+
quorum: number;
|
|
135
|
+
discussionPeriod: number;
|
|
136
|
+
votingPeriod: number;
|
|
137
|
+
timelockDelay: number;
|
|
138
|
+
}
|
|
139
|
+
export declare const PROPOSAL_THRESHOLDS: Record<ProposalType, ProposalThreshold>;
|
|
140
|
+
export interface GovernanceParams {
|
|
141
|
+
proposalThreshold: number;
|
|
142
|
+
quorum: number;
|
|
143
|
+
votingDelay: number;
|
|
144
|
+
votingPeriod: number;
|
|
145
|
+
timelockDelay: number;
|
|
146
|
+
passThreshold: number;
|
|
147
|
+
}
|
|
148
|
+
export declare const DEFAULT_GOVERNANCE_PARAMS: GovernanceParams;
|
|
149
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dao/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,cAAc,4FAMjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAMD,eAAO,MAAM,iBAAiB,6GAUpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAMD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,qBAAqB,GACrB,eAAe,CAAC;AAMpB,eAAO,MAAM,YAAY,wCAAyC,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAMD,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,cAAc,EAAE,sBAAsB,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAMD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE,iBAAiB,CAyCvE,CAAC;AAMF,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAOvC,CAAC"}
|