#solidity #abi #parser #evm #ethereum

无 std alloy-sol-type-parser

简单轻量级的 Solidity 类型字符串解析器

25 个版本 (5 个重大变更)

0.8.0 2024 年 8 月 21 日
0.7.7 2024 年 7 月 8 日
0.7.6 2024 年 6 月 10 日
0.7.0 2024 年 3 月 30 日
0.3.1 2023 年 7 月 30 日

#627神奇豆子

Download history 13970/week @ 2024-05-05 15033/week @ 2024-05-12 13651/week @ 2024-05-19 11686/week @ 2024-05-26 12796/week @ 2024-06-02 14665/week @ 2024-06-09 18231/week @ 2024-06-16 17075/week @ 2024-06-23 15466/week @ 2024-06-30 18404/week @ 2024-07-07 20309/week @ 2024-07-14 20933/week @ 2024-07-21 20351/week @ 2024-07-28 28137/week @ 2024-08-04 28013/week @ 2024-08-11 23873/week @ 2024-08-18

101,791 每月下载量
67 个 crate 中使用 (2 个直接使用)

MIT/Apache

65KB
1K SLoC

alloy-sol-type-parser

简单轻量级的 Solidity 类型字符串解析器。

此库主要是 alloy-json-abialloy-dyn-abi 的用户界面 API 的依赖项。请参阅这些 crate 的文档以获取更多信息。

此解析器通常遵循 Solidity 规范,但它只支持类型子集,以便支持 ABI 编码。

使用方法

TypeSpecifier 是此 crate 中的顶级类型。它是字符串(称为 span)的一部分的包装器。它将字符串逐步分解成子 span,并添加有关类型的元数据。例如,它跟踪基本类型以及数组维度的尺寸。一个 TypeSpecifier 应该能够处理任何有效的 Solidity 类型字符串。

use alloy_sol_type_parser::TypeSpecifier;
use core::num::NonZeroUsize;

// Parse a type specifier from a string
let my_type = TypeSpecifier::parse("uint8[2][]").unwrap();

// Read the total span
assert_eq!(
    my_type.span(),
    "uint8[2][]"
);

// A type specifier has a stem type. This is the type string, stripped of its
// array dimensions.
assert_eq!(my_type.stem.span(), "uint8");

// Arrays are represented as a vector of sizes. This allows for deep nesting.
assert_eq!(
    my_type.sizes,
    // `None` is used for dynamic sizes. This is equivalent to `[2][]`
    vec![NonZeroUsize::new(2), None]
);

// Type specifiers also work for complex tuples!
let my_tuple = TypeSpecifier::parse("(uint8,(uint8[],bool))[39]").unwrap();
assert_eq!(
    my_tuple.stem.span(),
    "(uint8,(uint8[],bool))"
);

// Types are NOT resolved, so you can parse custom structs just by name.
let my_struct = TypeSpecifier::parse("MyStruct").unwrap();

为什么不支持 parse()

由于生命周期限制,core::str::FromStr 特性未对 TypeSpecifier 实现。不幸的是,对于依赖于输入字符串生命周期的类型,实现此特性是不可能的。相反,我们建议使用 parse 相关函数,或在需要特性时使用 TryFrom::<&str>::try_from

为什么不使用 syn

这不是一个完整的语法库,也不打算作为 syn-solidity 的替代品。这个包旨在用于解析现有生态系统工具中存在的类型字符串,仅此而已。它不打算用于解析 Solidity 源代码。

此包适用于:

  • 语法检查 JSON ABI 文件
  • alloy-dyn-abi 提供已知良好的输入
  • 将 ethers.js 代码移植到 Rust

它不适用于:

  • 解析 Solidity 源代码
  • 从 Solidity 源代码生成 Rust 代码
  • 从 Rust 代码生成 Solidity 源代码

依赖项

~1MB
~20K SLoC