15 个版本
1.0.1-v1calls | 2024 年 8 月 5 日 |
---|---|
0.2.4 | 2024 年 3 月 26 日 |
0.2.4-v1calls3 | 2024 年 6 月 3 日 |
0.2.4-v1calls | 2024 年 5 月 15 日 |
0.1.0-alpha2 | 2024 年 1 月 24 日 |
498 在 神奇豆
308 每月下载量
180KB
3.5K SLoC
摘要
Pendzl 是 ink! 智能合约开发的库。
为什么使用这个库?
- 使合约 互操作性,进行 安全的跨合约调用(通过每个合约中相同函数的签名)
- 确保使用 波卡标准提案
- 确保使用 最新且最安全 的实现
- 有用的合约,提供在合约中实现的定制逻辑
- 通过不编写样板代码来 节省时间
- 有用的功能,可以简化开发
- 所有合约默认可升级
它提供哪些标准代币和有用的合约?
- PSP22 - 充值代币(相当于 ERC20)和一些扩展,包括 Vault - 修改过的 ERC-4626 合约!
- PSP34 - 非充值代币(相当于 ERC721)和一些扩展
- (尚不支持) PSP37 - 相当于 ERC1155 和一些扩展
- 所有者 限制非所有者对操作的访问
- 访问控制 定义一组角色并按角色限制对操作的访问
- 暂停 暂停/取消暂停合约以禁用/启用某些操作
- (尚不支持) 时间锁控制器 带有延迟执行交易
- (尚不支持) 治理者
- 通用 Vester 允许创建 vest
这个库是基于来自 openbrush-contracts 的实现宏、Storage trait 和 storage_item 宏的想法创建的。
它如何工作?
库允许重用任何ink!智能合约支持的特质的实现。其目标是实现模块化和可扩展性,同时避免不必要的复杂性。
从提供的特质中派生实现很简单。例如,在PSP22的情况下
添加一个PSP22Storage类型的字段,并用#[storage_field]注解它。向存储结构体的derive宏添加StorageFieldGetter,这样就可以通过.data()访问存储项。通过在合约顶部使用#[pendzl::implementation(PSP22)]注解,使合约重用PSP22实现!前两个步骤是通过默认实现来满足所需边界 - 合约的存储必须实现StorageFieldGetter,并使用合适的泛型T(在本例中是PSP22Storage)。
#[pendzl::implementation(PSP22)]
#[ink::contract]
pub mod my_psp22 {
.
.
.
#[ink(storage)]
#[derive(StorageFieldGetter)]
pub struct Contract {
#[storage_field]
psp22: PSP22Data,
}
.
.
.
}
#[pendzl::implementation(PSP22)]宏通过在宏展开后包含以下代码来实现PSP22
impl pendzl::contracts::psp22::PSP22Internal for Contract {
fn _total_supply(&self) -> Balance {
pendzl::contracts::psp22::implementation::PSP22InternalDefaultImpl::_total_supply_default_impl(self)
}
.
.
.
}
impl pendzl::contracts::psp22::PSP22 for Contract {
#[ink(message)]
fn total_supply(&self) -> Balance {
pendzl::contracts::psp22::implementation::PSP22DefaultImpl::total_supply_default_impl(self)
}
.
.
.
}
可以按如下方式覆盖PSP22和/或PSP22Internal中函数的默认_impl
const HATED_ACCOUNT: AccountId = <some_account>
#[overrider(PSP22Internal)]
fn _update(
&mut self,vault::PSP22VaultInternalDefaultImpl,
/// one can use default_impl as in this example or provide completely new implementation.
pendzl::contracts::psp22::implementation::PSP22InternalDefaultImpl::_update_default_impl(self, from, to, amount)
}
#[overrider(PSP22)]
fn approve(
&mut self,
spender: AccountId,
value: Balance,
) -> Result<(), PSP22Error> {
if spender == HATED_ACCOUNT {
return Err(PSP22Error::Custom(String::from("Hated account can not have allowance to spend tokens")));
}
/// one can use default_impl as in this example or provide completly new implementation.
pendzl::contracts::psp22::implementation::PSP22DefaultImpl::approve(self, spender, value)
}
上面的覆盖函数(标记为#[overrider(...)])将被#[pendzl::implementation(PSP22)]消耗。因此,函数的主体将被用于实现相应特质中的相应函数。如上例所示,如果只想在默认实现前后添加一些逻辑,或者可以完全重新实现函数。
类似的逻辑也适用于存储项。可能不想使用默认的PSP22Data,而是使用PSP22CustomData。这可以通过两种方式实现
- 通过为PSP22CustomData实现PSP22Storage特质
- 覆盖PSP22Internal特质中的所有函数
安装与测试
要使用此项目,您需要安装ink!工具链和NodeJS依赖项。
构建
要构建示例,请使用
$ bash build_examples.sh
测试
如果您想运行测试,请进入tests/文件夹并运行
$ pnpm i
$ pnpm build:debug
$ pnpm test
我们正在将所有测试从ink-e2e迁移到TS。一些测试仍然位于示例文件夹中。要运行尚未迁移的测试
$ bash build_examples_and_run_tests.sh
常见问题解答
是否进行了审计?
此存储库中的合约尚未进行审计,可能包含多个漏洞。
许可证
pendzl根据MIT许可证发布。
依赖项
~9–13MB
~229K SLoC