Skip to content

Commit b50b3b7

Browse files
authored
Merge pull request #110 from OpenZeppelin/feat/cairo-update-v3.0.0
Cairo: release v3.0.0 docs
2 parents 36bd7be + 3a81b31 commit b50b3b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+172
-140
lines changed

STANDARDS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ The OpenZeppelin approach to achieve this goal will include the following sectio
4949

5050
⊞ Quadrants: Information-Oriented/Reference
5151

52-
📖 [Reference Example](https://docs.openzeppelin.com/contracts-cairo/alpha/api/access)
52+
📖 [Reference Example](https://docs.openzeppelin.com/contracts-cairo/3.x/api/access)
5353

5454

5555
It should be noted that not every library or tool may have every section, and that’s ok. This is purely a guide to help kickstart helpful documentation, not a strict pattern to follow.

content/contracts-cairo/2.x/api/merkle-tree.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ This module provides:
1515

1616
To use it as a standalone package, you can add it in your `Scarb.toml` as follows:
1717

18-
`openzeppelin_merkle_tree = "3.0.0-alpha.1"`
18+
`openzeppelin_merkle_tree = "2.0.0"`
1919

2020
## [](#modules)Modules
2121

content/contracts-cairo/2.x/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ title: Contracts for Cairo
88

99

1010
**A library for secure smart contract development** written in Cairo for [Starknet][starknet]. This library consists of a set of
11-
[reusable components](/contracts-cairo/2.x/components) to build custom smart contracts, as well as ready-to-deploy [presets](/contracts-cairo/2.x/presets). You can also
12-
find other [utilities](/contracts-cairo/2.x/api/utilities) including [interfaces and dispatchers](/contracts-cairo/alpha/interfaces) and [test utilities](/contracts-cairo/2.x/api/testing)
11+
[reusable components](/contracts-cairo/2.x/components) to build custom smart contracts, as well as ready-to-deploy [presets](/contracts-cairo/2.x/presets). It also provides
12+
helpful [utilities](/contracts-cairo/2.x/api/utilities) and [test utilities](/contracts-cairo/2.x/api/testing)
1313
that facilitate testing with Starknet Foundry.
1414

1515
<Callout>

content/contracts-cairo/2.x/wizard.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ contract and learn about the components offered in OpenZeppelin Contracts for Ca
99
We strongly recommend checking the [Components](./components) section to understand how to extend from our library.
1010
</Callout>
1111

12-
<OZWizard lang="cairo" version="2.0.0" />
12+
import { UMBRELLA_VERSION } from "./utils/constants.js";
13+
14+
<OZWizard lang="cairo" version={UMBRELLA_VERSION} />
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ The most common and basic form of access control is the concept of ownership: th
1313
of a contract and can do administrative tasks on it.
1414
This approach is perfectly reasonable for contracts that have a single administrative user.
1515

16-
OpenZeppelin Contracts for Cairo provides [OwnableComponent](/contracts-cairo/alpha/api/access#OwnableComponent) for implementing ownership in your contracts.
16+
OpenZeppelin Contracts for Cairo provides [OwnableComponent](/contracts-cairo/3.x/api/access#OwnableComponent) for implementing ownership in your contracts.
1717

1818
### Usage
1919

2020
Integrating this component into a contract first requires assigning an owner.
2121
The implementing contract’s constructor should set the initial owner by passing the owner’s address to Ownable’s
22-
[`initializer`](/contracts-cairo/alpha/api/access#OwnableComponent-initializer) like this:
22+
[`initializer`](/contracts-cairo/3.x/api/access#OwnableComponent-initializer) like this:
2323

2424
```rust
2525
#[starknet::contract]
@@ -106,7 +106,7 @@ will no longer be callable!
106106
### Two step transfer
107107

108108
The component also offers a more robust way of transferring ownership via the
109-
[OwnableTwoStepImpl](/contracts-cairo/alpha/api/access#OwnableComponent-Embeddable-Impls-OwnableTwoStepImpl) implementation. A two step transfer mechanism helps
109+
[OwnableTwoStepImpl](/contracts-cairo/3.x/api/access#OwnableComponent-Embeddable-Impls-OwnableTwoStepImpl) implementation. A two step transfer mechanism helps
110110
to prevent unintended and irreversible owner transfers. Simply replace the `OwnableMixinImpl`
111111
with its respective two step variant:
112112

@@ -146,7 +146,7 @@ flexibility in this regard.
146146

147147
In essence, we will be defining multiple roles, each allowed to perform different sets of actions.
148148
An account may have, for example, 'moderator', 'minter' or 'admin' roles, which you will then check for
149-
instead of simply using [`assert_only_owner`](/contracts-cairo/alpha/api/access#OwnableComponent-assert_only_owner). This check can be enforced through [`assert_only_role`](/contracts-cairo/alpha/api/access#AccessControlComponent-assert_only_role).
149+
instead of simply using [`assert_only_owner`](/contracts-cairo/3.x/api/access#OwnableComponent-assert_only_owner). This check can be enforced through [`assert_only_role`](/contracts-cairo/3.x/api/access#AccessControlComponent-assert_only_role).
150150
Separately, you will be able to define rules for how accounts can be granted a role, have it revoked, and more.
151151

152152
Most software uses access control systems that are role-based: some users are regular users, some may be supervisors
@@ -158,7 +158,7 @@ For each role that you want to define, you will create a new _role identifier_ t
158158
check if an account has that role. See [Creating role identifiers](#creating-role-identifiers) for information
159159
on creating identifiers.
160160

161-
Here’s a simple example of implementing [AccessControl](/contracts-cairo/alpha/api/access#AccessControlComponent) on a portion of an ERC20 token contract which defines
161+
Here’s a simple example of implementing [AccessControl](/contracts-cairo/3.x/api/access#AccessControlComponent) on a portion of an ERC20 token contract which defines
162162
and sets a 'minter' role:
163163

164164
```rust
@@ -242,12 +242,12 @@ mod MyContract {
242242
```
243243

244244
<Callout type='warn'>
245-
Make sure you fully understand how [AccessControl](/contracts-cairo/alpha/api/access#AccessControlComponent) works before
245+
Make sure you fully understand how [AccessControl](/contracts-cairo/3.x/api/access#AccessControlComponent) works before
246246
using it on your system, or copy-pasting the examples from this guide.
247247
</Callout>
248248

249249
While clear and explicit, this isn’t anything we wouldn’t have been able to achieve with
250-
[Ownable](/contracts-cairo/alpha/api/access#OwnableComponent). Where [AccessControl](/contracts-cairo/alpha/api/access#AccessControlComponent) shines the most is in scenarios where granular
250+
[Ownable](/contracts-cairo/3.x/api/access#OwnableComponent). Where [AccessControl](/contracts-cairo/3.x/api/access#AccessControlComponent) shines the most is in scenarios where granular
251251
permissions are required, which can be implemented by defining _multiple_ roles.
252252

253253
Let’s augment our ERC20 token example by also defining a 'burner' role, which lets accounts destroy tokens:
@@ -350,16 +350,16 @@ security practice. Note that each account may still have more than one role, if
350350

351351
### Granting and revoking roles
352352

353-
The ERC20 token example above uses [`_grant_role`](/contracts-cairo/alpha/api/access#AccessControlComponent-_grant_role),
353+
The ERC20 token example above uses [`_grant_role`](/contracts-cairo/3.x/api/access#AccessControlComponent-_grant_role),
354354
an `internal` function that is useful when programmatically assigning
355355
roles (such as during construction). But what if we later want to grant the 'minter' role to additional accounts?
356356

357357
By default, **accounts with a role cannot grant it or revoke it from other accounts**: all having a role does is making
358-
the [`assert_only_role`](/contracts-cairo/alpha/api/access#AccessControlComponent-assert_only_role) check pass. To grant and revoke roles dynamically, you will need help from the role’s _admin_.
358+
the [`assert_only_role`](/contracts-cairo/3.x/api/access#AccessControlComponent-assert_only_role) check pass. To grant and revoke roles dynamically, you will need help from the role’s _admin_.
359359

360360
Every role has an associated admin role, which grants permission to call the
361-
[`grant_role`](/contracts-cairo/alpha/api/access#AccessControlComponent-grant_role) and
362-
[`revoke_role`](/contracts-cairo/alpha/api/access#AccessControlComponent-revoke_role) functions.
361+
[`grant_role`](/contracts-cairo/3.x/api/access#AccessControlComponent-grant_role) and
362+
[`revoke_role`](/contracts-cairo/3.x/api/access#AccessControlComponent-revoke_role) functions.
363363
A role can be granted or revoked by using these if the calling account has the corresponding admin role.
364364
Multiple roles may have the same admin role to make management easier.
365365
A role’s admin can even be the same role itself, which would cause accounts with that role to be able
@@ -369,9 +369,9 @@ This mechanism can be used to create complex permissioning structures resembling
369369
provides an easy way to manage simpler applications. `AccessControl` includes a special role with the role identifier
370370
of `0`, called `DEFAULT_ADMIN_ROLE`, which acts as the **default admin role for all roles**.
371371
An account with this role will be able to manage any other role, unless
372-
[`set_role_admin`](/contracts-cairo/alpha/api/access#AccessControlComponent-set_role_admin) is used to select a new admin role.
372+
[`set_role_admin`](/contracts-cairo/3.x/api/access#AccessControlComponent-set_role_admin) is used to select a new admin role.
373373

374-
Since it is the admin for all roles by default, and in fact it is also its own admin, this role carries significant risk. To mitigate this risk we provide [AccessControlDefaultAdminRules](/contracts-cairo/alpha/api/access#AccessControlDefaultAdminRulesComponent), a recommended extension of AccessControl that adds a number of enforced security measures for this role: the admin is restricted to a single account, with a 2-step transfer procedure with a delay in between steps.
374+
Since it is the admin for all roles by default, and in fact it is also its own admin, this role carries significant risk. To mitigate this risk we provide [AccessControlDefaultAdminRules](/contracts-cairo/3.x/api/access#AccessControlDefaultAdminRulesComponent), a recommended extension of AccessControl that adds a number of enforced security measures for this role: the admin is restricted to a single account, with a 2-step transfer procedure with a delay in between steps.
375375

376376
Let’s take a look at the ERC20 token example, this time taking advantage of the default admin role:
377377

content/contracts-cairo/alpha/accounts.mdx renamed to content/contracts-cairo/3.x/accounts.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ A more detailed discussion on the topic can be found in
1313
[Starknet Shaman’s forum](https://community.starknet.io/t/starknet-account-abstraction-model-part-1/781).
1414

1515
<Callout>
16-
For detailed information on the usage and implementation check the [API Reference](/contracts-cairo/alpha/api/account) section.
16+
For detailed information on the usage and implementation check the [API Reference](/contracts-cairo/3.x/api/account) section.
1717
</Callout>
1818

1919
## What is an account?
@@ -97,11 +97,11 @@ Starknet native account abstraction pattern allows for the creation of custom ac
9797
usually most account implementations validate transactions using the [Stark curve](https://docs.starknet.io/learn/protocol/cryptography#the-stark-curve) which is the most efficient way
9898
of validating signatures since it is a STARK-friendly curve.
9999

100-
OpenZeppelin Contracts for Cairo provides [AccountComponent](/contracts-cairo/alpha/api/account#AccountComponent) for implementing this validation scheme.
100+
OpenZeppelin Contracts for Cairo provides [AccountComponent](/contracts-cairo/3.x/api/account#AccountComponent) for implementing this validation scheme.
101101

102102
### Usage
103103

104-
Constructing an account contract requires integrating both [AccountComponent](/contracts-cairo/alpha/api/account#AccountComponent) and [SRC5Component](/contracts-cairo/alpha/api/introspection#SRC5Component). The contract should also set up the constructor to initialize the public key that will be used as the account’s signer. Here’s an example of a basic contract:
104+
Constructing an account contract requires integrating both [AccountComponent](/contracts-cairo/3.x/api/account#AccountComponent) and [SRC5Component](/contracts-cairo/3.x/api/introspection#SRC5Component). The contract should also set up the constructor to initialize the public key that will be used as the account’s signer. Here’s an example of a basic contract:
105105

106106
```rust
107107
#[starknet::contract(account)]
@@ -180,11 +180,11 @@ pub trait AccountABI {
180180
## Ethereum Account
181181

182182
Besides the Stark-curve account, OpenZeppelin Contracts for Cairo also offers Ethereum-flavored accounts that use the [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) curve for signature validation.
183-
For this the [EthAccountComponent](/contracts-cairo/alpha/api/account#EthAccountComponent) must be used.
183+
For this the [EthAccountComponent](/contracts-cairo/3.x/api/account#EthAccountComponent) must be used.
184184

185185
### Usage
186186

187-
Constructing a secp256k1 account contract also requires integrating both [EthAccountComponent](/contracts-cairo/alpha/api/account#EthAccountComponent) and [SRC5Component](/contracts-cairo/alpha/api/introspection#SRC5Component).
187+
Constructing a secp256k1 account contract also requires integrating both [EthAccountComponent](/contracts-cairo/3.x/api/account#EthAccountComponent) and [SRC5Component](/contracts-cairo/3.x/api/introspection#SRC5Component).
188188
The contract should also set up the constructor to initialize the public key that will be used as the account’s signer.
189189
Here’s an example of a basic contract:
190190

content/contracts-cairo/alpha/api/access.mdx renamed to content/contracts-cairo/3.x/api/access.mdx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ Functions
241241
- [`change_default_admin_delay(new_delay)`](#IAccessControlDefaultAdminRules-change_default_admin_delay)
242242
- [`rollback_default_admin_delay()`](#IAccessControlDefaultAdminRules-rollback_default_admin_delay)
243243
- [`default_admin_delay_increase_wait()`](#IAccessControlDefaultAdminRules-default_admin_delay_increase_wait)
244+
- [`maximum_default_admin_transfer_delay()`](#IAccessControlDefaultAdminRules-maximum_default_admin_transfer_delay)
244245

245246
Events
246247

@@ -401,11 +402,25 @@ May emit a [DefaultAdminDelayChangeCanceled](#IAccessControlDefaultAdminRules-De
401402
id="IAccessControlDefaultAdminRules-default_admin_delay_increase_wait"
402403
kind="external"
403404
>
404-
Maximum time in seconds for an increase to [default\_admin\_delay](#IAccessControlDefaultAdminRules-default_admin_delay) (that is scheduled using [change\_default\_admin\_delay](#IAccessControlDefaultAdminRules-change_default_admin_delay)) to take effect. Defaults to 5 days.
405-
406-
When the [default\_admin\_delay](#IAccessControlDefaultAdminRules-default_admin_delay) is scheduled to be increased, it goes into effect after the new delay has passed with the purpose of giving enough time for reverting any accidental change (i.e. using milliseconds instead of seconds) that may lock the contract. However, to avoid excessive schedules, the wait is capped by this function and it can be overridden for a custom [default\_admin\_delay](#IAccessControlDefaultAdminRules-default_admin_delay) increase scheduling.
405+
Maximum time in seconds for an increase to [default\_admin\_delay](#IAccessControlDefaultAdminRules-default_admin_delay) (that is scheduled using [change\_default\_admin\_delay](#IAccessControlDefaultAdminRules-change_default_admin_delay)) to take effect.
407406

407+
<Callout type='warn'>
408408
Make sure to add a reasonable amount of time while overriding this value, otherwise, there’s a risk of setting a high new delay that goes into effect almost immediately without the possibility of human intervention in the case of an input error (e.g. set milliseconds instead of seconds).
409+
</Callout>
410+
411+
Consider carefully the value set for `MAXIMUM_DEFAULT_ADMIN_TRANSFER_DELAY` too, since it will affect how fast you can recover from an accidental delay increase.
412+
</APIItem>
413+
414+
<APIItem
415+
functionSignature="maximum_default_admin_transfer_delay() → u64"
416+
id="IAccessControlDefaultAdminRules-maximum_default_admin_transfer_delay"
417+
kind="external"
418+
>
419+
Maximum time in seconds for a `default_admin` transfer delay.
420+
421+
<Callout type='warn'>
422+
If `MAXIMUM_DEFAULT_ADMIN_TRANSFER_DELAY` is set too high, you might be unable to recover from an accidental delay increase for an extended period. Too low, and it unnecessarily restricts how much security delay you can impose for `default_admin` transfers. As a best practice, consider setting it in the 30-60 day range for a good balance between security and recoverability.
423+
</Callout>
409424
</APIItem>
410425

411426
#### Events [!toc] [#IAccessControlDefaultAdminRules-Events]
@@ -1148,6 +1163,7 @@ Embeddable Implementations
11481163
- [`change_default_admin_delay(self, new_delay)`](#IAccessControlDefaultAdminRules-change_default_admin_delay)
11491164
- [`rollback_default_admin_delay(self)`](#IAccessControlDefaultAdminRules-rollback_default_admin_delay)
11501165
- [`default_admin_delay_increase_wait(self)`](#IAccessControlDefaultAdminRules-default_admin_delay_increase_wait)
1166+
- [`maximum_default_admin_transfer_delay(self)`](#IAccessControlDefaultAdminRules-maximum_default_admin_transfer_delay)
11511167

11521168
#### AccessControlImpl [!toc] [#AccessControlDefaultAdminRulesComponent-Embeddable-Impls-AccessControlImpl]
11531169

@@ -1368,6 +1384,18 @@ Make sure to add a reasonable amount of time while overriding this value, otherw
13681384
</Callout>
13691385
</APIItem>
13701386

1387+
<APIItem
1388+
functionSignature="maximum_default_admin_transfer_delay(self: @ContractState) → u64"
1389+
id="AccessControlDefaultAdminRulesComponent-maximum_default_admin_transfer_delay"
1390+
kind="external"
1391+
>
1392+
Maximum time in seconds for a `default_admin` transfer delay.
1393+
1394+
<Callout type='warn'>
1395+
If `MAXIMUM_DEFAULT_ADMIN_TRANSFER_DELAY` is set too high, you might be unable to recover from an accidental delay increase for an extended period. Too low, and it unnecessarily restricts how much security delay you can impose for `default_admin` transfers. As a best practice, consider setting it in the 30-60 day range for a good balance between security and recoverability.
1396+
</Callout>
1397+
</APIItem>
1398+
13711399
<APIItem
13721400
functionSignature="has_role(self: @ContractState, role: felt252, account: ContractAddress) → bool"
13731401
id="AccessControlDefaultAdminRulesComponent-has_role"
File renamed without changes.
File renamed without changes.

content/contracts-cairo/alpha/api/erc20.mdx renamed to content/contracts-cairo/3.x/api/erc20.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,8 @@ Allows contracts to hook logic into deposit and withdraw transactions. This is w
11391139

11401140
ERC4626 preview methods must be inclusive of any entry or exit fees. Fees are calculated using [FeeConfigTrait](#ERC4626Component-FeeConfigTrait) methods and automatically adjust the final asset and share amounts. Fee transfers are handled in `ERC4626HooksTrait` methods.
11411141

1142+
When a vault implements fees on deposits or withdrawals (either in shares or assets), fee transfers must be handled in these hooks by library clients. This creates a non-atomic operation flow consisting of multiple state-changing steps: transferring assets, minting or burning shares, and transferring (or minting) fees. Between these steps, the vault's state is temporarily inconsistent: the asset-to-share conversion rate does not accurately reflect the vault's final state until all steps have completed. Therefore, it is critical to avoid making any external calls (including to the vault contract itself) or querying conversion rates during hook execution.
1143+
11421144
Special care must be taken when calling external contracts in these hooks. In that case, consider implementing reentrancy protections. For example, in the `withdraw` flow, the `withdraw_limit` is checked **before** the `before_withdraw` hook is invoked. If this hook performs a reentrant call that invokes `withdraw` again, the subsequent check on `withdraw_limit` will be done before the first withdrawal's core logic (e.g., burning shares and transferring assets) is executed. This could lead to bypassing withdrawal constraints or draining funds.
11431145

11441146
See the [ERC4626AssetsFeesMock](https://github.com/OpenZeppelin/cairo-contracts/tree/main/packages/test_common/src/mocks/erc4626.cairo#L253) and [ERC4626SharesFeesMock](https://github.com/OpenZeppelin/cairo-contracts/tree/main/packages/test_common/src/mocks/erc4626.cairo#L426) examples.

0 commit comments

Comments
 (0)