Skip to content

@stdlib/ownable

提供可拥有合约的 traits。这是大多数其他 traits 所需的最常用的 trait。

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

solidity
import "@stdlib/ownable";

消息

ChangeOwner

ts
message ChangeOwner {
    queryId: Int as uint64;
    newOwner: Address;
}

ChangeOwnerOk

ts
message ChangeOwnerOk {
    queryId: Int as uint64;
    newOwner: Address;
}

特性

Ownable

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

trait 需要声明一个字段 owner: Address,并暴露一个 getter 函数 owner(),从合约中读取它。

源代码:

solidity
@interface("org.ton.ownable")
trait Ownable {
    owner: Address;

    fun requireOwner() {
        nativeThrowUnless(132, sender() == self.owner);
    }

    get fun owner(): Address {
        return self.owner;
    }
}

使用示例:

solidity
import "@stdlib/ownable";

contract ExampleContract with Ownable {
    owner: Address;

    init(owner: Address) {
        self.owner = owner;
    }
}

OwnableTransferable

OwnableTransferableOwnable 的扩展,允许将合约的所有权转移到另一个地址。它提供了一个安全处理 消息 ChangeOwner,所有者可以调用该消息以转移所有权。

如果所有权转移请求成功,合约将回复一个 ChangeOwnerOk 消息

源代码:

solidity
@interface("org.ton.ownable.transferable.v2")
trait OwnableTransferable with Ownable {
    owner: Address;

    receive(msg: ChangeOwner) {
        // 检查发送者是否为所有者
        self.requireOwner();

        // 更新所有者
        self.owner = msg.newOwner;

        // 回复结果
        self.reply(ChangeOwnerOk{ queryId: msg.queryId, newOwner: msg.newOwner }.toCell());
    }
}

使用示例:

solidity
import "@stdlib/ownable";

contract ExampleContract with OwnableTransferable {
    owner: Address;

    init(owner: Address) {
        self.owner = owner;
    }
}

源代码