预设

预设是由库提供的可立即部署的合约。由于预设旨在非常简单且尽可能通用,因此不支持自定义或复杂的合约,例如 ERC20PausableERC721Mintable

对于合约定制和模块组合,您可以使用 Cairo 代码生成工具,我们的代码生成工具。

可用预设

可用预设及其对应的 Sierra 类哈希 列表。与 Cairo 合约类似,预设合约的使用受 MIT 许可证的条款约束。

类哈希是使用 cairo 2.11.4scarb --release profile 计算得出的。
在 3.0.0-alpha.0 版本之前,类哈希是使用 scarb --dev profile 计算得出的。
名称 Sierra 类哈希

AccountUpgradeable

0x02734ee58ebd4eb1c68b2b107eec8be5e766916375eaa9e590d5da3c3d88d637

ERC20Upgradeable

0x065daa9c6005dcbccb0571ffdf530e2e263d1ff00eac2cbd66b2d0fa0871dafa

ERC721Upgradeable

0x06d1cd9d8c2008d36bd627e204c3e5f565d4e632de4e50b36d2388c7ba7a64ce

ERC1155Upgradeable

0x036d453774916578336db8f5f18257f0211011270a5c31adf3a2bd86416943b7

EthAccountUpgradeable

0x0036ef3392391ed137f37c433e729b20b909d554397c9eb6eb6d224968e9d755

UniversalDeployer

0x01b2df6d8861670d4a8ca4670433b2418d78169c2947f46dc614e69f333745c8

VestingWallet

0x010a786d4e5f74d68e0a500aeadbf7a81486f069c06afa242a050a1a09ac42f0

starkli class-hash 命令可用于从 Sierra artifact 计算类哈希。

用法

这些预设合约是可立即部署的,这意味着它们应该已经在 Sepolia 网络上声明。 只需部署预设类哈希并添加适当的构造函数参数。 例如,使用 starkli 部署 ERC20Upgradeable 预设将如下所示:

starkli deploy 0x065daa9c6005dcbccb0571ffdf530e2e263d1ff00eac2cbd66b2d0fa0871dafa \
  <CONSTRUCTOR_ARGS> \
  --network="sepolia"

如果尚未声明类哈希,请复制/粘贴预设合约代码并在本地声明。 首先 设置项目安装 Contracts for Cairo 库。 从 presets directory 复制目标预设合约,并将其粘贴到新项目的 src/lib.cairo 中,如下所示:

// src/lib.cairo

#[starknet::contract]
mod ERC20Upgradeable {
    use openzeppelin_access::ownable::OwnableComponent;
    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
    use openzeppelin_upgrades::UpgradeableComponent;
    use openzeppelin_upgrades::interface::IUpgradeable;
    use starknet::{ContractAddress, ClassHash};

    component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
    component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);

    // Ownable Mixin
    #[abi(embed_v0)]
    impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;
    impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;

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

    // Upgradeable
    impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;

    #[storage]
    struct Storage {
        #[substorage(v0)]
        ownable: OwnableComponent::Storage,
        #[substorage(v0)]
        erc20: ERC20Component::Storage,
        #[substorage(v0)]
        upgradeable: UpgradeableComponent::Storage
    }

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

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

    #[abi(embed_v0)]
    impl UpgradeableImpl of IUpgradeable<ContractState> {
        fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
            self.ownable.assert_only_owner();
            self.upgradeable.upgrade(new_class_hash);
        }
    }
}

接下来,编译合约。

scarb build

最后,声明预设。

starkli declare target/dev/my_project_ERC20Upgradeable.contract_class.json \
  --network="sepolia"