访问控制
这个 crate 提供了一些方法来限制谁可以访问合约的函数或者何时可以访问。
-
Ownable 是一个简单的机制,具有一个可以分配给单个账户的 "owner" 角色。 这种机制在简单的场景中很有用,但是对于精细的访问需求可能会超出它的能力。
-
AccessControl 提供了一种通用的基于角色的访问控制机制。可以创建多个分层角色,并将每个角色分配给多个账户。
核心
OwnableComponent
use openzeppelin_access::ownable::OwnableComponent;
Ownable
提供了一种基本的访问控制机制,其中一个账户
(所有者)可以被授予对特定函数的独占访问权限。
这个模块包含了内部的 assert_only_owner
,用于限制一个函数只能被所有者使用。
transfer_ownership(ref self: ContractState, new_owner: ContractAddress)
external
将合约的所有权转移到一个新的账户 (new_owner
)。
只能由当前所有者调用。
触发一个 OwnershipTransferred 事件。
renounce_ownership(ref self: ContractState)
external
使合约没有所有者。将不再可能调用 assert_only_owner
函数。只能由当前所有者调用。
放弃所有权将使合约没有所有者, 从而删除任何仅对所有者可用的功能。 |
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 事件。
_transfer_ownership(ref self: ContractState, new_owner: ContractAddress)
internal
将合约的所有权转移到一个新的账户 (new_owner
)。
没有访问限制的内部函数。
触发一个 OwnershipTransferred 事件。
_propose_owner(ref self: ContractState, new_owner: ContractAddress)
internal
在两步转移中设置一个新的待定所有者。
没有访问限制的内部函数。
触发一个 OwnershipTransferStarted 事件。
IAccessControl
use openzeppelin_access::accesscontrol::interface::IAccessControl;
AccessControl 的外部接口。
0x23700be02858dbe2ac4dc9c9f66d0b6b0ed81ec7f970ca6844500a56ff61751
get_role_admin(role: felt252) → felt252
external
返回控制 role
的管理角色。参见 grant_role 和
revoke_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_role 和 revoke_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 没有发出信号表明这一点。
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_role、grant_role_with_delay 和 revoke_role 函数动态地授予和撤销角色。 每个角色都有一个关联的管理角色,并且只有 有角色管理角色的账户才能调用 grant_role、grant_role_with_delay 和 revoke_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_role 和
revoke_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_role 和 revoke_role 来管理。 此函数的 目的是提供一种机制,让账户在受到威胁时(例如当可信设备放错地方时)失去其权限。
如果调用账户已被撤销 role
,则触发一个 RoleRevoked
事件。
要求:
-
调用者必须是
account
。
可能会触发一个 RoleRevoked 事件。
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 来初始化合约。
`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。
-
对于
account
,role
必须尚未生效。
可能会触发 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
RoleGrantedWithDelay(role: felt252, account: ContractAddress, sender: ContractAddress, delay: u64)
event
扩展
IAccessControlDefaultAdminRules
use openzeppelin_access::accesscontrol::extensions::interface::IAccessControlDefaultAdminRules;
声明的 AccessControlDefaultAdminRules 外部接口,用于支持 SRC5 检测。
0x3509b3083c9586afe5dae781146b0608c3846870510f8d4d21ae38676cc33eb
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_delay
和 effect_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 必须重置为零值。
要求:
-
只能由 pending_default_admin 的
new_admin
调用。 -
pending_default_admin 的
accept_schedule
应该已经过去。
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
。
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_delay
和 effect_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 必须重置为零值。
要求:
-
只能由 pending_default_admin 的
new_admin
调用。 -
pending_default_admin 的
accept_schedule
应该已经过去。
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_role 和 revoke_role 进行管理。此函数 旨在提供一种机制,使账户在受到攻击时(例如,当受信任的设备放错地方时)失去其权限。
如果调用账户已被撤销 role
,则发出 RoleRevoked 事件。
要求:
-
调用者必须是
account
。
可能会发出 RoleRevoked 事件。
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
不能为零地址。
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
。如果 role
对 account
不生效,则该函数不执行任何操作。如果 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
当 role
被 account
撤销时发出。
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 被重置时发出,如果其时间表未通过。