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 }