预设
预设是由库提供的可立即部署的合约。由于预设旨在非常简单且尽可能通用,因此不支持自定义或复杂的合约,例如 ERC20Pausable
或 ERC721Mintable
。
对于合约定制和模块组合,您可以使用 Cairo 代码生成工具,我们的代码生成工具。 |
可用预设
可用预设及其对应的 Sierra 类哈希 列表。与 Cairo 合约类似,预设合约的使用受 MIT 许可证的条款约束。
类哈希是使用 cairo 2.11.4 和 scarb --release profile 计算得出的。
|
在 3.0.0-alpha.0 版本之前,类哈希是使用 scarb --dev profile 计算得出的。
|
名称 | Sierra 类哈希 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
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"