#smart-contracts #blockchain #ink #wasm

无 std pendzl

ink 智能合约开发库 pendzl!

15 个版本

1.0.1-v1calls2024 年 8 月 5 日
0.2.4 2024 年 3 月 26 日
0.2.4-v1calls32024 年 6 月 3 日
0.2.4-v1calls2024 年 5 月 15 日
0.1.0-alpha22024 年 1 月 24 日

498神奇豆

Download history 74/week @ 2024-05-13 16/week @ 2024-05-20 186/week @ 2024-06-03 12/week @ 2024-06-10 59/week @ 2024-07-29 249/week @ 2024-08-05

308 每月下载量

MIT 许可证

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依赖项。

  1. 您需要一个安装程序 rustup
  2. ink!工具链
  3. 您可以通过在tests/文件夹中运行pnpm命令来安装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