Cairo 合约

一个用 Cairo 为 Starknet 编写的,用于安全智能合约开发的库。该库由一组 可重用组件组成,用于构建自定义智能合约,以及 随时可部署的 预设。你还可以找到其他 实用程序,包括 接口和分发器测试实用程序, 它们有助于使用 Starknet Foundry 进行测试。

此仓库包含高度实验性的代码。预计会快速迭代。 使用风险自负。
你可以在我们的 Github 项目中跟踪我们的路线图和未来的里程碑。

安装

该库作为一个 Scarb 包提供。按照 本指南 在你的机器上安装 Cairo 和 Scarb 然后再继续,并运行以下命令来检查安装是否成功:

$ scarb --version

scarb 2.9.4 (d3be9ebe1 2025-02-19)
cairo: 2.9.4 (https://crates.io/crates/cairo-lang-compiler/2.9.4)
sierra: 1.6.0

设置你的项目

创建一个空目录,然后 cd 进入它:

mkdir my_project/ && cd my_project/

初始化一个新的 Scarb 项目:

scarb init

my_project/ 的内容现在应该如下所示:

$ ls

Scarb.toml src

安装库

通过在项目的 Scarb.toml 文件中将其声明为依赖项来安装该库:

[dependencies]
openzeppelin = "3.0.0-alpha.0"

前面的示例将导入整个库。我们也可以将每个包添加为单独的依赖项,以 通过不包括不会被使用的模块来改善构建时间:

[dependencies]
openzeppelin_access = "3.0.0-alpha.0"
openzeppelin_token = "3.0.0-alpha.0"

基本用法

这是使用 ERC20 组件 构建 ERC20 合约的样子。 将代码复制到 src/lib.cairo

#[starknet::contract]
mod MyERC20Token {
    // NOTE: 如果你将整个库添加为依赖项,
    // 使用 `openzeppelin::token` 代替。
    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl, DefaultConfig};
    use starknet::ContractAddress;

    component!(path: ERC20Component, storage: erc20, event: ERC20Event);

    // ERC20 Mixin
    #[abi(embed_v0)]
    impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl<ContractState>;
    impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;

    #[storage]
    struct Storage {
        #[substorage(v0)]
        erc20: ERC20Component::Storage
    }

    #[event]
    #[derive(Drop, starknet::Event)]
    enum Event {
        #[flat]
        ERC20Event: ERC20Component::Event
    }

    #[constructor]
    fn constructor(
        ref self: ContractState,
        name: ByteArray,
        symbol: ByteArray,
        fixed_supply: u256,
        recipient: ContractAddress
    ) {
        self.erc20.initializer(name, symbol);
        self.erc20.mint(recipient, fixed_supply);
    }
}

你现在可以编译它:

scarb build