market_adapter.gno
2.64 Kb · 66 lines
1// Fixed-target adapter. No callback, arbitrary call, or recovered panic path.
2package memba_dao
3
4import (
5 "gno.land/p/samcrew/memba_weighted_host"
6 "gno.land/r/samcrew/memba_market_config"
7)
8
9func marketState(a memba_weighted_host.MarketAction) memba_weighted_host.MarketState {
10 bps := int64(0)
11 if a.Kind() == memba_weighted_host.MarketSetFee {
12 bps = int64(memba_market_config.GetFeeBPS(string(a.Lane())))
13 }
14 return memba_weighted_host.MarketState{Admin: memba_market_config.GetAdmin(), PendingAdmin: memba_market_config.GetPendingAdmin(), Treasury: memba_market_config.GetTreasury(), BPS: bps}
15}
16
17func ProposeMarketAccept(cur realm) uint64 {
18 a := memba_weighted_host.MarketAccept()
19 return host.ProposeMarket(a, marketState(a), cur)
20}
21func ProposeMarketFee(cur realm, lane string, bps int64) uint64 {
22 a := memba_weighted_host.MarketFee(memba_weighted_host.MarketLane(lane), bps)
23 return host.ProposeMarket(a, marketState(a), cur)
24}
25func ProposeMarketTreasury(cur realm) uint64 {
26 a := marketPolicy.SetTreasury()
27 return host.ProposeMarket(a, marketState(a), cur)
28}
29func ProposeMarketReturn(cur realm) uint64 {
30 a := marketPolicy.ReturnAdmin()
31 return host.ProposeMarket(a, marketState(a), cur)
32}
33func ProposeMarketAbortReturn(cur realm) uint64 {
34 a := marketPolicy.AbortReturn()
35 return host.ProposeMarket(a, marketState(a), cur)
36}
37
38func executeMarket(cur realm, id uint64) {
39 proposed := host.Proposal(id).MarketAction
40 before := marketState(proposed)
41 a := host.ConsumeMarket(id, before, cur)
42 expected := before
43 switch a.Kind() {
44 case memba_weighted_host.MarketAcceptAdmin:
45 expected.Admin = marketPolicy.DAO()
46 expected.PendingAdmin = ""
47 memba_market_config.AcceptAdmin(cross(cur))
48 case memba_weighted_host.MarketSetFee:
49 expected.BPS = a.BPS()
50 memba_market_config.SetFeeBPS(cross(cur), string(a.Lane()), a.BPS())
51 case memba_weighted_host.MarketSetTreasury:
52 expected.Treasury = a.Recipient()
53 memba_market_config.SetTreasury(cross(cur), a.Recipient())
54 case memba_weighted_host.MarketReturnAdmin:
55 expected.PendingAdmin = a.Recipient()
56 memba_market_config.TransferAdmin(cross(cur), a.Recipient())
57 case memba_weighted_host.MarketAbortReturn:
58 expected.PendingAdmin = ""
59 memba_market_config.CancelAdminTransfer(cross(cur))
60 default:
61 panic("unsupported market action")
62 }
63 // Stage-return deliberately retains DAO admin until the successor accepts
64 // separately. A mismatch aborts the entire transaction, including Consume.
65 if marketState(a) != expected { panic("market postcondition mismatch") }
66}