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  }