Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

types.gno

27.56 Kb · 679 lines
  1package governance
  2
  3import (
  4	rotree "gno.land/p/nt/bptree/rotree/v0"
  5	bptree "gno.land/p/nt/bptree/v0"
  6)
  7
  8type IGovernance interface {
  9	IGovernanceManager
 10	IGovernanceGetter
 11	Render(path string) string
 12}
 13
 14type IGovernanceManager interface {
 15	// Proposal management
 16	// ProposeText creates a non-executable proposal for community discussion.
 17	//
 18	// Parameters:
 19	//   - _: Noncrossing implementation-call discriminator; pass 0.
 20	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
 21	//   - title: short, non-empty title describing the proposal.
 22	//   - description: non-empty proposal rationale and discussion text.
 23	//
 24	// Returns:
 25	//   - int64: ID assigned to the newly created text proposal.
 26	ProposeText(
 27		_ int, rlm realm,
 28		title string,
 29		description string,
 30	) int64
 31
 32	// ProposeCommunityPoolSpend creates a proposal to transfer registered tokens from the community pool.
 33	//
 34	// Parameters:
 35	//   - _: Noncrossing implementation-call discriminator; pass 0.
 36	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
 37	//   - title: short title describing the requested disbursement.
 38	//   - description: rationale and budget details for the disbursement.
 39	//   - to: recipient address for the community-pool transfer.
 40	//   - tokenPath: registered token realm path to transfer.
 41	//   - amount: positive transfer amount in the token's smallest unit.
 42	//
 43	// Returns:
 44	//   - int64: ID assigned to the newly created community-pool-spend proposal.
 45	ProposeCommunityPoolSpend(
 46		_ int, rlm realm,
 47		title string,
 48		description string,
 49		to address,
 50		tokenPath string,
 51		amount int64,
 52	) int64
 53
 54	// ProposeParameterChange creates a proposal containing registered parameter-handler executions.
 55	//
 56	// Parameters:
 57	//   - _: Noncrossing implementation-call discriminator; pass 0.
 58	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
 59	//   - title: short title describing the parameter changes.
 60	//   - description: rationale and impact details for the changes.
 61	//   - numToExecute: number of encoded parameter-change executions expected.
 62	//   - executions: execution messages encoded with the governance execution delimiters.
 63	//
 64	// Returns:
 65	//   - int64: ID assigned to the newly created parameter-change proposal.
 66	ProposeParameterChange(
 67		_ int, rlm realm,
 68		title string,
 69		description string,
 70		numToExecute int64,
 71		executions string,
 72	) int64
 73
 74	// Voting
 75	// Vote records the caller's final yes or no vote on a proposal.
 76	//
 77	// Parameters:
 78	//   - _: Noncrossing implementation-call discriminator; pass 0.
 79	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
 80	//   - proposalId: ID of the proposal to vote on.
 81	//   - yes: true to cast an affirmative vote, false to cast a negative vote.
 82	//
 83	// Returns:
 84	//   - string: caller's applied voting weight formatted as a decimal string.
 85	Vote(
 86		_ int, rlm realm,
 87		proposalId int64,
 88		yes bool,
 89	) string
 90
 91	// Execution
 92	// Execute applies an approved executable proposal within its delay and execution window.
 93	//
 94	// Parameters:
 95	//   - _: Noncrossing implementation-call discriminator; pass 0.
 96	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
 97	//   - proposalId: ID of the proposal to execute.
 98	//
 99	// Returns:
100	//   - int64: ID of the proposal successfully executed.
101	Execute(
102		_ int, rlm realm,
103		proposalId int64,
104	) int64
105
106	// Cancel marks an upcoming proposal as cancelled at the request of its proposer.
107	//
108	// Parameters:
109	//   - _: Noncrossing implementation-call discriminator; pass 0.
110	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
111	//   - proposalId: ID of the proposal to cancel.
112	//
113	// Returns:
114	//   - int64: ID of the proposal successfully cancelled.
115	Cancel(
116		_ int, rlm realm,
117		proposalId int64,
118	) int64
119
120	// RemoveInactiveProposalFromIndex removes an inactive proposal from the snapshot index.
121	//
122	// Parameters:
123	//   - _: Noncrossing implementation-call discriminator; pass 0.
124	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
125	//   - proposalID: ID of the inactive proposal index entry to remove.
126	RemoveInactiveProposalFromIndex(_ int, rlm realm, proposalID int64)
127
128	// Configuration
129	// Reconfigure validates and stores a new governance configuration version.
130	//
131	// Parameters:
132	//   - _: Noncrossing implementation-call discriminator; pass 0.
133	//   - rlm: Current realm context forwarded unchanged by the governance proxy.
134	//   - votingStartDelay: seconds from proposal creation until voting opens.
135	//   - votingPeriod: seconds for which voting remains open.
136	//   - votingWeightSmoothingDuration: seconds used to smooth delegation history for voting weight.
137	//   - quorum: required approval percentage of total xGNS supply, from 0 through 100.
138	//   - proposalCreationThreshold: minimum xGNS amount required to create a proposal.
139	//   - executionDelay: seconds required between approval and execution.
140	//   - executionWindow: seconds after the delay during which execution is allowed.
141	//
142	// Returns:
143	//   - int64: newly stored governance configuration version.
144	Reconfigure(
145		_ int, rlm realm,
146		votingStartDelay int64,
147		votingPeriod int64,
148		votingWeightSmoothingDuration int64,
149		quorum int64,
150		proposalCreationThreshold int64,
151		executionDelay int64,
152		executionWindow int64,
153	) int64
154}
155
156// IGovernanceGetter provides read-only access to governance data.
157type IGovernanceGetter interface {
158	// Store data getters
159	// GetLatestConfigVersion returns the version number of the current governance configuration.
160	//
161	// Returns:
162	//   - int64: current configuration version used for new proposals.
163	GetLatestConfigVersion() int64
164	// GetCurrentProposalID returns the current proposal ID counter value.
165	//
166	// Returns:
167	//   - int64: current proposal identifier counter value.
168	GetCurrentProposalID() int64
169	// GetMaxSmoothingPeriod returns the upper bound for the voting-weight smoothing period.
170	//
171	// Returns:
172	//   - int64: fixed maximum smoothing duration of 30 days (2,592,000 seconds).
173	GetMaxSmoothingPeriod() int64
174
175	// Config getters
176	// GetLatestConfig returns the current governance configuration.
177	//
178	// Returns:
179	//   - Config: latest stored configuration, or a zero configuration when unavailable.
180	//   - error: nil when found; otherwise an error indicating that the configuration is unavailable.
181	GetLatestConfig() (Config, error)
182	// GetConfig returns a governance configuration by version.
183	//
184	// Parameters:
185	//   - configVersion: configuration version to retrieve.
186	//
187	// Returns:
188	//   - Config: configuration stored at the requested version, or a zero configuration when absent.
189	//   - error: nil when found; otherwise an error identifying the missing version.
190	GetConfig(configVersion int64) (Config, error)
191
192	// GetProposals returns a read-only view of stored proposals keyed by decimal proposal ID.
193	//
194	// Returns:
195	//   - *rotree.ReadOnlyTree: read-only proposal tree with cloned proposal values.
196	GetProposals() *rotree.ReadOnlyTree
197	// ExistsProposal reports whether a proposal is stored for an ID.
198	//
199	// Parameters:
200	//   - proposalID: proposal identifier to look up.
201	//
202	// Returns:
203	//   - bool: true when a proposal exists for proposalID.
204	ExistsProposal(proposalID int64) bool
205	// GetProposerByProposalId returns the address that created a proposal.
206	//
207	// Parameters:
208	//   - proposalId: proposal identifier to look up.
209	//
210	// Returns:
211	//   - address: proposer address recorded on the proposal.
212	//   - error: nil when found; otherwise an error indicating the proposal is missing.
213	GetProposerByProposalId(proposalId int64) (address, error)
214	// GetProposalTypeByProposalId returns the type discriminator of a proposal.
215	//
216	// Parameters:
217	//   - proposalId: proposal identifier to look up.
218	//
219	// Returns:
220	//   - ProposalType: proposal type stored on the proposal.
221	//   - error: nil when found; otherwise an error indicating the proposal is missing.
222	GetProposalTypeByProposalId(proposalId int64) (ProposalType, error)
223	// GetProposalCreatedAt returns a proposal's creation timestamp.
224	//
225	// Parameters:
226	//   - proposalId: proposal identifier to look up.
227	//
228	// Returns:
229	//   - int64: creation time as a Unix timestamp in seconds.
230	//   - error: nil when found; otherwise an error indicating the proposal is missing.
231	GetProposalCreatedAt(proposalId int64) (int64, error)
232	// GetProposalCreatedHeight returns the block height at which a proposal was created.
233	//
234	// Parameters:
235	//   - proposalId: proposal identifier to look up.
236	//
237	// Returns:
238	//   - int64: creation block height.
239	//   - error: nil when found; otherwise an error indicating the proposal is missing.
240	GetProposalCreatedHeight(proposalId int64) (int64, error)
241	// GetProposalCommunityPoolSpendInfo returns the treasury-transfer payload of a proposal.
242	//
243	// Parameters:
244	//   - proposalID: proposal identifier to look up.
245	//
246	// Returns:
247	//   - *CommunityPoolSpendInfo: spend payload, or nil when the proposal is absent or another type.
248	//   - error: nil for a community-pool-spend proposal; otherwise a not-found or wrong-type error.
249	GetProposalCommunityPoolSpendInfo(proposalID int64) (*CommunityPoolSpendInfo, error)
250	// GetProposalExecutionInfo returns the parameter-execution payload of a proposal.
251	//
252	// Parameters:
253	//   - proposalID: proposal identifier to look up.
254	//
255	// Returns:
256	//   - *ExecutionInfo: execution payload, or nil when the proposal is absent or another type.
257	//   - error: nil for a parameter-change proposal; otherwise a not-found or wrong-type error.
258	GetProposalExecutionInfo(proposalID int64) (*ExecutionInfo, error)
259	// GetYeaByProposalId returns the affirmative vote weight recorded on a proposal.
260	//
261	// Parameters:
262	//   - proposalId: proposal identifier to look up.
263	//
264	// Returns:
265	//   - int64: total yes-vote weight.
266	//   - error: nil when found; otherwise an error indicating the proposal is missing.
267	GetYeaByProposalId(proposalId int64) (int64, error)
268	// GetNayByProposalId returns the negative vote weight recorded on a proposal.
269	//
270	// Parameters:
271	//   - proposalId: proposal identifier to look up.
272	//
273	// Returns:
274	//   - int64: total no-vote weight.
275	//   - error: nil when found; otherwise an error indicating the proposal is missing.
276	GetNayByProposalId(proposalId int64) (int64, error)
277	// GetConfigVersionByProposalId returns the configuration version captured by a proposal.
278	//
279	// Parameters:
280	//   - proposalId: proposal identifier to look up.
281	//
282	// Returns:
283	//   - int64: configuration version used to create the proposal.
284	//   - error: nil when found; otherwise an error indicating the proposal is missing.
285	GetConfigVersionByProposalId(proposalId int64) (int64, error)
286	// GetQuorumAmountByProposalId returns the proposal's stored quorum requirement.
287	//
288	// Parameters:
289	//   - proposalId: proposal identifier to look up.
290	//
291	// Returns:
292	//   - int64: minimum vote weight required for quorum.
293	//   - error: nil when found; otherwise an error indicating the proposal is missing.
294	GetQuorumAmountByProposalId(proposalId int64) (int64, error)
295	// GetTitleByProposalId returns a proposal's title.
296	//
297	// Parameters:
298	//   - proposalId: proposal identifier to look up.
299	//
300	// Returns:
301	//   - string: title stored in proposal metadata.
302	//   - error: nil when found; otherwise an error indicating the proposal is missing.
303	GetTitleByProposalId(proposalId int64) (string, error)
304	// GetDescriptionByProposalId returns a proposal's full description.
305	//
306	// Parameters:
307	//   - proposalId: proposal identifier to look up.
308	//
309	// Returns:
310	//   - string: description stored in proposal metadata.
311	//   - error: nil when found; otherwise an error indicating the proposal is missing.
312	GetDescriptionByProposalId(proposalId int64) (string, error)
313	// GetProposalStatusByProposalId returns the current status string for a proposal.
314	//
315	// Parameters:
316	//   - proposalId: proposal identifier to look up.
317	//
318	// Returns:
319	//   - string: status computed from the proposal state and current time.
320	//   - error: nil when found; otherwise an error indicating the proposal is missing.
321	GetProposalStatusByProposalId(proposalId int64) (string, error)
322
323	// Vote getters
324	// GetVoteStatus returns the quorum and vote tallies stored for a proposal.
325	//
326	// Parameters:
327	//   - proposalId: proposal identifier to look up.
328	//
329	// Returns:
330	//   - quorum: minimum vote weight required for quorum.
331	//   - maxVotingWeight: maximum voting weight captured at proposal creation.
332	//   - yesWeight: total affirmative vote weight.
333	//   - noWeight: total negative vote weight.
334	//   - err: nil when found; otherwise an error indicating the proposal is missing.
335	GetVoteStatus(proposalId int64) (quorum, maxVotingWeight, yesWeight, noWeight int64, err error)
336	// GetVotingInfos returns a read-only view of a proposal's voter records.
337	//
338	// Parameters:
339	//   - proposalID: proposal identifier whose voting records should be viewed.
340	//
341	// Returns:
342	//   - *rotree.ReadOnlyTree: read-only voter-info tree, or nil when its stored tree is absent.
343	GetVotingInfos(proposalID int64) *rotree.ReadOnlyTree
344	// ExistsVotingInfo reports whether an address has a voting record for a proposal.
345	//
346	// Parameters:
347	//   - proposalID: proposal identifier to inspect.
348	//   - addr: voter address to look up.
349	//
350	// Returns:
351	//   - bool: true when a voting record exists for the proposal and address.
352	ExistsVotingInfo(proposalID int64, addr address) bool
353	// GetVoteWeight returns the recorded voting weight for an address.
354	//
355	// Parameters:
356	//   - proposalID: proposal identifier to inspect.
357	//   - addr: voter address to look up.
358	//
359	// Returns:
360	//   - int64: weight applied to the address's vote.
361	//   - error: nil when a voting record exists; otherwise an error identifying the missing record.
362	GetVoteWeight(proposalID int64, addr address) (int64, error)
363	// GetVotedHeight returns the block height at which an address voted.
364	//
365	// Parameters:
366	//   - proposalID: proposal identifier to inspect.
367	//   - addr: voter address to look up.
368	//
369	// Returns:
370	//   - int64: block height recorded for the vote.
371	//   - error: nil when a voting record exists; otherwise an error identifying the missing record.
372	GetVotedHeight(proposalID int64, addr address) (int64, error)
373	// GetVotedAt returns the timestamp at which an address voted.
374	//
375	// Parameters:
376	//   - proposalID: proposal identifier to inspect.
377	//   - addr: voter address to look up.
378	//
379	// Returns:
380	//   - int64: vote timestamp as Unix seconds.
381	//   - error: nil when a voting record exists; otherwise an error identifying the missing record.
382	GetVotedAt(proposalID int64, addr address) (int64, error)
383
384	// GetUserProposals returns a read-only view of proposal IDs grouped by creator address.
385	//
386	// Returns:
387	//   - *rotree.ReadOnlyTree: read-only creator-to-proposal-ID tree with copied ID slices.
388	GetUserProposals() *rotree.ReadOnlyTree
389
390	// Active proposal query
391	// GetOldestActiveProposalSnapshotTime inspects the first timestamp-ordered active-proposal index entry.
392	//
393	// Returns:
394	//   - snapshotTime: snapshot timestamp of the oldest active proposal.
395	//   - hasActive: true when an active indexed proposal was found; false when the index is empty.
396	//   - error: nil on success; otherwise an error when the index entry is missing or needs cleanup.
397	GetOldestActiveProposalSnapshotTime() (int64, bool, error)
398
399	// Voting weight snapshot getters
400	// GetCurrentVotingWeightSnapshot computes the current total voting weight and its smoothed timestamp anchor.
401	//
402	// Returns:
403	//   - totalVotingWeight: total delegation weight at the computed snapshot.
404	//   - snapshotTime: Unix timestamp used as the snapshot anchor.
405	//   - error: nil when the current configuration and snapshot are available; otherwise the lookup error.
406	GetCurrentVotingWeightSnapshot() (int64, int64, error)
407}
408
409type IGovernanceStore interface {
410	// Counter methods
411	// HasConfigCounterStoreKey reports whether the configuration counter key exists.
412	//
413	// Returns:
414	//   - bool: true when the configuration counter is present in persistent storage.
415	HasConfigCounterStoreKey() bool
416	// GetConfigCounter returns the persisted configuration-version counter.
417	//
418	// Returns:
419	//   - *Counter: stored configuration counter; underlying storage/type failures panic.
420	GetConfigCounter() *Counter
421	// SetConfigCounter persists the configuration-version counter.
422	//
423	// Parameters:
424	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
425	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
426	//   - counter: counter value to store.
427	//
428	// Returns:
429	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
430	SetConfigCounter(_ int, rlm realm, counter *Counter) error
431
432	// HasProposalCounterStoreKey reports whether the proposal counter key exists.
433	//
434	// Returns:
435	//   - bool: true when the proposal counter is present in persistent storage.
436	HasProposalCounterStoreKey() bool
437	// GetProposalCounter returns the persisted proposal-ID counter.
438	//
439	// Returns:
440	//   - *Counter: stored proposal counter; underlying storage/type failures panic.
441	GetProposalCounter() *Counter
442	// SetProposalCounter persists the proposal-ID counter.
443	//
444	// Parameters:
445	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
446	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
447	//   - counter: counter value to store.
448	//
449	// Returns:
450	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
451	SetProposalCounter(_ int, rlm realm, counter *Counter) error
452
453	// Config methods
454	// HasConfigsStoreKey reports whether the configurations tree key exists.
455	//
456	// Returns:
457	//   - bool: true when the configurations tree is present in persistent storage.
458	HasConfigsStoreKey() bool
459	// SetConfigs replaces the persisted configuration-version tree.
460	//
461	// Parameters:
462	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
463	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
464	//   - configs: configuration-version tree to store.
465	//
466	// Returns:
467	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
468	SetConfigs(_ int, rlm realm, configs *bptree.BPTree) error
469	// SetConfig stores one configuration under its version key.
470	//
471	// Parameters:
472	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
473	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
474	//   - version: configuration version key.
475	//   - config: configuration value to store.
476	//
477	// Returns:
478	//   - error: nil when persisted; otherwise a spoofed-realm, missing-tree, or key-value store error.
479	SetConfig(_ int, rlm realm, version int64, config Config) error
480	// GetConfig retrieves one configuration from the persisted version tree.
481	//
482	// Parameters:
483	//   - version: configuration version key to look up.
484	//
485	// Returns:
486	//   - Config: stored configuration, or its zero value when absent; wrong stored types panic.
487	//   - bool: true when a configuration exists for version.
488	GetConfig(version int64) (Config, bool)
489
490	// Proposal methods
491	// HasProposalsStoreKey reports whether the proposals tree key exists.
492	//
493	// Returns:
494	//   - bool: true when the proposals tree is present in persistent storage.
495	HasProposalsStoreKey() bool
496	// GetProposals returns the mutable domain-owned proposals tree.
497	//
498	// Returns:
499	//   - *bptree.BPTree: stored proposal tree keyed by proposal ID string; storage/type failures panic.
500	GetProposals() *bptree.BPTree
501	// GetProposal retrieves a proposal by numeric ID.
502	//
503	// Parameters:
504	//   - proposalID: proposal identifier used as the tree key.
505	//
506	// Returns:
507	//   - *Proposal: stored proposal when present and correctly typed.
508	//   - bool: true when a valid proposal exists for proposalID.
509	GetProposal(proposalID int64) (*Proposal, bool)
510	// SetProposal stores a proposal under its matching numeric ID.
511	//
512	// Parameters:
513	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
514	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
515	//   - proposalID: storage key that must match proposal.ID().
516	//   - proposal: proposal value to persist.
517	//
518	// Returns:
519	//   - error: nil when persisted; otherwise a spoofed-realm, missing-tree, or ID-mismatch error.
520	SetProposal(_ int, rlm realm, proposalID int64, proposal *Proposal) error
521	// SetProposals replaces the persisted proposals tree.
522	//
523	// Parameters:
524	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
525	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
526	//   - proposals: proposal tree to persist.
527	//
528	// Returns:
529	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
530	SetProposals(_ int, rlm realm, proposals *bptree.BPTree) error
531
532	// HasActiveProposalsBySnapshotStoreKey reports whether the active-proposal snapshot index exists.
533	//
534	// Returns:
535	//   - bool: true when the timestamp-ordered active-proposal index is present.
536	HasActiveProposalsBySnapshotStoreKey() bool
537	// GetActiveProposalsBySnapshot returns the domain-owned active-proposal snapshot index.
538	//
539	// Returns:
540	//   - *bptree.BPTree: index keyed by snapshot timestamp and containing proposal IDs; storage/type failures panic.
541	GetActiveProposalsBySnapshot() *bptree.BPTree
542	// SetActiveProposalsBySnapshot replaces the active-proposal snapshot index.
543	//
544	// Parameters:
545	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
546	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
547	//   - tree: timestamp-ordered active-proposal index to persist.
548	//
549	// Returns:
550	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
551	SetActiveProposalsBySnapshot(_ int, rlm realm, tree *bptree.BPTree) error
552
553	// Proposal voting info methods
554	// HasProposalUserVotingInfosStoreKey reports whether the root voting-info tree exists.
555	//
556	// Returns:
557	//   - bool: true when proposal voting-info storage is present.
558	HasProposalUserVotingInfosStoreKey() bool
559	// GetProposalUserVotingInfos returns the root proposal-to-voter-info tree.
560	//
561	// Returns:
562	//   - *bptree.BPTree: stored tree containing one voter-info tree per proposal; storage/type failures panic.
563	GetProposalUserVotingInfos() *bptree.BPTree
564	// SetProposalUserVotingInfos replaces the root proposal-to-voter-info tree.
565	//
566	// Parameters:
567	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
568	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
569	//   - votingInfos: root proposal-to-voter-info tree to persist.
570	//
571	// Returns:
572	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
573	SetProposalUserVotingInfos(_ int, rlm realm, votingInfos *bptree.BPTree) error
574	// GetProposalVotingInfos returns the voter-info tree for one proposal.
575	//
576	// Parameters:
577	//   - proposalID: proposal identifier used as the root-tree key.
578	//
579	// Returns:
580	//   - *bptree.BPTree: voter-address-to-voting-info tree when present.
581	//   - bool: true when the proposal has a correctly typed voter-info tree.
582	GetProposalVotingInfos(proposalID int64) (*bptree.BPTree, bool)
583	// SetProposalVotingInfos stores one proposal's voter-info tree.
584	//
585	// Parameters:
586	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
587	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
588	//   - proposalID: proposal identifier used as the root-tree key.
589	//   - votingInfos: voter-address-to-voting-info tree to persist.
590	//
591	// Returns:
592	//   - error: nil when persisted; otherwise a spoofed-realm, missing-tree, or key-value store error.
593	SetProposalVotingInfos(_ int, rlm realm, proposalID int64, votingInfos *bptree.BPTree) error
594
595	// User proposals methods
596	// HasUserProposalsStoreKey reports whether the user-to-proposal index exists.
597	//
598	// Returns:
599	//   - bool: true when user proposal storage is present.
600	HasUserProposalsStoreKey() bool
601	// GetUserProposals returns the domain-owned user-to-proposal index tree.
602	//
603	// Returns:
604	//   - *bptree.BPTree: tree mapping user strings to proposal-ID slices; storage/type failures panic.
605	GetUserProposals() *bptree.BPTree
606	// GetUserProposalIDs returns proposal IDs currently indexed for a user.
607	//
608	// Parameters:
609	//   - user: user-string key in the user-to-proposals index.
610	//
611	// Returns:
612	//   - []int64: proposal IDs indexed for user, or nil when absent; wrong stored types panic.
613	//   - bool: true when the user has an index entry.
614	GetUserProposalIDs(user string) ([]int64, bool)
615	// SetUserProposals replaces the persisted user-to-proposal index.
616	//
617	// Parameters:
618	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
619	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
620	//   - userProposals: user-to-proposal index tree to persist.
621	//
622	// Returns:
623	//   - error: nil when persisted; otherwise a spoofed-realm or key-value store error.
624	SetUserProposals(_ int, rlm realm, userProposals *bptree.BPTree) error
625	// AddUserProposal appends a proposal ID to a user's indexed list.
626	//
627	// Parameters:
628	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
629	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
630	//   - user: user-string key whose proposal list is updated.
631	//   - proposalID: proposal identifier to append.
632	//
633	// Returns:
634	//   - error: nil when persisted; otherwise a spoofed-realm, missing-key, or key-value store error.
635	AddUserProposal(_ int, rlm realm, user string, proposalID int64) error
636	// RemoveUserProposal removes every occurrence of a proposal ID from a user's list.
637	// A missing user entry is treated as an already-complete no-op.
638	//
639	// Parameters:
640	//   - _: leading realm-call discriminator for the internal store method; callers pass 0.
641	//   - rlm: forwarded realm context for the persistent write; the store validates it as current.
642	//   - user: user-string key whose proposal list is updated.
643	//   - proposalID: proposal identifier to remove.
644	//
645	// Returns:
646	//   - error: nil when removed or already absent; otherwise a spoofed-realm, missing-key, or key-value store error.
647	RemoveUserProposal(_ int, rlm realm, user string, proposalID int64) error
648}
649
650// GovStakerAccessor provides an interface for accessing gov staker functionality.
651// This abstraction allows for easier testing by enabling mock implementations.
652type GovStakerAccessor interface {
653	// GetTotalDelegationAmountAtSnapshot returns the total delegation amount at a specific snapshot time.
654	//
655	// Parameters:
656	//   - snapshotTime: Unix timestamp at which delegation history is sampled.
657	//
658	// Returns:
659	//   - int64: total delegated amount at snapshotTime.
660	//   - bool: true when a snapshot value exists at that timestamp.
661	GetTotalDelegationAmountAtSnapshot(snapshotTime int64) (int64, bool)
662
663	// GetUserDelegationAmountAtSnapshot returns the user delegation amount at a specific snapshot time.
664	//
665	// Parameters:
666	//   - userAddr: user address whose delegated amount is sampled.
667	//   - snapshotTime: Unix timestamp at which the user's history is sampled.
668	//
669	// Returns:
670	//   - int64: user's delegated amount at snapshotTime.
671	//   - bool: true when a snapshot value exists for the user and timestamp.
672	GetUserDelegationAmountAtSnapshot(userAddr address, snapshotTime int64) (int64, bool)
673
674	// GetTotalxGnsSupply returns the total xGNS supply used as the quorum base.
675	//
676	// Returns:
677	//   - int64: total xGNS supply used as the governance quorum base.
678	GetTotalxGnsSupply() int64
679}