访问控制

这个 crate 提供了一些方法来限制谁可以访问合约的函数或者何时可以访问。

  • Ownable 是一个简单的机制,具有一个可以分配给单个账户的 "owner" 角色。 这种机制在简单的场景中很有用,但是对于精细的访问需求可能会超出它的能力。

  • AccessControl 提供了一种通用的基于角色的访问控制机制。可以创建多个分层角色,并将每个角色分配给多个账户。

核心

OwnableComponent

use openzeppelin_access::ownable::OwnableComponent;

Ownable 提供了一种基本的访问控制机制,其中一个账户 (所有者)可以被授予对特定函数的独占访问权限。

这个模块包含了内部的 assert_only_owner,用于限制一个函数只能被所有者使用。

可嵌入的函数

owner(self: @ContractState) → ContractAddress external

返回当前所有者的地址。

transfer_ownership(ref self: ContractState, new_owner: ContractAddress) external

将合约的所有权转移到一个新的账户 (new_owner)。 只能由当前所有者调用。

触发一个 OwnershipTransferred 事件。

renounce_ownership(ref self: ContractState) external

使合约没有所有者。将不再可能调用 assert_only_owner 函数。只能由当前所有者调用。

放弃所有权将使合约没有所有者, 从而删除任何仅对所有者可用的功能。

可嵌入的函数 (两步转移)

owner(self: @ContractState) → ContractAddress external

返回当前所有者的地址。

pending_owner(self: @ContractState) → ContractAddress external

返回待定所有者的地址。

accept_ownership(ref self: ContractState) external

将合约的所有权转移给待定所有者。 只能由待定所有者调用。 将待定所有者重置为零地址。

触发一个 OwnershipTransferred 事件。

transfer_ownership(ref self: ContractState, new_owner: ContractAddress) external

通过设置待定所有者来启动两步所有权转移过程。 允许将 new_owner 设置为零地址,这可以用于取消已启动的所有权转移。

只能由当前所有者调用。

触发一个 OwnershipTransferStarted 事件。

renounce_ownership(ref self: ContractState) external

使合约没有所有者。将不再可能调用 assert_only_owner 函数。只能由当前所有者调用。

放弃所有权将使合约没有所有者, 从而删除任何仅对所有者可用的功能。

transferOwnership(ref self: ContractState, newOwner: ContractAddress) external

请参阅 transfer_ownership

renounceOwnership(ref self: ContractState) external

请参阅 renounce_ownership

pendingOwner(self: @ContractState) external

请参阅 pending_owner

acceptOwnership(self: @ContractState) external

请参阅 accept_ownership

transferOwnership(self: @ContractState) external

请参阅 transfer_ownership

renounceOwnership(self: @ContractState) external

请参阅 renounce_ownership

内部函数

initializer(ref self: ContractState, owner: ContractAddress) internal

初始化合约并将 owner 设置为初始所有者。

要求:

  • owner 不能是零地址。

触发一个 OwnershipTransferred 事件。

assert_only_owner(self: @ContractState) internal

如果被所有者以外的任何账户调用,则会 panic。

_transfer_ownership(ref self: ContractState, new_owner: ContractAddress) internal

将合约的所有权转移到一个新的账户 (new_owner)。 没有访问限制的内部函数。

触发一个 OwnershipTransferred 事件。

_propose_owner(ref self: ContractState, new_owner: ContractAddress) internal

在两步转移中设置一个新的待定所有者。

没有访问限制的内部函数。

触发一个 OwnershipTransferStarted 事件。

事件

OwnershipTransferStarted(previous_owner: ContractAddress, new_owner: ContractAddress) event

当待定所有者被更新时触发。

OwnershipTransferred(previous_owner: ContractAddress, new_owner: ContractAddress) event

当所有权被转移时触发。

IAccessControl

use openzeppelin_access::accesscontrol::interface::IAccessControl;

AccessControl 的外部接口。

0x23700be02858dbe2ac4dc9c9f66d0b6b0ed81ec7f970ca6844500a56ff61751

函数

has_role(role: felt252, account: ContractAddress) → bool external

返回 account 是否能够扮演 role

get_role_admin(role: felt252) → felt252 external

返回控制 role 的管理角色。参见 grant_rolerevoke_role

要更改角色的管理员,请使用 set_role_admin

grant_role(role: felt252, account: ContractAddress) external

role 授予 account

如果 account 尚未被授予 role,则触发一个 RoleGranted 事件。

要求:

  • 调用者必须具有 role 的管理角色。

revoke_role(role: felt252, account: ContractAddress) external

account 撤销 role

如果 account 已被授予 role,则触发一个 RoleRevoked 事件。

要求:

  • 调用者必须具有 role 的管理角色。

renounce_role(role: felt252, account: ContractAddress) external

从调用账户撤销 role

角色通常通过 grant_rolerevoke_role 来管理。 此函数的 目的是提供一种机制,让账户在受到威胁时(例如当可信设备放错地方时)失去其权限。

如果调用账户已被授予 role,则触发一个 RoleRevoked 事件。

要求:

  • 调用者必须是 account

事件

RoleAdminChanged(role: felt252, previous_admin_role: ContractAddress, new_admin_role: ContractAddress) event

new_admin_role 被设置为 role 的管理角色时触发,替换 previous_admin_role

DEFAULT_ADMIN_ROLE 是所有角色的起始管理角色,尽管 RoleAdminChanged 没有发出信号表明这一点。

RoleGranted(role: felt252, account: ContractAddress, sender: ContractAddress) event

account 被授予 role 时触发。

sender 是发起合约调用的账户,一个拥有管理角色的账户 或如果从构造函数中调用 _grant_role 时的部署者地址。

RoleRevoked(role: felt252, account: ContractAddress, sender: ContractAddress) event

account 被撤销 role 时触发。

sender 是发起合约调用的帐户:

  • 如果使用 revoke_role,它是管理角色持有者。

  • 如果使用 renounce_role,它是角色持有者(即 account)。

IAccessControlWithDelay

use openzeppelin_access::accesscontrol::interface::IAccessControlWithDelay;

扩展的 AccessControlWithDelay 功能的外部接口。

函数

get_role_status(role: felt252, account: ContractAddress) → RoleStatus external

返回账户对于给定角色的状态。 可能的状态有:

  • NotGranted:该角色尚未授予该账户。

  • Delayed:该角色已授予该账户,但由于时间延迟尚未生效。

  • Effective:该角色已授予该账户并且当前已生效。

grant_role_with_delay(role: felt252, account: ContractAddress, delay: u64) external

尝试使用指定的激活延迟将 role 授予 account

要求:

  • 调用者必须具有 role 的管理角色。

  • delay 必须大于 0。

  • role 对于 account 来说不能已经生效。

可能会触发一个 RoleGrantedWithDelay 事件。

事件

RoleGrantedWithDelay(role: felt252, account: ContractAddress, sender: ContractAddress, delay: u64) event

account 被授予具有延迟的 role 时触发。

sender 是发起合约调用的账户,一个拥有管理角色的账户 或如果从构造函数中调用 _grant_role_with_delay 时的部署者地址。

AccessControlComponent

use openzeppelin_access::accesscontrol::AccessControlComponent;

该组件允许合约实现基于角色的访问控制机制。 角色由其 felt252 标识符引用:

const MY_ROLE: felt252 = selector!("MY_ROLE");

角色可用于表示一组权限。 要限制对 函数调用的访问,请使用 assert_only_role

(...)

#[external(v0)]
fn foo(ref self: ContractState) {
    self.accesscontrol.assert_only_role(MY_ROLE);

    // Do something
}

可以通过 grant_rolegrant_role_with_delayrevoke_role 函数动态地授予和撤销角色。 每个角色都有一个关联的管理角色,并且只有 有角色管理角色的账户才能调用 grant_rolegrant_role_with_delayrevoke_role

默认情况下,所有角色的管理角色都是 DEFAULT_ADMIN_ROLE,这意味着 只有拥有此角色的账户才能够授予或撤销其他 角色。 可以通过使用 set_role_admin 创建更复杂的角色关系。

DEFAULT_ADMIN_ROLE 也是它自己的管理员:它有权 授予和撤销此角色。 应采取额外的预防措施来保护 已被授予它的账户。 参见 AccessControlDefaultAdminRulesComponent

可嵌入的函数

has_role(self: @ContractState, role: felt252, account: ContractAddress) → bool external

返回 account 是否可以扮演 role

get_role_admin(self: @ContractState, role: felt252) → felt252 external

返回控制 role 的管理角色。参见 grant_rolerevoke_role

要更改角色的管理员,请使用 set_role_admin

get_role_status(self: @ContractState, role: felt252, account: ContractAddress) → RoleStatus external

返回账户对于给定角色的状态。

可能的状态有:

  • NotGranted:该角色尚未授予该账户。

  • Delayed:该角色已授予该账户,但由于时间延迟尚未生效。

  • Effective:该角色已授予该账户并且当前已生效。

grant_role(ref self: ContractState, role: felt252, account: ContractAddress) external

role 授予 account

如果 account 尚未被授予 role,则触发一个 RoleGranted 事件。

要求:

  • 调用者必须具有 role 的管理角色。

可能会触发一个 RoleGranted 事件。

grant_role_with_delay(ref self: ContractState, role: felt252, account: ContractAddress, delay: u64) external

尝试使用指定的激活延迟将 role 授予 account

要求:

  • 调用者必须具有 role 的管理角色。

  • delay 必须大于 0。

  • role 对于 account 来说不能已经生效。

可能会触发一个 RoleGrantedWithDelay 事件。

revoke_role(ref self: ContractState, role: felt252, account: ContractAddress) external

account 撤销 role

如果 account 已被授予 role,则触发一个 RoleRevoked 事件。

要求:

  • 调用者必须具有 role 的管理角色。

可能会触发一个 RoleRevoked 事件。

renounce_role(ref self: ContractState, role: felt252, account: ContractAddress) external

从调用账户撤销 role

角色通常通过 grant_rolerevoke_role 来管理。 此函数的 目的是提供一种机制,让账户在受到威胁时(例如当可信设备放错地方时)失去其权限。

如果调用账户已被撤销 role,则触发一个 RoleRevoked 事件。

要求:

  • 调用者必须是 account

可能会触发一个 RoleRevoked 事件。

supports_interface(self: @ContractState, interface_id: felt252) → bool external

hasRole(self: @ContractState, role: felt252, account: ContractAddress) → bool external

请参阅 has_role

getRoleAdmin(self: @ContractState, role: felt252) → felt252 external

请参阅 get_role_admin

grantRole(ref self: ContractState, role: felt252, account: ContractAddress) external

请参阅 grant_role

revokeRole(ref self: ContractState, role: felt252, account: ContractAddress) external

请参阅 revoke_role

renounceRole(ref self: ContractState, role: felt252, account: ContractAddress) external

请参阅 renounce_role

内部函数

initializer(ref self: ContractState) internal

通过注册 IAccessControl 接口 ID 来初始化合约。

assert_only_role(self: @ContractState, role: felt252) internal

验证调用者是否可以扮演给定的角色。 否则会 panic。

`is_role_effective++(self: @ContractState, role::page-title: AccessControl

试图将 role 授予给 account。如果 role 对于 account 已经生效,则该函数不执行任何操作。如果 role 已经被授予给 account,但由于时间延迟尚未激活,则延迟将被移除,并且 role 立即生效。

没有访问限制的内部函数。

可能会触发 RoleGranted 事件。

_grant_role_with_delay(ref self: ContractState, role: felt252, account: ContractAddress, delay: u64) internal

尝试使用指定的激活延迟将 role 授予给 account

该角色将在给定的延迟过去后生效。如果该角色对于帐户已经处于活动状态 (Effective),则该函数将 panic。如果角色已被授予但尚未激活(处于 Delayed 状态),则现有延迟将被新的 delay 覆盖。

没有访问限制的内部函数。

要求:

  • delay 必须大于 0。

  • 对于 accountrole 必须尚未生效。

可能会触发 RoleGrantedWithDelay 事件。

_revoke_role(ref self: ContractState, role: felt252, account: ContractAddress) internal

account 撤销 role

没有访问限制的内部函数。

可能会触发 RoleRevoked 事件。

事件

RoleAdminChanged(role: felt252, previous_admin_role: ContractAddress, new_admin_role: ContractAddress) event

RoleGranted(role: felt252, account: ContractAddress, sender: ContractAddress) event

RoleGrantedWithDelay(role: felt252, account: ContractAddress, sender: ContractAddress, delay: u64) event

RoleRevoked(role: felt252, account: ContractAddress, sender: ContractAddress) event

扩展

IAccessControlDefaultAdminRules

use openzeppelin_access::accesscontrol::extensions::interface::IAccessControlDefaultAdminRules;

声明的 AccessControlDefaultAdminRules 外部接口,用于支持 SRC5 检测。

0x3509b3083c9586afe5dae781146b0608c3846870510f8d4d21ae38676cc33eb

函数

default_admin() → ContractAddress external

返回当前 DEFAULT_ADMIN_ROLE 持有者的地址。

pending_default_admin() → (ContractAddress, u64) external

返回一个 new_admin 和一个 accept_schedule 的元组。

accept_schedule 通过后,new_admin 将能够通过调用 accept_default_admin_transfer 接受 default_admin 角色,从而完成角色转移。

仅在 accept_schedule 中为零的值表示没有待处理的管理员转移。

注意:零地址 new_admin 意味着 default_admin 正在被放弃。

default_admin_delay() → u64 external

返回安排开始的 default_admin 转移的接受所需的延迟。

在调用 begin_default_admin_transfer 时,此延迟将添加到当前时间戳,以设置接受计划。

注意:如果已安排延迟更改,它将在计划通过后立即生效,从而使此函数返回新的延迟。

pending_default_admin_delay() → (u64, u64) external

返回 new_delayeffect_schedule 的元组。

在通过 effect_schedule 之后,对于使用 begin_default_admin_transfer 启动的每个新的 default_admin 转移,new_delay 将立即生效。

仅在 effect_schedule 中为零的值表示没有待处理的延迟更改。

注意:仅对于 new_delay 为零的值意味着在效果计划之后,下一个 default_admin_delay 将为零。

begin_default_admin_transfer(new_admin) external

通过设置计划在当前时间戳加上 default_admin_delay 之后接受的 pending_default_admin 来启动 default_admin 转移。

要求:

  • 只能由当前的 default_admin 调用。

cancel_default_admin_transfer() external

取消先前使用 begin_default_admin_transfer 启动的 default_admin 转移。

尚未接受的 pending_default_admin 也可以使用此函数取消。

要求:

  • 只能由当前的 default_admin 调用。

可能会触发 DefaultAdminTransferCanceled 事件。

accept_default_admin_transfer() external

完成先前使用 begin_default_admin_transfer 启动的 default_admin 转移。

调用该函数后:

  • DEFAULT_ADMIN_ROLE 必须授予给调用者。

  • 必须从先前的持有者处撤销 DEFAULT_ADMIN_ROLE

  • pending_default_admin 必须重置为零值。

要求:

change_default_admin_delay(new_delay) external

通过设置计划在当前时间戳加上 default_admin_delay 之后生效的 pending_default_admin_delay,来启动 default_admin_delay 更新。

此函数保证在此方法被调用的时间戳和 pending_default_admin_delay 效果计划之间完成的任何对 begin_default_admin_transfer 的调用都将使用在调用之前设置的当前 default_admin_delay

pending_default_admin_delay 的效果计划的定义方式是,等到计划结束后,然后使用新延迟调用 begin_default_admin_transfer 将至少与另一个 default_admin 完成转移(包括接受)所花费的时间相同。

该计划是为两种情况设计的:

  • 当延迟更改为更大的延迟时,该计划是 block.timestamp + new delay,并受到 default_admin_delay_increase_wait 的限制。

  • 当延迟更改为较短的延迟时,该计划是 block.timestamp + (current delay - new delay)

从未生效的 pending_default_admin_delay 将被取消,以支持新的计划更改。

要求:

  • 只能由当前的 default_admin 调用。

触发 DefaultAdminDelayChangeScheduled 事件,并且可能会触发 DefaultAdminDelayChangeCanceled 事件。

rollback_default_admin_delay() external

取消计划的 default_admin_delay 更改。

要求:

  • 只能由当前的 default_admin 调用。

可能会触发 DefaultAdminDelayChangeCanceled 事件。

default_admin_delay_increase_wait() → u64 external

增加 default_admin_delay(即使用 change_default_admin_delay 安排的)生效的最长时间(以秒为单位)。默认为 5 天。

当计划增加 default_admin_delay 时,它会在新的延迟过去后生效,目的是为还原任何意外更改(即使用毫秒而不是秒)留出足够的时间,这可能会锁定合约。但是,为了避免过多的计划,等待时间受此函数的限制,并且可以为自定义 default_admin_delay 增加计划覆盖它。

重要提示:在覆盖此值时,请确保添加合理的时间量,否则,存在设置较高的新延迟的风险,该延迟几乎立即生效,而无法在发生输入错误时进行人为干预(例如,设置毫秒而不是秒)。

事件

DefaultAdminTransferScheduled(new_admin: ContractAddress, accept_schedule: u64) event

当启动 default_admin 转移时触发。

设置 new_admin 作为下一个通过调用 accept_default_admin_transfer 成为 default_admin 的地址,该调用仅在 accept_schedule 通过后进行。

DefaultAdminTransferCanceled() event

如果 pending_default_admin 从未被接受,则在重置该 pending_default_admin 时触发,无论其计划如何。

DefaultAdminDelayChangeScheduled(new_delay: u64, effect_schedule: u64) event

当启动 default_admin_delay 更改时触发。

effect_schedule 过去后,将 new_delay 设置为在默认管理员转移之间应用的下一个延迟。

如果其计划未通过,则在重置 pending_default_admin_delay 时触发。

AccessControlDefaultAdminRulesComponent

use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;

AccessControl 的扩展,允许指定特殊规则来管理 DEFAULT_ADMIN_ROLE 持有者,这是一个敏感角色,对系统中可能具有特权的其他角色具有特殊权限。

如果特定角色没有分配管理员角色,则 DEFAULT_ADMIN_ROLE 的持有者将能够授予和撤销它。

除了 AccessControl 之外,此合约还实现了以下风险缓解措施:

  • 从部署到可能放弃为止,只有一个帐户持有 DEFAULT_ADMIN_ROLE

  • 强制执行 2 步流程,以将 DEFAULT_ADMIN_ROLE 转移到另一个帐户。

  • 强制执行两个步骤之间的可配置延迟,并能够在接受转移之前取消。

  • 可以通过计划来更改延迟,请参阅 change_default_admin_delay

  • 不可能使用另一个角色来管理 DEFAULT_ADMIN_ROLE

可嵌入的函数

default_admin(self: @ContractState) → ContractAddress external

返回当前 DEFAULT_ADMIN_ROLE 持有者的地址。

pending_default_admin(self: @ContractState) → (ContractAddress, u64) external

返回一个 new_admin 和一个 accept_schedule 的元组。

accept_schedule 通过后,new_admin 将能够通过调用 accept_default_admin_transfer 接受 default_admin 角色,从而完成角色转移。

仅在 accept_schedule 中为零的值表示没有待处理的管理员转移。

注意:零地址 new_admin 意味着 default_admin 正在被放弃。

default_admin_delay(self: @ContractState) → u64 external

返回安排开始的 default_admin 转移的接受所需的延迟。

在调用 begin_default_admin_transfer 时,此延迟将添加到当前时间戳,以设置接受计划。

注意:如果已安排延迟更改,它将在计划通过后立即生效,从而使此函数返回新的延迟。

pending_default_admin_delay(self: @ContractState) → (u64, u64) external

返回 new_delayeffect_schedule 的元组。

在通过 effect_schedule 之后,对于使用 begin_default_admin_transfer 启动的每个新的 default_admin 转移,new_delay 将立即生效。

仅在 effect_schedule 中为零的值表示没有待处理的延迟更改。

注意:仅对于 new_delay 为零的值意味着在效果计划之后,下一个 default_admin_delay 将为零。

begin_default_admin_transfer(ref self: ContractState, new_admin: ContractAddress) external

通过设置计划在当前时间戳加上 default_admin_delay 之后接受的 pending_default_admin 来启动 default_admin 转移。

要求:

  • 只能由当前的 default_admin 调用。

cancel_default_admin_transfer(ref self: ContractState) external

取消先前使用 begin_default_admin_transfer 启动的 default_admin 转移。

尚未接受的 pending_default_admin 也可以使用此函数取消。

要求:

  • 只能由当前的 default_admin 调用。

可能会触发 DefaultAdminTransferCanceled 事件。

accept_default_admin_transfer(ref self: ContractState) external

完成先前使用 begin_default_admin_transfer 启动的 default_admin 转移。

调用该函数后:

  • DEFAULT_ADMIN_ROLE 必须授予给调用者。

  • 必须从先前的持有者处撤销 DEFAULT_ADMIN_ROLE

  • pending_default_admin 必须重置为零值。

要求:

change_default_admin_delay(ref self: ContractState, new_delay: u64) external

通过设置计划在当前时间戳加上 default_admin_delay 之后生效的 pending_default_admin_delay,来启动 default_admin_delay 更新。

此函数保证在此方法被调用的时间戳和 pending_default_admin_delay 效果计划之间完成的任何对 begin_default_admin_transfer 的调用都将使用在调用之前设置的当前 default_admin_delay

pending_default_admin_delay 的效果计划的定义方式是,等到计划结束后,然后使用新延迟调用 begin_default_admin_transfer 将至少与另一个 default_admin 完成转移(包括接受)所花费的时间相同。

该计划是为两种情况设计的:

  • 当延迟更改为更大的延迟时,该计划是 block.timestamp + new delay,并受到 default_admin_delay_increase_wait 的限制。

  • 当延迟更改为较短的延迟时,该计划是 block.timestamp + (current delay - new delay)

从未生效的 pending_default_admin_delay 将被取消,以支持新的计划更改。

要求:

  • 只能由当前的 default_admin 调用。

触发 DefaultAdminDelayChangeScheduled 事件,并且可能会触发 DefaultAdminDelayChangeCanceled 事件。

rollback_default_admin_delay(ref self: ContractState) external

取消计划的 default_admin_delay 更改。

要求:

  • 只能由当前的 default_admin 调用。

可能会触发 DefaultAdminDelayChangeCanceled 事件。

default_admin_delay_increase_wait(self: @ContractState) → u64 external

增加 default_admin_delay(即使用 change_default_admin_delay 安排的)生效的最长时间(以秒为单位)。默认为 5 天。

当计划增加 default_admin_delay 时,它会在新的延迟过去后生效,目的是为还原任何意外更改(即使用毫秒而不是秒)留出足够的时间,这可能会锁定合约。但是,为了避免过多的计划,等待时间受此函数的限制,并且可以为自定义 default_admin_delay 增加计划覆盖它。

重要提示[.contract-item]

renounce_role(ref self: ContractState, role: felt252, account: ContractAddress) external

从调用账户撤销 role

角色通常通过 grant_rolerevoke_role 进行管理。此函数 旨在提供一种机制,使账户在受到攻击时(例如,当受信任的设备放错地方时)失去其权限。

如果调用账户已被撤销 role,则发出 RoleRevoked 事件。

要求:

  • 调用者必须是 account

可能会发出 RoleRevoked 事件。

supports_interface(self: @ContractState, interface_id: felt252) → bool external

hasRole(self: @ContractState, role: felt252, account: ContractAddress) → bool external

参见 has_role

getRoleAdmin(self: @ContractState, role: felt252) → felt252 external

参见 get_role_admin

grantRole(ref self: ContractState, role: felt252, account: ContractAddress) external

参见 grant_role

revokeRole(ref self: ContractState, role: felt252, account: ContractAddress) external

参见 revoke_role

renounceRole(ref self: ContractState, role: felt252, account: ContractAddress) external

参见 renounce_role

内部函数

initializer(ref self: ContractState, initial_delay: u64, initial_default_admin: ContractAddress) external

通过注册 IAccessControl 接口 ID 并设置初始延迟和默认管理员来初始化合约。

要求:

  • initial_default_admin 不能为零地址。

assert_only_role(self: @ContractState, role: felt252) external

验证调用者是否可以充当给定的角色。否则会panic。

is_role_effective(self: @ContractState, role: felt252, account: ContractAddress) → bool external

返回账户是否可以充当给定的角色。

如果账户处于活动状态,并且 effective_from 时间早于或等于当前时间,则该账户可以充当该角色。

注意:如果 effective_from 时间点为 0,则该角色立即生效。 这与未使用延迟但使用单个布尔标志的实现向后兼容。

resolve_role_status(self: @ContractState, role: felt252, account: ContractAddress) → RoleStatus external

返回给定角色的账户状态。

可能的状态有:

  • NotGranted:该角色尚未授予该账户。

  • Delayed:该角色已授予该账户,但由于时间延迟尚未激活。

  • Effective:该角色已授予该账户,并且当前处于活动状态。

is_role_granted(self: @ContractState, role: felt252, account: ContractAddress) → bool external

返回是否已授予该账户给定的角色。

注意:如果设置了延迟但尚未过去,则该账户可能还不能充当该角色。使用 {is_role_effective} 检查账户是否可以充当该角色。

set_role_admin(ref self: ContractState, role: felt252, admin_role: felt252) external

admin_role 设置为 role 的管理角色。

没有访问限制的内部函数。

要求:

  • role 不能是 DEFAULT_ADMIN_ROLE

发出 RoleAdminChanged 事件。

_grant_role(ref self: ContractState, role: felt252, account: ContractAddress) external

尝试将 role 授予 account。如果 role 已经对 account 生效,则该函数不执行任何操作。如果 role 已授予 account,但由于时间延迟尚未激活,则删除延迟,并且 role 立即生效。

没有访问限制的内部函数。

对于 DEFAULT_ADMIN_ROLE,只有在没有 default_admin 或以前放弃了该角色时才允许授予。

注意:通过另一种机制公开此函数可能会使 DEFAULT_ADMIN_ROLE 再次可分配。确保保证这是您的实现中的预期行为。

可能会发出 RoleGranted 事件。

_grant_role_with_delay(ref self: ContractState, role: felt252, account: ContractAddress, delay: u64) external

尝试以指定的激活延迟将 role 授予 account

该角色将在给定的延迟过去后生效。如果该角色已经对该账户处于激活状态(Effective),则该函数将出现panic。如果该角色已授予但尚未激活(处于 Delayed 状态),则现有延迟将被新的 delay 覆盖。

没有访问限制的内部函数。

要求:

  • delay 必须大于 0。

  • role 不能对 account 已经生效。

  • role 不能是 DEFAULT_ADMIN_ROLE

可能会发出 RoleGrantedWithDelay 事件。

_revoke_role(ref self: ContractState, role: felt252, account: ContractAddress) external

尝试从 account 撤销 role。如果 roleaccount 不生效,则该函数不执行任何操作。如果 role 已从 account 撤销,但由于时间延迟仍然有效,则删除延迟,并且 role 立即变为非活动状态。

没有访问限制的内部函数。

可能会发出 RoleRevoked 事件。

set_pending_default_admin(ref self: ContractState, new_admin: ContractAddress, new_schedule: u64) external

设置待处理管理员及其时间表的元组的 Setter。

可能会发出 {DefaultAdminTransferCanceled} 事件。

set_pending_delay(ref self: ContractState, new_delay: u64, new_schedule: u64) external

设置待处理延迟及其时间表的元组的 Setter。

可能会发出 {DefaultAdminDelayChangeCanceled} 事件。

delay_change_wait(self: @ContractState, new_delay: u64) → u64 external

返回在 new_delay 将 成为新的 default_admin_delay 之后要等待的秒数。

返回的值保证,如果减少延迟,则将在经过一段等待时间后生效,该等待时间符合先前设置的延迟。

事件

RoleAdminChanged(role: felt252, previous_admin_role: felt252, new_admin_role: felt252) event

new_admin_role 被设置为 role 的管理角色时发出,替换 previous_admin_role

DEFAULT_ADMIN_ROLE 是所有角色的起始管理员,尽管 未发出 RoleAdminChanged 来指示这一点。

RoleGranted(role: felt252, account: ContractAddress, sender: ContractAddress) event

account 被授予 role 时发出。

sender 是发起合约调用的账户,是具有管理角色的账户 或如果从构造函数调用 _grant_role,则是部署器地址。

RoleRevoked(role: felt252, account: ContractAddress, sender: ContractAddress) event

roleaccount 撤销时发出。

sender 是发起合约调用的账户:

  • 如果使用 revoke_role,则是管理角色持有者。

  • 如果使用 renounce_role,则是角色持有者(即 account)。

RoleGrantedWithDelay(role: felt252, account: ContractAddress, sender: ContractAddress, delay: u64) event

account 被授予具有延迟的 role 时发出。

sender 是发起合约调用的账户,是具有管理角色的账户 或如果从构造函数调用 _grant_role_with_delay,则是部署器地址。

DefaultAdminTransferScheduled(new_admin: ContractAddress, accept_schedule: u64) event

default_admin 转移开始时发出。

通过仅在 accept_schedule 过去后调用 accept_default_admin_transfer 来将 new_admin 设置为下一个成为 default_admin 的地址。

DefaultAdminTransferCanceled() event

pending_default_admin 被重置时发出,如果从 未接受过,无论其时间表如何。

DefaultAdminDelayChangeScheduled(new_delay: u64, effect_schedule: u64) event

default_admin_delay 更改开始时发出。

effect_schedule 过去后,将 new_delay 设置为应用于默认管理员转移之间的下一个延迟。

DefaultAdminDelayChangeCanceled() event

pending_default_admin_delay 被重置时发出,如果其时间表未通过。