Repository: OpenZeppelin/cairo-contracts (language: python)

Issue:
Update packages Scarb.toml and README
- Each package should have different keywords.
- Each package should have a README.


Discussion / hints:

Fix patch:
diff --git a/Scarb.toml b/Scarb.toml
index 70c4b56a0..4ef2b67a6 100644
--- a/Scarb.toml
+++ b/Scarb.toml
@@ -16,7 +16,9 @@ members = [
 
 [package]
 name = "openzeppelin"
+readme = "README.md"
 version.workspace = true
+keywords.workspace = true
 
 [workspace.package]
 version = "0.16.0"
@@ -26,13 +28,11 @@ scarb-version = "2.8.0"
 authors = ["OpenZeppelin Community <maintainers@openzeppelin.org>"]
 description = "OpenZeppelin Contracts written in Cairo for Starknet, a decentralized ZK Rollup"
 documentation = "https://docs.openzeppelin.com/contracts-cairo"
-readme = "README.md"
 repository = "https://github.com/OpenZeppelin/cairo-contracts"
 license-file = "LICENSE"
 keywords = [
     "openzeppelin",
     "starknet",
-    "cairo",
     "contracts",
     "security",
     "standards"
diff --git a/docs/modules/ROOT/pages/api/access.adoc b/docs/modules/ROOT/pages/api/access.adoc
index b94feee00..4d403341a 100644
--- a/docs/modules/ROOT/pages/api/access.adoc
+++ b/docs/modules/ROOT/pages/api/access.adoc
@@ -9,7 +9,7 @@
 
 include::../utils/_common.adoc[]
 
-This directory provides ways to restrict who can access the functions of a contract or when they can do it.
+This crate provides ways to restrict who can access the functions of a contract or when they can do it.
 
 - {Ownable} is a simple mechanism with a single "owner" role that can be assigned to a single account.
 This mechanism can be useful in simple scenarios, but fine grained access needs are likely to outgrow it.
diff --git a/docs/modules/ROOT/pages/api/account.adoc b/docs/modules/ROOT/pages/api/account.adoc
index 9735e93bf..ff1942a37 100644
--- a/docs/modules/ROOT/pages/api/account.adoc
+++ b/docs/modules/ROOT/pages/api/account.adoc
@@ -4,7 +4,7 @@
 
 = Account
 
-Reference of interfaces, presets, and utilities related to account contracts.
+This crate provides components to implement account contracts that can be used for interacting with the network.
 
 == Core
 
diff --git a/docs/modules/ROOT/pages/api/erc1155.adoc b/docs/modules/ROOT/pages/api/erc1155.adoc
index 48b529d4a..ff1cf0921 100644
--- a/docs/modules/ROOT/pages/api/erc1155.adoc
+++ b/docs/modules/ROOT/pages/api/erc1155.adoc
@@ -8,7 +8,7 @@
 
 include::../utils/_common.adoc[]
 
-Reference of interfaces, presets, and utilities related to ERC1155 contracts.
+This module provides interfaces, presets, and utilities related to ERC1155 contracts.
 
 TIP: For an overview of ERC1155, read our xref:erc1155.adoc[ERC1155 guide].
 
diff --git a/docs/modules/ROOT/pages/api/erc20.adoc b/docs/modules/ROOT/pages/api/erc20.adoc
index 6bec67359..d53aea12c 100644
--- a/docs/modules/ROOT/pages/api/erc20.adoc
+++ b/docs/modules/ROOT/pages/api/erc20.adoc
@@ -8,7 +8,7 @@
 
 include::../utils/_common.adoc[]
 
-Reference of interfaces and utilities related to ERC20 contracts.
+This module provides interfaces, presets, and utilities related to ERC20 contracts.
 
 TIP: For an overview of ERC20, read our {erc20-guide}.
 
diff --git a/docs/modules/ROOT/pages/api/erc721.adoc b/docs/modules/ROOT/pages/api/erc721.adoc
index b45f714f0..f5c78b5b1 100644
--- a/docs/modules/ROOT/pages/api/erc721.adoc
+++ b/docs/modules/ROOT/pages/api/erc721.adoc
@@ -8,7 +8,7 @@
 
 include::../utils/_common.adoc[]
 
-Reference of interfaces, presets, and utilities related to ERC721 contracts.
+This module provides interfaces, presets, and utilities related to ERC721 contracts.
 
 TIP: For an overview of ERC721, read our xref:erc721.adoc[ERC721 guide].
 
@@ -179,48 +179,6 @@ Returns the NFT ticker symbol.
 Returns the Uniform Resource Identifier (URI) for the `token_id` token.
 If the URI is not set for `token_id`, the return value will be an empty `ByteArray`.
 
-[.contract]
-[[IERC721Enumerable]]
-=== `++IERC721Enumerable++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/extensions/erc721_enumerable/interface.cairo[{github-icon},role=heading-link]
-
-Interface for the optional enumerable functions in {eip721}.
-
-[.contract-index]
-.{inner-src5}
---
-0x16bc0f502eeaf65ce0b3acb5eea656e2f26979ce6750e8502a82f377e538c87
---
-
-[.contract-index]
-.Functions
---
-* xref:#IERC721Enumerable-total_supply[`++total_supply()++`]
-* xref:#IERC721Enumerable-token_by_index[`++token_by_index(index)++`]
-* xref:#IERC721Enumerable-token_of_owner_by_index[`++token_of_owner_by_index(owner, index)++`]
---
-
-==== Functions
-
-[.contract-item]
-[[IERC721Enumerable-total_supply]]
-==== `[.contract-item-name]#++total_supply++#++() -> u256++` [.item-kind]#external#
-
-Returns the total amount of tokens stored by the contract.
-
-[.contract-item]
-[[IERC721Metadata-token_by_index]]
-==== `[.contract-item-name]#++token_by_index++#++(index: u256) -> u256++` [.item-kind]#external#
-
-Returns a token id at a given `index` of all the tokens stored by the contract.
-Use along with xref:#IERC721Enumerable-total_supply[IERC721Enumerable::total_supply] to enumerate all tokens.
-
-[.contract-item]
-[[IERC721Metadata-token_of_owner_by_index]]
-==== `[.contract-item-name]#++token_of_owner_by_index++#++(owner: ContractAddress, index: u256) -> u256++` [.item-kind]#external#
-
-Returns the token id owned by `owner` at a given `index` of its token list.
-Use along with xref:#IERC721-balance_of[IERC721::balance_of] to enumerate all of ``owner``'s tokens.
-
 [.contract]
 [[ERC721Component]]
 === `++ERC721Component++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/erc721.cairo#L7[{github-icon},role=heading-link]
@@ -731,6 +689,147 @@ See <<IERC721-ApprovalForAll,IERC721::ApprovalForAll>>.
 
 See <<IERC721-Transfer,IERC721::Transfer>>.
 
+== Receiver
+
+[.contract]
+[[IERC721Receiver]]
+=== `++IERC721Receiver++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/interface.cairo#L70-L79[{github-icon},role=heading-link]
+
+[.hljs-theme-dark]
+```cairo
+use openzeppelin::token::erc721::interface::IERC721Receiver;
+```
+
+Interface for contracts that support receiving `safe_transfer_from` transfers.
+
+[.contract-index]
+.{inner-src5}
+--
+0x3a0dff5f70d80458ad14ae37bb182a728e3c8cdda0402a5daa86620bdf910bc
+--
+
+[.contract-index]
+.Functions
+--
+* xref:#IERC721Receiver-on_erc721_received[`++on_erc721_received(operator, from, token_id, data)++`]
+--
+
+==== Functions
+
+[.contract-item]
+[[IERC721Receiver-on_erc721_received]]
+==== `[.contract-item-name]#++on_erc721_received++#++(operator: ContractAddress, from: ContractAddress, token_id: u256, data: Span<felt252>) -> felt252++` [.item-kind]#external#
+
+Whenever an IERC721 `token_id` token is transferred to this non-account contract via <<IERC721-safe_transfer_from,IERC721::safe_transfer_from>> by `operator` from `from`, this function is called.
+
+[.contract]
+[[ERC721ReceiverComponent]]
+=== `++ERC721ReceiverComponent++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/erc721_receiver.cairo[{github-icon},role=heading-link]
+
+[.hljs-theme-dark]
+```cairo
+use openzeppelin::token::erc721::ERC721ReceiverComponent;
+```
+
+ERC721Receiver component implementing <<IERC721Receiver,IERC721Receiver>>.
+
+NOTE: {src5-component-required-note}
+
+[.contract-index#ERC721ReceiverComponent-Embeddable-Mixin-Impl]
+.{mixin-impls}
+
+--
+.ERCReceiverMixinImpl
+* xref:#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverImpl[`++ERC721ReceiverImpl++`]
+* xref:#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverCamelImpl[`++ERC721ReceiverCamelImpl++`]
+* xref:api/introspection.adoc#SRC5Component-Embeddable-Impls[`++SRC5Impl++`]
+--
+
+[.contract-index#ERC721ReceiverComponent-Embeddable-Impls]
+.Embeddable Implementations
+--
+[.sub-index#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverImpl]
+.ERC721ReceiverImpl
+* xref:#ERC721ReceiverComponent-on_erc721_received[`++on_erc721_received(self, operator, from, token_id, data)++`]
+
+[.sub-index#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverCamelImpl]
+.ERC721ReceiverCamelImpl
+* xref:#ERC721ReceiverComponent-onERC721Received[`++onERC721Received(self, operator, from, tokenId, data)++`]
+--
+
+[.contract-index]
+.Internal Functions
+--
+.InternalImpl
+* xref:#ERC721ReceiverComponent-initializer[`++initializer(self)++`]
+--
+
+==== Embeddable functions
+
+[.contract-item]
+[[ERC721ReceiverComponent-on_erc721_received]]
+==== `[.contract-item-name]#++on_erc721_received++#++(self: @ContractState, operator: ContractAddress, from: ContractAddress, token_id: u256, data Span<felt252>) -> felt252++` [.item-kind]#external#
+
+Returns the `IERC721Receiver` interface ID.
+
+[.contract-item]
+[[ERC721ReceiverComponent-onERC721Received]]
+==== `[.contract-item-name]#++onERC721Received++#++(self: @ContractState, operator: ContractAddress, from: ContractAddress, token_id: u256, data Span<felt252>) -> felt252++` [.item-kind]#external#
+
+See <<ERC721ReceiverComponent-on_erc721_received,ERC721ReceiverComponent::on_erc721_received>>.
+
+==== Internal functions
+
+[.contract-item]
+[[ERC721ReceiverComponent-initializer]]
+==== `[.contract-item-name]#++initializer++#++(ref self: ContractState)++` [.item-kind]#internal#
+
+Registers the `IERC721Receiver` interface ID as supported through introspection.
+
+== Extensions
+
+[.contract]
+[[IERC721Enumerable]]
+=== `++IERC721Enumerable++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/extensions/erc721_enumerable/interface.cairo[{github-icon},role=heading-link]
+
+Interface for the optional enumerable functions in {eip721}.
+
+[.contract-index]
+.{inner-src5}
+--
+0x16bc0f502eeaf65ce0b3acb5eea656e2f26979ce6750e8502a82f377e538c87
+--
+
+[.contract-index]
+.Functions
+--
+* xref:#IERC721Enumerable-total_supply[`++total_supply()++`]
+* xref:#IERC721Enumerable-token_by_index[`++token_by_index(index)++`]
+* xref:#IERC721Enumerable-token_of_owner_by_index[`++token_of_owner_by_index(owner, index)++`]
+--
+
+==== Functions
+
+[.contract-item]
+[[IERC721Enumerable-total_supply]]
+==== `[.contract-item-name]#++total_supply++#++() -> u256++` [.item-kind]#external#
+
+Returns the total amount of tokens stored by the contract.
+
+[.contract-item]
+[[IERC721Enumerable-token_by_index]]
+==== `[.contract-item-name]#++token_by_index++#++(index: u256) -> u256++` [.item-kind]#external#
+
+Returns a token id at a given `index` of all the tokens stored by the contract.
+Use along with xref:#IERC721Enumerable-total_supply[IERC721Enumerable::total_supply] to enumerate all tokens.
+
+[.contract-item]
+[[IERC721Enumerable-token_of_owner_by_index]]
+==== `[.contract-item-name]#++token_of_owner_by_index++#++(owner: ContractAddress, index: u256) -> u256++` [.item-kind]#external#
+
+Returns the token id owned by `owner` at a given `index` of its token list.
+Use along with xref:#IERC721-balance_of[IERC721::balance_of] to enumerate all of ``owner``'s tokens.
+
 [.contract]
 [[ERC721EnumerableComponent]]
 === `++ERC721EnumerableComponent++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/extensions/erc721_enumerable.cairo[{github-icon},role=heading-link]
@@ -872,103 +971,6 @@ Removes `token_id` from this extension's token-tracking data structures.
 
 This has 0(1) time complexity but alters the indexed order by swapping `token_id` and the index thereof with the last token id and the index thereof e.g. removing `1` from `[1, 2, 3, 4]` results in `[4, 2, 3]`.
 
-== Receiver
-
-[.contract]
-[[IERC721Receiver]]
-=== `++IERC721Receiver++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/interface.cairo#L70-L79[{github-icon},role=heading-link]
-
-[.hljs-theme-dark]
-```cairo
-use openzeppelin::token::erc721::interface::IERC721Receiver;
-```
-
-Interface for contracts that support receiving `safe_transfer_from` transfers.
-
-[.contract-index]
-.{inner-src5}
---
-0x3a0dff5f70d80458ad14ae37bb182a728e3c8cdda0402a5daa86620bdf910bc
---
-
-[.contract-index]
-.Functions
---
-* xref:#IERC721Receiver-on_erc721_received[`++on_erc721_received(operator, from, token_id, data)++`]
---
-
-==== Functions
-
-[.contract-item]
-[[IERC721Receiver-on_erc721_received]]
-==== `[.contract-item-name]#++on_erc721_received++#++(operator: ContractAddress, from: ContractAddress, token_id: u256, data: Span<felt252>) -> felt252++` [.item-kind]#external#
-
-Whenever an IERC721 `token_id` token is transferred to this non-account contract via <<IERC721-safe_transfer_from,IERC721::safe_transfer_from>> by `operator` from `from`, this function is called.
-
-[.contract]
-[[ERC721ReceiverComponent]]
-=== `++ERC721ReceiverComponent++` link:https://github.com/OpenZeppelin/cairo-contracts/blob/release-v0.16.0/packages/token/src/erc721/erc721_receiver.cairo[{github-icon},role=heading-link]
-
-[.hljs-theme-dark]
-```cairo
-use openzeppelin::token::erc721::ERC721ReceiverComponent;
-```
-
-ERC721Receiver component implementing <<IERC721Receiver,IERC721Receiver>>.
-
-NOTE: {src5-component-required-note}
-
-[.contract-index#ERC721ReceiverComponent-Embeddable-Mixin-Impl]
-.{mixin-impls}
-
---
-.ERCReceiverMixinImpl
-* xref:#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverImpl[`++ERC721ReceiverImpl++`]
-* xref:#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverCamelImpl[`++ERC721ReceiverCamelImpl++`]
-* xref:api/introspection.adoc#SRC5Component-Embeddable-Impls[`++SRC5Impl++`]
---
-
-[.contract-index#ERC721ReceiverComponent-Embeddable-Impls]
-.Embeddable Implementations
---
-[.sub-index#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverImpl]
-.ERC721ReceiverImpl
-* xref:#ERC721ReceiverComponent-on_erc721_received[`++on_erc721_received(self, operator, from, token_id, data)++`]
-
-[.sub-index#ERC721ReceiverComponent-Embeddable-Impls-ERC721ReceiverCamelImpl]
-.ERC721ReceiverCamelImpl
-* xref:#ERC721ReceiverComponent-onERC721Received[`++onERC721Received(self, operator, from, tokenId, data)++`]
---
-
-[.contract-index]
-.Internal Functions
---
-.InternalImpl
-* xref:#ERC721ReceiverComponent-initializer[`++initializer(self)++`]
---
-
-==== Embeddable functions
-
-[.contract-item]
-[[ERC721ReceiverComponent-on_erc721_received]]
-==== `[.contract-item-name]#++on_erc721_received++#++(self: @ContractState, operator: ContractAddress, from: ContractAddress, token_id: u256, data Span<felt252>) -> felt252++` [.item-kind]#external#
-
-Returns the `IERC721Receiver` interface ID.
-
-[.contract-item]
-[[ERC721ReceiverComponent-onERC721Received]]
-==== `[.contract-item-name]#++onERC721Received++#++(self: @ContractState, operator: ContractAddress, from: ContractAddress, token_id: u256, data Span<felt252>) -> felt252++` [.item-kind]#external#
-
-See <<ERC721ReceiverComponent-on_erc721_received,ERC721ReceiverComponent::on_erc721_received>>.
-
-==== Internal functions
-
-[.contract-item]
-[[ERC721ReceiverComponent-initializer]]
-==== `[.contract-item-name]#++initializer++#++(ref self: ContractState)++` [.item-kind]#internal#
-
-Registers the `IERC721Receiver` interface ID as supported through introspection.
-
 == Presets
 
 [.contract]
diff --git a/docs/modules/ROOT/pages/api/governance.adoc b/docs/modules/ROOT/pages/api/governance.adoc
index c65177e86..f11a3de41 100644
--- a/docs/modules/ROOT/pages/api/governance.adoc
+++ b/docs/modules/ROOT/pages/api/governance.adoc
@@ -8,7 +8,7 @@
 
 = Governance
 
-Reference of interfaces and utilities related to Governance.
+This crate includes primitives for on-chain governance.
 
 == Timelock
 
diff --git a/docs/modules/ROOT/pages/api/introspection.adoc b/docs/modules/ROOT/pages/api/introspection.adoc
index 279be3479..ffa4681ef 100644
--- a/docs/modules/ROOT/pages/api/introspection.adoc
+++ b/docs/modules/ROOT/pages/api/introspection.adoc
@@ -4,7 +4,7 @@
 
 = Introspection
 
-Reference of interfaces and utilities related to https://en.wikipedia.org/wiki/Type_introspection[type introspection].
+This crate handles https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts. In other words, it examines which functions can be called on a given contract. This is referred to as the contract's interface.
 
 == Core
 
diff --git a/docs/modules/ROOT/pages/api/merkle-tree.adoc b/docs/modules/ROOT/pages/api/merkle-tree.adoc
index bda0f738c..9a634c7d9 100644
--- a/docs/modules/ROOT/pages/api/merkle-tree.adoc
+++ b/docs/modules/ROOT/pages/api/merkle-tree.adoc
@@ -8,7 +8,8 @@
 
 = Merkle Tree
 
-OpenZeppelin Contracts for Cairo provides a `merkle_tree` package with a set of utilities for verifying Merkle Tree proofs on-chain. The tree and the proofs can be generated using this {strk-merkle-tree}.
+This crate provides a set of utilities for verifying Merkle Tree proofs on-chain. The tree and the proofs can be
+generated using this {strk-merkle-tree}.
 
 This module provides:
 
diff --git a/docs/modules/ROOT/pages/api/security.adoc b/docs/modules/ROOT/pages/api/security.adoc
index f011692d7..d86431e1c 100644
--- a/docs/modules/ROOT/pages/api/security.adoc
+++ b/docs/modules/ROOT/pages/api/security.adoc
@@ -2,7 +2,7 @@
 
 = Security
 
-Reference of components, interfaces and utilities found in the library's `security/` directory.
+This crate provides components to handle common security-related tasks.
 
 == Initializable
 
diff --git a/docs/modules/ROOT/pages/api/token_common.adoc b/docs/modules/ROOT/pages/api/token_common.adoc
index a89754d7c..0c8993be0 100644
--- a/docs/modules/ROOT/pages/api/token_common.adoc
+++ b/docs/modules/ROOT/pages/api/token_common.adoc
@@ -6,7 +6,7 @@
 
 include::../utils/_common.adoc[]
 
-Reference of extension and utilities that are common to multiple token standards.
+This module provides extensions and utilities that are common to multiple token standards.
 
 == ERC2981
 
diff --git a/docs/modules/ROOT/pages/api/upgrades.adoc b/docs/modules/ROOT/pages/api/upgrades.adoc
index c50af65fd..1b27d6da8 100644
--- a/docs/modules/ROOT/pages/api/upgrades.adoc
+++ b/docs/modules/ROOT/pages/api/upgrades.adoc
@@ -3,7 +3,7 @@
 
 = Upgrades
 
-Reference of interfaces and utilities related to upgradeability.
+This crate provides interfaces and utilities related to upgradeability.
 
 == Core
 
diff --git a/docs/modules/ROOT/pages/api/utilities.adoc b/docs/modules/ROOT/pages/api/utilities.adoc
index 1000eca3b..b968dcab7 100644
--- a/docs/modules/ROOT/pages/api/utilities.adoc
+++ b/docs/modules/ROOT/pages/api/utilities.adoc
@@ -2,11 +2,9 @@
 
 :deploy_syscall: link:https://docs.starknet.io/documentation/architecture_and_concepts/Smart_Contracts/system-calls-cairo1/#deploy[deploy_syscall]
 
-The following documentation provides reasoning and examples for functions and constants found in `openzeppelin::utils`.
+This crate provides miscellaneous components and libraries containing utility functions to handle common tasks.
 
-CAUTION: Expect this module to evolve (as it has already done).
-
-== Core utilities
+== Core
 
 [.contract]
 [[utils]]
diff --git a/packages/access/README.md b/packages/access/README.md
new file mode 100644
index 000000000..748b00ad0
--- /dev/null
+++ b/packages/access/README.md
@@ -0,0 +1,20 @@
+## Access Control
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/access
+
+This crate provides ways to restrict who can access the functions of a contract or when they can do it.
+
+- `Ownable` is a simple mechanism with a single "owner" role that can be assigned to a single contract (usually an account). This mechanism
+can be useful in simple scenarios, but fine grained access needs are likely to outgrow it.
+
+- `AccessControl` provides a general role based access control mechanism. Multiple hierarchical roles can be created
+and assigned each to multiple accounts.
+
+### Interfaces
+
+- `IAccessControl`
+
+### Components
+
+- `OwnableComponent`
+- `AccessControlComponent`
diff --git a/packages/access/Scarb.toml b/packages/access/Scarb.toml
index ab2a11fcf..6e031bf4e 100644
--- a/packages/access/Scarb.toml
+++ b/packages/access/Scarb.toml
@@ -1,5 +1,13 @@
 [package]
 name = "openzeppelin_access"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "access"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -7,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/account/README.md b/packages/account/README.md
new file mode 100644
index 000000000..15eb51d5c
--- /dev/null
+++ b/packages/account/README.md
@@ -0,0 +1,20 @@
+## Account
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/account
+
+This crate provides components to implement account contracts that can be used for interacting with the network.
+
+- `Account` validates transactions from signatures over the
+[STARK Curve](https://docs.starknet.io/architecture-and-concepts/cryptography/stark-curve/).
+
+- `EthAccount` validates transactions from signatures over the
+[Secp256k1 curve](https://en.bitcoin.it/wiki/Secp256k1).
+
+### Interfaces
+
+- `ISRC6`
+
+### Components
+
+- `AccountComponent`
+- `EthAccountComponent`
diff --git a/packages/account/Scarb.toml b/packages/account/Scarb.toml
index 6b1734a83..8d98f4129 100644
--- a/packages/account/Scarb.toml
+++ b/packages/account/Scarb.toml
@@ -1,5 +1,13 @@
 [package]
 name = "openzeppelin_account"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "account"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -7,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/governance/README.md b/packages/governance/README.md
new file mode 100644
index 000000000..7689e67b7
--- /dev/null
+++ b/packages/governance/README.md
@@ -0,0 +1,14 @@
+## Governance
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/governance
+
+This crate includes primitives for on-chain governance.
+
+### Interfaces
+
+- `ITimelock`
+- `IVotes`
+
+### Components
+
+- `TimelockControllerComponent`
diff --git a/packages/governance/Scarb.toml b/packages/governance/Scarb.toml
index 644641f1d..3631dcfa3 100644
--- a/packages/governance/Scarb.toml
+++ b/packages/governance/Scarb.toml
@@ -1,5 +1,13 @@
 [package]
 name = "openzeppelin_governance"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "governance"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -7,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/introspection/README.md b/packages/introspection/README.md
new file mode 100644
index 000000000..8e4e65c0e
--- /dev/null
+++ b/packages/introspection/README.md
@@ -0,0 +1,14 @@
+## Introspection
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/introspection
+
+This crate handles [type introspection](https://en.wikipedia.org/wiki/Type_introspection) of contracts. In other words, it examines which functions can be called on a given contract. This is referred to as the contract's interface.
+examining which functions can be called on them. This is usually referred to as a contract’s interface.
+
+### Interfaces
+
+- `ISRC5`
+
+### Components
+
+- `SRC5Component`
diff --git a/packages/introspection/Scarb.toml b/packages/introspection/Scarb.toml
index 1ccc1aae8..2bca21a88 100644
--- a/packages/introspection/Scarb.toml
+++ b/packages/introspection/Scarb.toml
@@ -1,6 +1,14 @@
 
 [package]
 name = "openzeppelin_introspection"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "introspection"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +16,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/merkle_tree/README.md b/packages/merkle_tree/README.md
new file mode 100644
index 000000000..0abe18575
--- /dev/null
+++ b/packages/merkle_tree/README.md
@@ -0,0 +1,7 @@
+## Merkle Tree
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/introspection
+
+This crate provides a set of utilities for verifying Merkle Tree proofs on-chain. The tree and the proofs can be
+generated using this [JavaScript library](https://github.com/ericnordelo/strk-merkle-tree) both for Pedersen and Poseidon
+hashing algorithms.
diff --git a/packages/merkle_tree/Scarb.toml b/packages/merkle_tree/Scarb.toml
index 39472084f..1cd03dffa 100644
--- a/packages/merkle_tree/Scarb.toml
+++ b/packages/merkle_tree/Scarb.toml
@@ -1,6 +1,12 @@
 
 [package]
 name = "openzeppelin_merkle_tree"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "cairo",
+    "merkle_tree",
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +14,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/presets/README.md b/packages/presets/README.md
new file mode 100644
index 000000000..9f0db31cd
--- /dev/null
+++ b/packages/presets/README.md
@@ -0,0 +1,18 @@
+## Presets
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/presets
+
+Presets are ready-to-deploy contracts provided by the library. Since presets are intended to be very simple and as
+generic as possible, there’s no support for custom or complex contracts such as `ERC20Pausable` or `ERC721Mintable`.
+
+For contract customization and combination of modules you can use
+[Wizard for Cairo](https://wizard.openzeppelin.com/cairo), our code-generation tool.
+
+### Presets
+
+- `AccountUpgradeable`
+- `ERC20Upgradeable`
+- `ERC721Upgradeable`
+- `ERC1155Upgradeable`
+- `EthAccountUpgradeable`
+- `UniversalDeployer`
diff --git a/packages/presets/Scarb.toml b/packages/presets/Scarb.toml
index 1d1c033e2..ec0e8cf5d 100644
--- a/packages/presets/Scarb.toml
+++ b/packages/presets/Scarb.toml
@@ -1,6 +1,13 @@
 
 [package]
 name = "openzeppelin_presets"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "presets"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/security/README.md b/packages/security/README.md
new file mode 100644
index 000000000..5433803f8
--- /dev/null
+++ b/packages/security/README.md
@@ -0,0 +1,11 @@
+## Security
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/security
+
+This crate provides components to handle common security-related tasks such as pausing a contract.
+
+### Components
+
+- `InitializableComponent`
+- `PausableComponent`
+- `ReentrancyGuardComponent`
diff --git a/packages/security/Scarb.toml b/packages/security/Scarb.toml
index eb7e70541..57c1d3e50 100644
--- a/packages/security/Scarb.toml
+++ b/packages/security/Scarb.toml
@@ -1,6 +1,13 @@
 
 [package]
 name = "openzeppelin_security"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "security"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/token/README.md b/packages/token/README.md
new file mode 100644
index 000000000..35b7a316c
--- /dev/null
+++ b/packages/token/README.md
@@ -0,0 +1,62 @@
+## Token
+
+This crate provides a set of components and modules to implement, extend, and interact with different token
+standards.
+
+### ERC20
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/erc20
+
+#### Interfaces
+
+- `IERC20`
+- `IERC20Metadata`
+
+#### Components
+
+- `ERC20Component`
+- `ERC20VotesComponent`
+
+### ERC721
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/erc721
+
+#### Interfaces
+
+- `IERC721`
+- `IERC721Metadata`
+- `IERC721Receiver`
+- `IERC721Enumerable`
+
+#### Components
+
+- `ERC721Component`
+- `ERC721ReceiverComponent`
+- `ERC721EnumerableComponent`
+
+### ERC1155
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/erc1155
+
+#### Interfaces
+
+- `IERC1155`
+- `IERC1155MetadataURI`
+- `IERC1155Receiver`
+
+#### Components
+
+- `ERC1155Component`
+- `ERC1155ReceiverComponent`
+
+### Common
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/token_common
+
+#### Interfaces
+
+- `IERC2981`
+
+#### Components
+
+- `ERC2981Component`
diff --git a/packages/token/Scarb.toml b/packages/token/Scarb.toml
index 57734bfe1..fa63eb4c0 100644
--- a/packages/token/Scarb.toml
+++ b/packages/token/Scarb.toml
@@ -1,6 +1,14 @@
 
 [package]
 name = "openzeppelin_token"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "token"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +16,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/upgrades/README.md b/packages/upgrades/README.md
new file mode 100644
index 000000000..18f4f4fbe
--- /dev/null
+++ b/packages/upgrades/README.md
@@ -0,0 +1,13 @@
+## Upgrades
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/upgrades
+
+This crate provides an interface and component used for upgradeability.
+
+### Interfaces
+
+- `IUpgradeable`
+
+### Components
+
+- `UpgradeableComponent`
diff --git a/packages/upgrades/Scarb.toml b/packages/upgrades/Scarb.toml
index 6acd5002b..5fd3374c5 100644
--- a/packages/upgrades/Scarb.toml
+++ b/packages/upgrades/Scarb.toml
@@ -1,6 +1,13 @@
 
 [package]
 name = "openzeppelin_upgrades"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "upgrades"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +15,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true
diff --git a/packages/utils/README.md b/packages/utils/README.md
new file mode 100644
index 000000000..f904f11cd
--- /dev/null
+++ b/packages/utils/README.md
@@ -0,0 +1,19 @@
+## Upgrades
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/utilities
+
+This crate provides components and libraries containing miscellaneous utilities.
+
+### Core utilities
+
+- `utils`
+- `cryptography`
+- `deployments`
+- `math`
+- `selectors`
+- `serde`
+
+### Cryptography
+
+- `NoncesComponent`
+- `snip12`
diff --git a/packages/utils/Scarb.toml b/packages/utils/Scarb.toml
index 1fe7d7efa..4e151d80c 100644
--- a/packages/utils/Scarb.toml
+++ b/packages/utils/Scarb.toml
@@ -1,6 +1,14 @@
 
 [package]
 name = "openzeppelin_utils"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "contracts",
+    "standards",
+    "utils"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -8,10 +16,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true


Test patch:
diff --git a/docs/modules/ROOT/pages/api/testing.adoc b/docs/modules/ROOT/pages/api/testing.adoc
index 17f09ec99..7863eb901 100644
--- a/docs/modules/ROOT/pages/api/testing.adoc
+++ b/docs/modules/ROOT/pages/api/testing.adoc
@@ -3,8 +3,8 @@
 :stark: https://docs.starknet.io/architecture-and-concepts/cryptography/stark-curve/[Stark]
 :secp256k1: https://github.com/starkware-libs/cairo/blob/main/corelib/src/starknet/secp256k1.cairo[Secp256k1]
 
-This module provides various helper functions for declaring, deploying,
-and testing Smart Contracts using `snforge` toolchain from Starknet Foundry.
+This crate provides various helper functions for declaring, deploying,
+and testing smart contracts using the `snforge` toolchain from Starknet Foundry.
 
 ```cairo
 use openzeppelin_testing;
diff --git a/packages/test_common/README.md b/packages/test_common/README.md
new file mode 100644
index 000000000..703c8ad21
--- /dev/null
+++ b/packages/test_common/README.md
@@ -0,0 +1,3 @@
+## Test Common
+
+This is an internal crate to centralize helpers and common modules used when testing different packages.
diff --git a/packages/test_common/Scarb.toml b/packages/test_common/Scarb.toml
index 4a6706034..0ecde53d1 100644
--- a/packages/test_common/Scarb.toml
+++ b/packages/test_common/Scarb.toml
@@ -1,5 +1,6 @@
 [package]
 name = "openzeppelin_test_common"
+readme = "README.md"
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -7,7 +8,6 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
 keywords.workspace = true
diff --git a/packages/testing/README.md b/packages/testing/README.md
new file mode 100644
index 000000000..109a60131
--- /dev/null
+++ b/packages/testing/README.md
@@ -0,0 +1,13 @@
+## Testing
+
+> **NOTE:** This document is better viewed at https://docs.openzeppelin.com/contracts-cairo/api/testing
+
+This crate provides various helper functions for declaring, deploying,
+and testing smart contracts using the `snforge` toolchain from Starknet Foundry.
+
+### Modules
+
+- `common`
+- `deployment`
+- `events`
+- `signing`
diff --git a/packages/testing/Scarb.toml b/packages/testing/Scarb.toml
index 2acc6c466..01451e4c4 100644
--- a/packages/testing/Scarb.toml
+++ b/packages/testing/Scarb.toml
@@ -1,5 +1,12 @@
 [package]
 name = "openzeppelin_testing"
+readme = "README.md"
+keywords = [
+    "openzeppelin",
+    "starknet",
+    "testing",
+    "utils"
+]
 version.workspace = true
 edition.workspace = true
 cairo-version.workspace = true
@@ -7,10 +14,8 @@ scarb-version.workspace = true
 authors.workspace = true
 description.workspace = true
 documentation.workspace = true
-readme.workspace = true
 repository.workspace = true
 license-file.workspace = true
-keywords.workspace = true
 
 [tool]
 fmt.workspace = true