Skip to content

Commit

Permalink
feat: sync daokit w/ zenao
Browse files Browse the repository at this point in the history
  • Loading branch information
MikaelVallenet committed Jan 28, 2025
1 parent aa39bd6 commit cd843be
Show file tree
Hide file tree
Showing 17 changed files with 1,330 additions and 694 deletions.
419 changes: 0 additions & 419 deletions gno/p/dao_roles_based/dao_roles_based_test.gno

This file was deleted.

1 change: 0 additions & 1 deletion gno/p/dao_roles_based/gno.mod

This file was deleted.

57 changes: 0 additions & 57 deletions gno/p/dao_roles_based/members.gno

This file was deleted.

151 changes: 0 additions & 151 deletions gno/p/dao_roles_based/messages.gno

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dao_roles_based
package daokit

import (
"path"
Expand All @@ -10,7 +10,7 @@ import (
"gno.land/p/teritori/daocond"
)

type DaoRolesBased struct {
type Dao struct {
Name string
Description string

Expand All @@ -23,16 +23,16 @@ type DaoRolesBased struct {
realmName string
}

func NewDaoRolesBasedJSON(name, description string, roles []string, members [][]string, resourcesJSON string, handlers []MessageHandler) *DaoRolesBased {
if len(name) < 5 {
panic("dao name should be at least 5 characters long")
func NewDaoJSON(name, description string, roles []string, members [][]string, resourcesJSON string, handlers []MessageHandler) *Dao {
if len(name) < 1 {
panic("dao name should be at least 1 characters long")
}

if len(description) < 10 {
panic("dao description should be at least 10 characters long")
if len(description) < 1 {
panic("dao description should be at least 1 characters long")
}

dao := &DaoRolesBased{
dao := &Dao{
Name: name,
Description: description,
MemberModule: newMemberModule(),
Expand All @@ -42,12 +42,24 @@ func NewDaoRolesBasedJSON(name, description string, roles []string, members [][]
renderingRouter: mux.NewRouter(),
realmName: path.Base(std.CurrentRealm().PkgPath()),
}
dao.initMessagesRegistry()
dao.initRenderingRouter()

dao.MemberModule.setRoles(roles)
dao.MemberModule.setMembers(members)

resources := dao.parseResourcesJSON(resourcesJSON)
conditionRaw, ok := resources.Get("init")
if !ok {
panic("resources should have an 'init' condition")
}
condition := conditionRaw.(daocond.Condition)
dao.MessagesRegistry.handlers.Iterate("", "", func(key string, value interface{}) bool {
resources.Set(key, condition)
return false
})
resources.Remove("init")

dao.ResourcesModule.setResources(resources)

for _, handler := range handlers {
Expand All @@ -57,7 +69,7 @@ func NewDaoRolesBasedJSON(name, description string, roles []string, members [][]
return dao
}

func (d *DaoRolesBased) Vote(proposalID uint64, vote string) {
func (d *Dao) Vote(proposalID uint64, vote string) {
voter := std.PrevRealm().Addr()
if !d.MemberModule.IsMember(voter.String()) {
panic("voter is not a member")
Expand Down Expand Up @@ -86,7 +98,7 @@ func (d *DaoRolesBased) Vote(proposalID uint64, vote string) {

}

func (d *DaoRolesBased) Execute(proposalID uint64) {
func (d *Dao) Execute(proposalID uint64) {
executor := std.PrevRealm().Addr()
if !d.MemberModule.IsMember(executor.String()) {
panic("executor is not a member")
Expand Down Expand Up @@ -114,26 +126,23 @@ func (d *DaoRolesBased) Execute(proposalID uint64) {
proposal.status = ProposalStatusExecuted
}

func (d *DaoRolesBased) ProposeJSON(proposalJSON string) {
func (d *Dao) ProposeJSON(proposalJSON string) {
var req ProposalRequest
req.fromJSON(json.Must(json.Unmarshal([]byte(proposalJSON))))
msg := d.MessagesRegistry.messageFromJSON(req.message)
d.propose(req.title, req.description, msg.Type(), msg)
}

func (d *DaoRolesBased) HasRole(memberId string, role string) bool {
return d.MemberModule.HasRole(memberId, role)
}

func (d *DaoRolesBased) IsMember(memberId string) bool {
return d.MemberModule.IsMember(memberId)
}

func (d *DaoRolesBased) MembersCount() uint64 {
return d.MemberModule.MembersCount()
func (d *Dao) InstantExecute(proposalJSON string) {
var req ProposalRequest
req.fromJSON(json.Must(json.Unmarshal([]byte(proposalJSON))))
msg := d.MessagesRegistry.messageFromJSON(req.message)
proposal := d.propose(req.title, req.description, msg.Type(), msg)
d.Vote(uint64(proposal.id), "yes")
d.Execute(uint64(proposal.id))
}

func (d *DaoRolesBased) propose(title, description, resource string, message ExecutableMessage) {
func (d *Dao) propose(title, description, resource string, message ExecutableMessage) *Proposal {
proposer := std.PrevRealm().Addr()
if !d.MemberModule.IsMember(proposer.String()) {
panic(proposer + " proposer is not a member" + proposer)
Expand All @@ -144,18 +153,18 @@ func (d *DaoRolesBased) propose(title, description, resource string, message Exe
panic("resource not found")
}

if len(title) < 9 {
if len(title) < 3 {
panic("title should be at least 9 characters long")
}

if len(description) < 15 {
if len(description) < 3 {
panic("description should be at least 15 characters long")
}

d.ProposalModule.newProposal(title, description, proposer, message, condition.NewState())
return d.ProposalModule.newProposal(title, description, proposer, message, condition.NewState())
}

func (d *DaoRolesBased) parseResourcesJSON(resourcesJSON string) *avl.Tree {
func (d *Dao) parseResourcesJSON(resourcesJSON string) *avl.Tree {
nodes, err := json.Unmarshal([]byte(resourcesJSON))
if err != nil {
panic("invalid resources json format")
Expand All @@ -164,7 +173,7 @@ func (d *DaoRolesBased) parseResourcesJSON(resourcesJSON string) *avl.Tree {
resources := avl.NewTree()
for _, resourceNode := range resourcesNodesArray {
resourceObj := resourceNode.MustObject()
condition := daocond.ConditionFromJSON(resourceObj["condition"], d.HasRole, d.IsMember, d.MembersCount)
condition := daocond.ConditionFromJSON(resourceObj["condition"], d.MemberModule.HasRole, d.MemberModule.IsMember, d.MemberModule.MembersCount)
resources.Set(resourceObj["resource"].MustString(), condition)
}
return resources
Expand Down
Loading

0 comments on commit cd843be

Please sign in to comment.