github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/ownable/ownable.gno (about) 1 package ownable 2 3 import ( 4 "std" 5 ) 6 7 // Ownable is meant to be used as a top-level object to make your contract ownable OR 8 // being embedded in a Gno object to manage per-object ownership. 9 type Ownable struct { 10 owner std.Address 11 } 12 13 func New() *Ownable { 14 return &Ownable{ 15 owner: std.GetOrigCaller(), 16 } 17 } 18 19 // TransferOwnership transfers ownership of the Ownable struct to a new address 20 func (o *Ownable) TransferOwnership(newOwner std.Address) error { 21 err := o.CallerIsOwner() 22 if err != nil { 23 return err 24 } 25 26 if !newOwner.IsValid() { 27 return ErrInvalidAddress 28 } 29 30 o.owner = newOwner 31 return nil 32 } 33 34 // DropOwnership removes the owner, effectively disabling any owner-related actions 35 // Top-level usage: disables all only-owner actions/functions, 36 // Embedded usage: behaves like a burn functionality, removing the owner from the struct 37 func (o *Ownable) DropOwnership() error { 38 err := o.CallerIsOwner() 39 if err != nil { 40 return err 41 } 42 43 o.owner = "" 44 return nil 45 } 46 47 // CallerIsOwner checks if the caller of the function is the Realm's owner 48 func (o *Ownable) CallerIsOwner() error { 49 if std.GetOrigCaller() == o.owner { 50 return nil 51 } 52 return ErrUnauthorized 53 } 54 55 func (o *Ownable) Owner() std.Address { 56 return o.owner 57 }