Skip to content

Commit 4b50bfa

Browse files
authored
feat: index daokit daos (#1511)
Signed-off-by: Norman <norman@samourai.coop>
1 parent 3af67d4 commit 4b50bfa

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+2526
-294
lines changed

.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
INDEXER_NETWORK_ID=teritori-testnet
2-
GNO_NETWORK_ID=gno-test4
2+
GNO_NETWORK_ID=gno-dev
33
TERITORI_MINTER_CODE_IDS=10
44
TENDERMINT_WEBSOCKET_ENDPOINT=wss://rpc.testnet.teritori.com/websocket
55
TERITORI_COLLECTION_WHITELIST=testeth-0x43cc70bf324d716782628bed38af97e4afe92f69,mumbai-0x916ad9d549907ccbbaf9ba65526826bfc3a9c0c4,testori-tori1r8raaqul4j05qtn0t05603mgquxfl8e9p7kcf7smwzcv2hc5rrlq0vket0,testori-tori1436kxs0w2es6xlqpp9rd35e3d0cjnw4sv8j3a7483sgks29jqwgsjscd88

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ publish.multisig-backend:
284284

285285
.PHONY: publish.gno-indexer
286286
publish.gno-indexer:
287-
docker build -f go/cmd/gno_social_feed_indexer/Dockerfile . --platform linux/amd64 -t $(GNO_INDEXER_DOCKER_IMAGE)
287+
docker build -f go/cmd/gno-indexer/Dockerfile . --platform linux/amd64 -t $(GNO_INDEXER_DOCKER_IMAGE)
288288
docker push $(GNO_INDEXER_DOCKER_IMAGE)
289289

290290
.PHONY: validate-networks

apps/gnotribe/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import AppRoot from "@/dapp-root/App";
55
const config: AppConfig = {
66
disableBuyTokensButton: true,
77
disableDAppStore: true,
8-
forceNetworkList: ["gno-test5", "gno-portal"],
8+
forceNetworkList: ["gno-test5", "gno-zenao"],
99
forceDAppsList: ["feed", "organizations"],
1010
defaultNetworkId: "gno-test5",
1111
homeScreen: "Feed",

assets/icons/networks/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import teritori from "./teritori.svg";
1515
import polygon from "./polygon.svg";
1616
import starknet from "./starknet.svg";
1717
import starknetCircle from "./starknet-circle.svg";
18+
import zenao from "./zenao.svg";
19+
import zenaoCircle from "./zenao-circle.svg"
1820

1921
export const networks = {
2022
teritori,
@@ -34,4 +36,6 @@ export const networks = {
3436
polygon,
3537
starknet,
3638
starknetCircle,
39+
zenao,
40+
zenaoCircle,
3741
};

assets/icons/networks/zenao-circle.svg

Lines changed: 470 additions & 0 deletions
Loading

assets/icons/networks/zenao.svg

Lines changed: 470 additions & 0 deletions
Loading

gno/p/basedao/basedao.gno

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ type Config struct {
3232
type ProfileStringSetter func(field string, value string) bool
3333
type ProfileStringGetter func(addr std.Address, field string, def string) string
3434

35+
const EventBaseDAOCreated = "BaseDAOCreated"
36+
37+
func emitBaseDAOCreated() {
38+
std.Emit(EventBaseDAOCreated)
39+
}
40+
3541
func New(conf *Config) *DAO {
3642
// XXX: emit events from memberstore
3743

@@ -63,7 +69,6 @@ func New(conf *Config) *DAO {
6369

6470
if !conf.NoDefaultHandlers {
6571
if conf.InitialCondition == nil {
66-
// XXX: this won't work because members threshold uses events
6772
conf.InitialCondition = daocond.MembersThreshold(0.6, members.IsMember, members.MembersCount)
6873
}
6974

@@ -85,6 +90,8 @@ func New(conf *Config) *DAO {
8590
}
8691
}
8792

93+
emitBaseDAOCreated()
94+
8895
return dao
8996
}
9097

gno/p/basedao/members.gno

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"std"
55

66
"gno.land/p/demo/avl"
7+
"gno.land/p/demo/json"
78
"gno.land/p/teritori/role_manager"
89
)
910

@@ -17,6 +18,9 @@ type Member struct {
1718
Roles []string
1819
}
1920

21+
const EventAddMember = "BaseDAOAddMember"
22+
const EventRemoveMember = "BaseDAORemoveMember"
23+
2024
func NewMembersStore(initialRoles []role_manager.RoleInfo, initialMembers []Member) *MembersStore {
2125
res := &MembersStore{
2226
RoleManager: role_manager.New(),
@@ -76,6 +80,11 @@ func (m *MembersStore) setRoles(roles []role_manager.RoleInfo) {
7680

7781
func (m *MembersStore) setMembers(members []Member) {
7882
for _, member := range members {
83+
if ok := m.Members.Has(member.Address); !ok {
84+
std.Emit(EventAddMember,
85+
"address", member.Address,
86+
)
87+
}
7988
m.Members.Set(member.Address, struct{}{})
8089
for _, role := range member.Roles {
8190
m.RoleManager.AddRoleToUser(std.Address(member.Address), role)
@@ -87,6 +96,9 @@ func (m *MembersStore) AddMember(member string, roles []string) {
8796
if m.IsMember(member) {
8897
panic("member already exists")
8998
}
99+
std.Emit(EventAddMember,
100+
"address", member,
101+
)
90102
m.Members.Set(member, struct{}{})
91103
for _, role := range roles {
92104
m.RoleManager.AddRoleToUser(std.Address(member), role)
@@ -97,6 +109,9 @@ func (m *MembersStore) RemoveMember(member string) {
97109
if !m.IsMember(member) {
98110
panic("member does not exist")
99111
}
112+
std.Emit(EventRemoveMember,
113+
"address", member,
114+
)
100115
m.Members.Remove(member)
101116
m.RoleManager.RemoveAllRolesFromUser(std.Address(member))
102117
}
@@ -126,3 +141,24 @@ func (m *MembersStore) RemoveRoleFromMember(member string, role string) {
126141
}
127142
m.RoleManager.RemoveRoleFromUser(std.Address(member), role)
128143
}
144+
145+
func (m *MembersStore) GetMembersJSON() string {
146+
// XXX: replace with protoc-gen-gno
147+
members := []*json.Node{}
148+
for _, memberID := range m.GetMembers() {
149+
roles := []*json.Node{}
150+
for _, role := range m.GetMemberRoles(memberID) {
151+
roles = append(roles, json.StringNode("", role))
152+
}
153+
members = append(members, json.ObjectNode("", map[string]*json.Node{
154+
"address": json.StringNode("", memberID),
155+
"roles": json.ArrayNode("", roles),
156+
}))
157+
}
158+
node := json.ArrayNode("", members)
159+
bz, err := json.Marshal(node)
160+
if err != nil {
161+
panic(err)
162+
}
163+
return string(bz)
164+
}

gno/p/basedao/messages.gno

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"std"
66

77
"gno.land/p/demo/ufmt"
8+
"gno.land/p/moul/md"
89
"gno.land/p/teritori/daokit"
910
)
1011

@@ -111,17 +112,29 @@ func NewUnassignRoleMsg(payload *MsgUnassignRole) daokit.ExecutableMessage {
111112

112113
const MsgEditProfileKind = "gno.land/p/teritori/basedao.EditProfile"
113114

115+
type msgEditProfile struct {
116+
kv [][2]string
117+
}
118+
119+
func (m *msgEditProfile) String() string {
120+
elems := []string{}
121+
for _, v := range m.kv {
122+
elems = append(elems, v[0]+": "+v[1])
123+
}
124+
return md.BulletList(elems)
125+
}
126+
114127
func NewEditProfileMsg(kv ...[2]string) daokit.ExecutableMessage {
115-
return daokit.NewMessage(MsgEditProfileKind, kv)
128+
return daokit.NewMessage(MsgEditProfileKind, &msgEditProfile{kv: kv})
116129
}
117130

118131
func NewEditProfileHandler(setter ProfileStringSetter, allowedFields []string) daokit.MessageHandler {
119132
return daokit.NewMessageHandler(MsgEditProfileKind, func(imsg interface{}) {
120-
msg, ok := imsg.([][2]string)
133+
msg, ok := imsg.(*msgEditProfile)
121134
if !ok {
122135
panic(errors.New("invalid message type"))
123136
}
124-
for _, elem := range msg {
137+
for _, elem := range msg.kv {
125138
k, v := elem[0], elem[1]
126139
if len(allowedFields) > 0 && !stringSliceContains(allowedFields, k) {
127140
panic(ufmt.Errorf("unauthorized field %q", k))

gno/p/basedao/render.gno

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package basedao
22

33
import (
44
"std"
5+
"strconv"
56
"strings"
67

78
"gno.land/p/demo/mux"
@@ -69,7 +70,7 @@ func (d *DAO) renderHomePage(res *mux.ResponseWriter, req *mux.Request) {
6970
if err != nil {
7071
panic(err)
7172
}
72-
res.Write(ufmt.Sprintf("- **Proposal %d: [%s](%s:%s/%s)**\n\n", uint64(id), proposal.Title, linkPath, "proposal", key))
73+
res.Write(ufmt.Sprintf("- **Proposal %d: [%s](%s:%s/%d)**\n\n", uint64(id), proposal.Title, linkPath, "proposal", uint64(id)))
7374
i += 1
7475
return false
7576
})
@@ -120,7 +121,7 @@ func (d *DAO) renderProposalHistoryPage(res *mux.ResponseWriter, req *mux.Reques
120121
if err != nil {
121122
panic(err)
122123
}
123-
res.Write(ufmt.Sprintf("- **Proposal %d: [%s](%s:%s/%s) - %s**\n\n", uint64(id), proposal.Title, linkPath, "proposal", key, proposal.Status))
124+
res.Write(ufmt.Sprintf("- **Proposal %d: [%s](%s:%s/%d) - %s**\n\n", uint64(id), proposal.Title, linkPath, "proposal", uint64(id), proposal.Status))
124125
i += 1
125126
return false
126127
})
@@ -156,10 +157,11 @@ func (d *DAO) renderProposalDetailPage(res *mux.ResponseWriter, req *mux.Request
156157
pkgPath := d.Realm.PkgPath()
157158
linkPath := getLinkPath(pkgPath)
158159

159-
id, err := seqid.FromString(req.GetVar("id"))
160+
idu, err := strconv.ParseUint(req.GetVar("id"), 10, 64)
160161
if err != nil {
161162
panic(err)
162163
}
164+
id := seqid.ID(idu)
163165
res.Write(ufmt.Sprintf("# %s - Proposal #%d\n\n", name, uint64(id)))
164166
proposal := d.Core.ProposalModule.GetProposal(uint64(id))
165167
res.Write(ufmt.Sprintf("## Title - %s 📜\n\n", proposal.Title))

0 commit comments

Comments
 (0)