跳转到内容

@stdlib/ownable

为可拥有的合约提供 [traits](/book/types#composite-types)。 这是最常用的性状,大多数其他性状都需要它。

要使用该库,请导入 @stdlib/ownable

import "@stdlib/ownable";

信息

ChangeOwner

message ChangeOwner {
queryIdInt as uint64;
newOwner: Address;
}

ChangeOwnerOk

message ChangeOwnerOk {
queryIdInt as uint64;
newOwner: Address;
}

特质

Ownable

Trait Ownable 声明了 contract 的所有者(不可编辑),并提供了一个辅助函数 requireOwner() 来检查消息是否由所有者发送。

trait 要求声明一个字段 owner: Address,并公开一个 getter 函数 owner(),该函数从 contract 中读取。

源代码

@interface("org.ton.ownable")
trait Ownable {
owner: Address;
fun requireOwner() {
nativeThrowUnless(132, sender() == self.owner);
}
get fun owner():Address {
return self.owner;
}
}

使用示例

import "@stdlib/ownable";
contract ExampleContract with Ownable {
owner: Address;
init(owner: Address) {
self.owner = owner;
}
}

OwnableTransferable

OwnableTransferableOwnable 的扩展,允许将合同的所有权转移到另一个地址。它提供了一个安全的句柄 Message ChangeOwner,可供所有者调用以转移所有权。

如果所有者转移请求成功,合约将回复一条 ChangeOwnerOk 信息

源代码

@interface("org.ton.ownable.transferable.v2")
trait OwnableTransferable with Ownable {
owner: Address;
receive(msg: ChangeOwner) {
// Check if the sender is the owner
self.requireOwner();
// 更新所有者
self.owner = msg.newOwner;
// 回复结果
self.reply(ChangeOwnerOk{ queryId: msg.queryId, newOwner: msg.newOwner }.toCell());
}
}

使用示例

import "@stdlib/ownable";
contract ExampleContract with OwnableTransferable {
owner: Address;
init(owner: Address) {
self.owner = owner;
}
}

资料来源