Skip to content

Commit

Permalink
add upgradable realm demo
Browse files Browse the repository at this point in the history
  • Loading branch information
mconcat committed Nov 18, 2024
1 parent 0246761 commit 31dbc62
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 0 deletions.
15 changes: 15 additions & 0 deletions examples/gno.land/r/demo/upgradable/admin/entry.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package admin

import (
"std"
)

var ReadCounter func() uint64 = nil
var UpdateCounter func() = nil
var DebugPrevRealm func() string = nil

// ----------------------------------------------------------------------------

func DebugAdminPrevRealm() string {
return std.PrevRealm().Addr().String()
}
5 changes: 5 additions & 0 deletions examples/gno.land/r/demo/upgradable/admin/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module gno.land/r/demo/upgradable/admin

require (

)
21 changes: 21 additions & 0 deletions examples/gno.land/r/demo/upgradable/admin/logic.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package admin

import (
"std"
)

type Logic interface {
ReadCounter() uint64
UpdateCounter()

DebugPrevRealm() string
}

func RegisterLogic(l Logic, setStore func(Store)) {
ReadCounter = l.ReadCounter
UpdateCounter = l.UpdateCounter
DebugPrevRealm = l.DebugPrevRealm

newStore := store()
setStore(newStore)
}
15 changes: 15 additions & 0 deletions examples/gno.land/r/demo/upgradable/admin/store.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package admin

type Store interface {
GetCounter() uint64
SetCounter(value uint64)
}

var store func() Store = nil

func RegisterStore(newStore func() Store) {
if store != nil {
panic("Store already registered")
}
store = newStore
}
29 changes: 29 additions & 0 deletions examples/gno.land/r/demo/upgradable/logic/v1/counter.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package v1

import (
"std"

"gno.land/r/demo/upgradable/admin"
)

var store admin.Store = nil

func Init() {
admin.RegisterLogic(&logic{}, func(_store admin.Store) { store = _store })
}

var _ admin.Logic = &logic{}

type logic struct {}

func (l *logic) ReadCounter() uint64 {
return store.GetCounter()
}

func (l *logic) UpdateCounter() {
store.SetCounter(store.GetCounter() + 1)
}

func (l *logic) DebugPrevRealm() string {
return std.PrevRealm().Addr().String()
}
5 changes: 5 additions & 0 deletions examples/gno.land/r/demo/upgradable/logic/v1/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module gno.land/r/demo/upgradable/logic/v1

require (
gno.land/r/demo/upgradable/admin v0.0.0-latest
)
29 changes: 29 additions & 0 deletions examples/gno.land/r/demo/upgradable/logic/v2/counter.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package v2

import (
"std"

"gno.land/r/demo/upgradable/admin"
)

var store admin.Store = nil

func Init() {
admin.RegisterLogic(&logic{}, func(_store admin.Store) { store = _store })
}

var _ admin.Logic = &logic{}

type logic struct {}

func (l *logic) ReadCounter() uint64 {
return store.GetCounter()
}

func (l *logic) UpdateCounter() {
store.SetCounter(store.GetCounter() + 2)
}

func (l *logic) DebugPrevRealm() string {
return std.PrevRealm().Addr().String()
}
5 changes: 5 additions & 0 deletions examples/gno.land/r/demo/upgradable/logic/v2/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module gno.land/r/demo/upgradable/logic/v2

require (
gno.land/r/demo/upgradable/admin v0.0.0-latest
)
5 changes: 5 additions & 0 deletions examples/gno.land/r/demo/upgradable/store/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module gno.land/r/demo/upgradable/store

require (
gno.land/r/demo/upgradable/admin v0.0.0-latest
)
42 changes: 42 additions & 0 deletions examples/gno.land/r/demo/upgradable/store/store.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package store

import (
"std"
"fmt"

"gno.land/r/demo/upgradable/admin"
)

var counterValue uint64

var _ admin.Store = &store{}

var currentStore *store

type store struct {}

func (s *store) GetCounter() uint64 {
if s != currentStore {
panic("Revoked store")
}

return counterValue
}

func (s *store) SetCounter(value uint64) {
if s != currentStore {
panic("Revoked store")
}

counterValue = value
}

func newStore() admin.Store {
currentStore = &store{}

return currentStore
}

func Init() {
admin.RegisterStore(newStore)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module gno.land/r/demo/upgradable/upgradable_testing

require (
gno.land/r/demo/upgradable/admin v0.0.0-latest
gno.land/r/demo/upgradable/store v0.0.0-latest
gno.land/r/demo/upgradable/logic/v1 v0.0.0-latest
gno.land/r/demo/upgradable/logic/v2 v0.0.0-latest
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package upgradable_testing
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package upgradable_testing

import (
"std"
"testing"

"gno.land/p/demo/testutils"
"gno.land/p/demo/urequire"

"gno.land/r/demo/upgradable/admin"
"gno.land/r/demo/upgradable/logic/v1"
"gno.land/r/demo/upgradable/logic/v2"
"gno.land/r/demo/upgradable/store"

)

func TestPackage(t *testing.T) {
alice := testutils.TestAddress("alice")
std.TestSetRealm(std.NewUserRealm(alice))
std.TestSetOrigCaller(alice) // XXX: should not need this

store.Init()

v1.Init()
urequire.Equal(t, admin.ReadCounter(), uint64(0))
admin.UpdateCounter()
urequire.Equal(t, admin.ReadCounter(), uint64(1))

v2.Init()
urequire.Equal(t, admin.ReadCounter(), uint64(1))
admin.UpdateCounter()
urequire.Equal(t, admin.ReadCounter(), uint64(3))

urequire.Equal(t, admin.DebugPrevRealm(), admin.DebugAdminPrevRealm())
}

0 comments on commit 31dbc62

Please sign in to comment.