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

governance_reads.gno

2.30 Kb · 56 lines
 1package escrow_v3
 2
 3import (
 4	"crypto/sha256"
 5	"encoding/hex"
 6	cfg "gno.land/r/samcrew/memba_market_config"
 7	"strconv"
 8)
 9
10// Value-only copies: no Contract pointer or persistent milestone slice escapes.
11type GovernanceMilestone struct {
12	ID                                int
13	Amount                            int64
14	Status                            string
15	FundedAt, CompletedAt, DisputedAt int64
16	PreDisputeStatus                  string
17}
18type GovernanceContract struct {
19	Exists                  bool
20	ID, ContentHash, Status string
21	Client, Freelancer      address
22	Count                   int
23	Milestones              [20]GovernanceMilestone
24}
25
26func GetGovernanceContract(id string) GovernanceContract {
27	v, ok := contracts.Get(id)
28	if !ok {
29		return GovernanceContract{}
30	}
31	c := v.(*Contract)
32	if len(c.Milestones) > 20 {
33		panic("invalid escrow milestone count")
34	}
35	s := GovernanceContract{Exists: true, ID: c.ID, Status: string(c.Status), Client: c.Client, Freelancer: c.Freelancer, Count: len(c.Milestones)}
36	metadata := "escrow-metadata/v1" + escrowMetadataField(c.ID) + escrowMetadataField(string(c.Client)) + escrowMetadataField(string(c.Freelancer)) + escrowMetadataField(c.Title) + escrowMetadataField(c.Description) + escrowMetadataField(strconv.FormatInt(c.CreatedAt, 10)) + escrowMetadataField(strconv.Itoa(len(c.Milestones)))
37	for i, m := range c.Milestones {
38		s.Milestones[i] = GovernanceMilestone{ID: m.ID, Amount: m.Amount, Status: string(m.Status), FundedAt: m.FundedAt, CompletedAt: m.CompletedAt, DisputedAt: m.DisputedAt, PreDisputeStatus: string(m.PreDisputeStatus)}
39		metadata += escrowMetadataField(strconv.Itoa(m.ID)) + escrowMetadataField(m.Title) + escrowMetadataField(strconv.FormatInt(m.Amount, 10))
40	}
41	digest := sha256.Sum256([]byte(metadata))
42	s.ContentHash = hex.EncodeToString(digest[:])
43	return s
44}
45
46type GovernanceFeeTerms struct {
47	RawBPS, EffectiveBPS                             int64
48	RawTreasury, FallbackTreasury, EffectiveTreasury address
49}
50
51func GetGovernanceFeeTerms() GovernanceFeeTerms {
52	bps, treasury := resolveFee()
53	return GovernanceFeeTerms{RawBPS: int64(cfg.GetFeeBPS(laneService)), EffectiveBPS: bps, RawTreasury: cfg.GetTreasury(), FallbackTreasury: feeFallback, EffectiveTreasury: treasury}
54}
55
56func escrowMetadataField(value string) string { return strconv.Itoa(len(value)) + ":" + value }