difftreelog
fix PR
in: master
10 files changed
crates/evm-coder/procedural/src/abi_derive/derive_enum.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
@@ -47,11 +47,10 @@
)
}
-pub fn impl_enum_abi_type(name: &syn::Ident, option_count: usize) -> proc_macro2::TokenStream {
+pub fn impl_enum_abi_type(name: &syn::Ident) -> proc_macro2::TokenStream {
quote! {
impl ::evm_coder::abi::AbiType for #name {
const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <u8 as ::evm_coder::abi::AbiType>::SIGNATURE;
- const FIELDS_COUNT: usize = #option_count;
fn is_dynamic() -> bool {
<u8 as ::evm_coder::abi::AbiType>::is_dynamic()
crates/evm-coder/procedural/src/abi_derive/derive_struct.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs
@@ -100,12 +100,10 @@
pub fn impl_struct_abi_type(
name: &syn::Ident,
tuple_type: proc_macro2::TokenStream,
- fields_count: usize,
) -> proc_macro2::TokenStream {
quote! {
impl ::evm_coder::abi::AbiType for #name {
const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <#tuple_type as ::evm_coder::abi::AbiType>::SIGNATURE;
- const FIELDS_COUNT: usize = #fields_count;
fn is_dynamic() -> bool {
<#tuple_type as ::evm_coder::abi::AbiType>::is_dynamic()
}
crates/evm-coder/procedural/src/abi_derive/mod.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/abi_derive/mod.rs
+++ b/crates/evm-coder/procedural/src/abi_derive/mod.rs
@@ -49,7 +49,7 @@
let struct_from_tuple = struct_from_tuple(name, is_named_fields, field_names.clone());
let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
- let abi_type = impl_struct_abi_type(name, tuple_type.clone(), params_count);
+ let abi_type = impl_struct_abi_type(name, tuple_type.clone());
let abi_read = impl_struct_abi_read(name, tuple_type, tuple_names, struct_from_tuple);
let abi_write = impl_struct_abi_write(name, is_named_fields, tuple_ref_type, tuple_data);
let solidity_type = impl_struct_solidity_type(name, field_types.clone(), params_count);
@@ -83,7 +83,7 @@
let from = impl_enum_from_u8(name, enum_options.clone());
let solidity_option = impl_solidity_option(name, enum_options.clone());
let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
- let abi_type = impl_enum_abi_type(name, option_count);
+ let abi_type = impl_enum_abi_type(name);
let abi_read = impl_enum_abi_read(name);
let abi_write = impl_enum_abi_write(name);
let solidity_type = impl_enum_solidity_type(name);
crates/evm-coder/src/abi/impls.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -16,7 +16,6 @@
impl AbiType for $ty {
const SIGNATURE: SignatureUnit = make_signature!(new fixed(stringify!($name)));
- const FIELDS_COUNT: usize = 1;
fn is_dynamic() -> bool {
$dynamic
@@ -97,7 +96,6 @@
impl<T: AbiType> AbiType for &T {
const SIGNATURE: SignatureUnit = T::SIGNATURE;
- const FIELDS_COUNT: usize = T::FIELDS_COUNT;
fn is_dynamic() -> bool {
T::is_dynamic()
@@ -127,7 +125,6 @@
impl<T: AbiType> AbiType for Vec<T> {
const SIGNATURE: SignatureUnit = make_signature!(new nameof(T::SIGNATURE) fixed("[]"));
- const FIELDS_COUNT: usize = 1;
fn is_dynamic() -> bool {
true
@@ -203,7 +200,6 @@
shift_left(1)
fixed(")")
);
- const FIELDS_COUNT: usize = count!($($ident)*);
fn is_dynamic() -> bool {
false
crates/evm-coder/src/abi/traits.rsdiffbeforeafterboth--- a/crates/evm-coder/src/abi/traits.rs
+++ b/crates/evm-coder/src/abi/traits.rs
@@ -10,9 +10,6 @@
/// Signature for Etherium ABI.
const SIGNATURE: SignatureUnit;
- /// Count of enum variants or struct fields.
- const FIELDS_COUNT: usize;
-
/// Signature as str.
fn as_str() -> &'static str {
from_utf8(&Self::SIGNATURE.data[..Self::SIGNATURE.len]).expect("bad utf-8")
crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth1mod test_struct {2 use evm_coder_procedural::AbiCoder;3 use evm_coder::types::bytes;45 #[test]6 fn empty_struct() {7 let t = trybuild::TestCases::new();8 t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");9 }1011 #[derive(AbiCoder, PartialEq, Debug)]12 struct TypeStruct1SimpleParam {13 _a: u8,14 }1516 #[derive(AbiCoder, PartialEq, Debug)]17 struct TypeStruct1DynamicParam {18 _a: String,19 }2021 #[derive(AbiCoder, PartialEq, Debug)]22 struct TypeStruct2SimpleParam {23 _a: u8,24 _b: u32,25 }2627 #[derive(AbiCoder, PartialEq, Debug)]28 struct TypeStruct2DynamicParam {29 _a: String,30 _b: bytes,31 }3233 #[derive(AbiCoder, PartialEq, Debug)]34 struct TypeStruct2MixedParam {35 _a: u8,36 _b: bytes,37 }3839 #[derive(AbiCoder, PartialEq, Debug)]40 struct TypeStruct1DerivedSimpleParam {41 _a: TypeStruct1SimpleParam,42 }4344 #[derive(AbiCoder, PartialEq, Debug)]45 struct TypeStruct2DerivedSimpleParam {46 _a: TypeStruct1SimpleParam,47 _b: TypeStruct2SimpleParam,48 }4950 #[derive(AbiCoder, PartialEq, Debug)]51 struct TypeStruct1DerivedDynamicParam {52 _a: TypeStruct1DynamicParam,53 }5455 #[derive(AbiCoder, PartialEq, Debug)]56 struct TypeStruct2DerivedDynamicParam {57 _a: TypeStruct1DynamicParam,58 _b: TypeStruct2DynamicParam,59 }6061 /// Some docs62 /// At multi63 /// line64 #[derive(AbiCoder, PartialEq, Debug)]65 struct TypeStruct3DerivedMixedParam {66 /// Docs for A67 /// multi68 /// line69 _a: TypeStruct1SimpleParam,70 /// Docs for B71 _b: TypeStruct2DynamicParam,72 /// Docs for C73 _c: TypeStruct2MixedParam,74 }7576 #[test]77 #[cfg(feature = "stubgen")]78 fn struct_collect_type_struct3_derived_mixed_param() {79 assert_eq!(80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81 "TypeStruct3DerivedMixedParam"82 );83 similar_asserts::assert_eq!(84 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85 r#"/// @dev Some docs86/// At multi87/// line88struct TypeStruct3DerivedMixedParam {89 /// @dev Docs for A90 /// multi91 /// line92 TypeStruct1SimpleParam _a;93 /// @dev Docs for B94 TypeStruct2DynamicParam _b;95 /// @dev Docs for C96 TypeStruct2MixedParam _c;97}98"#99 );100 }101102 #[test]103 #[cfg(feature = "stubgen")]104 fn struct_collect_vec() {105 assert_eq!(106 <Vec<u8> as ::evm_coder::solidity::StructCollect>::name(),107 "uint8[]"108 );109 }110111 #[test]112 fn impl_abi_type_signature() {113 assert_eq!(114 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE115 .as_str()116 .unwrap(),117 "(uint8)"118 );119 assert_eq!(120 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE121 .as_str()122 .unwrap(),123 "(string)"124 );125 assert_eq!(126 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE127 .as_str()128 .unwrap(),129 "(uint8,uint32)"130 );131 assert_eq!(132 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE133 .as_str()134 .unwrap(),135 "(string,bytes)"136 );137 assert_eq!(138 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE139 .as_str()140 .unwrap(),141 "(uint8,bytes)"142 );143 assert_eq!(144 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE145 .as_str()146 .unwrap(),147 "((uint8))"148 );149 assert_eq!(150 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE151 .as_str()152 .unwrap(),153 "((uint8),(uint8,uint32))"154 );155 assert_eq!(156 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE157 .as_str()158 .unwrap(),159 "((string))"160 );161 assert_eq!(162 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE163 .as_str()164 .unwrap(),165 "((string),(string,bytes))"166 );167 assert_eq!(168 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE169 .as_str()170 .unwrap(),171 "((uint8),(string,bytes),(uint8,bytes))"172 );173 }174175 #[test]176 fn impl_abi_type_fields_count() {177 assert_eq!(178 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,179 1180 );181 assert_eq!(182 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,183 1184 );185 assert_eq!(186 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,187 2188 );189 assert_eq!(190 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,191 2192 );193 assert_eq!(194 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::FIELDS_COUNT,195 2196 );197 assert_eq!(198 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,199 1200 );201 assert_eq!(202 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::FIELDS_COUNT,203 2204 );205 assert_eq!(206 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,207 1208 );209 assert_eq!(210 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::FIELDS_COUNT,211 2212 );213 assert_eq!(214 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::FIELDS_COUNT,215 3216 );217 }218219 #[test]220 fn impl_abi_type_is_dynamic() {221 assert_eq!(222 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),223 false224 );225 assert_eq!(226 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),227 true228 );229 assert_eq!(230 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),231 false232 );233 assert_eq!(234 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),235 true236 );237 assert_eq!(238 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),239 true240 );241 assert_eq!(242 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),243 false244 );245 assert_eq!(246 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),247 false248 );249 assert_eq!(250 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),251 true252 );253 assert_eq!(254 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),255 true256 );257 assert_eq!(258 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),259 true260 );261 }262263 #[test]264 fn impl_abi_type_size() {265 const ABI_ALIGNMENT: usize = 32;266 assert_eq!(267 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),268 ABI_ALIGNMENT269 );270 assert_eq!(271 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),272 ABI_ALIGNMENT273 );274 assert_eq!(275 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),276 ABI_ALIGNMENT * 2277 );278 assert_eq!(279 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),280 ABI_ALIGNMENT * 2281 );282 assert_eq!(283 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),284 ABI_ALIGNMENT * 2285 );286 assert_eq!(287 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),288 ABI_ALIGNMENT289 );290 assert_eq!(291 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),292 ABI_ALIGNMENT * 3293 );294 assert_eq!(295 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),296 ABI_ALIGNMENT297 );298 assert_eq!(299 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),300 ABI_ALIGNMENT * 3301 );302 assert_eq!(303 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),304 ABI_ALIGNMENT * 5305 );306 }307308 #[derive(AbiCoder, PartialEq, Debug)]309 struct TupleStruct1SimpleParam(u8);310311 #[derive(AbiCoder, PartialEq, Debug)]312 struct TupleStruct1DynamicParam(String);313314 #[derive(AbiCoder, PartialEq, Debug)]315 struct TupleStruct2SimpleParam(u8, u32);316317 #[derive(AbiCoder, PartialEq, Debug)]318 struct TupleStruct2DynamicParam(String, bytes);319320 #[derive(AbiCoder, PartialEq, Debug)]321 struct TupleStruct2MixedParam(u8, bytes);322323 #[derive(AbiCoder, PartialEq, Debug)]324 struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);325326 #[derive(AbiCoder, PartialEq, Debug)]327 struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);328329 #[derive(AbiCoder, PartialEq, Debug)]330 struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);331332 #[derive(AbiCoder, PartialEq, Debug)]333 struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);334335 /// Some docs336 /// At multi337 /// line338 #[derive(AbiCoder, PartialEq, Debug)]339 struct TupleStruct3DerivedMixedParam(340 /// Docs for A341 /// multi342 /// line343 TupleStruct1SimpleParam,344 TupleStruct2DynamicParam,345 /// Docs for C346 TupleStruct2MixedParam,347 );348349 #[test]350 #[cfg(feature = "stubgen")]351 fn struct_collect_tuple_struct3_derived_mixed_param() {352 assert_eq!(353 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),354 "TupleStruct3DerivedMixedParam"355 );356 similar_asserts::assert_eq!(357 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),358 r#"/// @dev Some docs359/// At multi360/// line361struct TupleStruct3DerivedMixedParam {362 /// @dev Docs for A363 /// multi364 /// line365 TupleStruct1SimpleParam field0;366 TupleStruct2DynamicParam field1;367 /// @dev Docs for C368 TupleStruct2MixedParam field2;369}370"#371 );372 }373374 #[test]375 fn impl_abi_type_signature_same_for_structs() {376 assert_eq!(377 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE378 .as_str()379 .unwrap(),380 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE381 .as_str()382 .unwrap()383 );384 assert_eq!(385 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE386 .as_str()387 .unwrap(),388 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE389 .as_str()390 .unwrap()391 );392 assert_eq!(393 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE394 .as_str()395 .unwrap(),396 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE397 .as_str()398 .unwrap()399 );400 assert_eq!(401 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE402 .as_str()403 .unwrap(),404 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE405 .as_str()406 .unwrap()407 );408 assert_eq!(409 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE410 .as_str()411 .unwrap(),412 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE413 .as_str()414 .unwrap(),415 );416 assert_eq!(417 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE418 .as_str()419 .unwrap(),420 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE421 .as_str()422 .unwrap(),423 );424 assert_eq!(425 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE426 .as_str()427 .unwrap(),428 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE429 .as_str()430 .unwrap(),431 );432 assert_eq!(433 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE434 .as_str()435 .unwrap(),436 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE437 .as_str()438 .unwrap(),439 );440 assert_eq!(441 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE442 .as_str()443 .unwrap(),444 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE445 .as_str()446 .unwrap(),447 );448 assert_eq!(449 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE450 .as_str()451 .unwrap(),452 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE453 .as_str()454 .unwrap(),455 );456 }457458 #[test]459 fn impl_abi_type_is_dynamic_same_for_structs() {460 assert_eq!(461 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),462 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()463 );464 assert_eq!(465 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),466 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()467 );468 assert_eq!(469 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),470 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()471 );472 assert_eq!(473 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),474 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()475 );476 assert_eq!(477 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),478 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()479 );480 assert_eq!(481 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),482 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()483 );484 assert_eq!(485 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),486 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()487 );488 assert_eq!(489 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),490 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()491 );492 assert_eq!(493 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),494 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()495 );496 assert_eq!(497 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),498 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()499 );500 }501502 #[test]503 fn impl_abi_type_size_same_for_structs() {504 assert_eq!(505 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),506 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()507 );508 assert_eq!(509 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),510 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()511 );512 assert_eq!(513 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),514 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()515 );516 assert_eq!(517 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),518 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()519 );520 assert_eq!(521 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),522 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()523 );524 assert_eq!(525 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),526 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()527 );528 assert_eq!(529 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),530 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()531 );532 assert_eq!(533 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),534 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()535 );536 assert_eq!(537 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),538 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()539 );540 assert_eq!(541 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),542 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()543 );544 }545546 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;547548 fn test_impl<Tuple, TupleStruct, TypeStruct>(549 tuple_data: Tuple,550 tuple_struct_data: TupleStruct,551 type_struct_data: TypeStruct,552 ) where553 TypeStruct: evm_coder::abi::AbiWrite554 + evm_coder::abi::AbiRead555 + std::cmp::PartialEq556 + std::fmt::Debug,557 TupleStruct: evm_coder::abi::AbiWrite558 + evm_coder::abi::AbiRead559 + std::cmp::PartialEq560 + std::fmt::Debug,561 Tuple: evm_coder::abi::AbiWrite562 + evm_coder::abi::AbiRead563 + std::cmp::PartialEq564 + std::fmt::Debug,565 {566 let encoded_type_struct = test_abi_write_impl(&type_struct_data);567 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);568 let encoded_tuple = test_abi_write_impl(&tuple_data);569570 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);571 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);572573 {574 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();575 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();576 assert_eq!(restored_struct_data, type_struct_data);577 }578 {579 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();580 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();581 assert_eq!(restored_struct_data, tuple_struct_data);582 }583584 {585 let (_, mut decoder) =586 evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();587 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();588 assert_eq!(restored_tuple_data, tuple_data);589 }590 {591 let (_, mut decoder) =592 evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();593 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();594 assert_eq!(restored_tuple_data, tuple_data);595 }596 }597598 fn test_abi_write_impl<A>(data: &A) -> Vec<u8>599 where600 A: evm_coder::abi::AbiWrite601 + evm_coder::abi::AbiRead602 + std::cmp::PartialEq603 + std::fmt::Debug,604 {605 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);606 data.abi_write(&mut writer);607 let encoded_tuple = writer.finish();608 encoded_tuple609 }610611 #[test]612 fn codec_struct_1_simple() {613 let _a = 0xff;614 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(615 (_a,),616 TupleStruct1SimpleParam(_a),617 TypeStruct1SimpleParam { _a },618 );619 }620621 #[test]622 fn codec_struct_1_dynamic() {623 let _a: String = "some string".into();624 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(625 (_a.clone(),),626 TupleStruct1DynamicParam(_a.clone()),627 TypeStruct1DynamicParam { _a },628 );629 }630631 #[test]632 fn codec_struct_1_derived_simple() {633 let _a: u8 = 0xff;634 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(635 ((_a,),),636 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),637 TypeStruct1DerivedSimpleParam {638 _a: TypeStruct1SimpleParam { _a },639 },640 );641 }642643 #[test]644 fn codec_struct_1_derived_dynamic() {645 let _a: String = "some string".into();646 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(647 ((_a.clone(),),),648 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),649 TypeStruct1DerivedDynamicParam {650 _a: TypeStruct1DynamicParam { _a },651 },652 );653 }654655 #[test]656 fn codec_struct_2_simple() {657 let _a = 0xff;658 let _b = 0xbeefbaba;659 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(660 (_a, _b),661 TupleStruct2SimpleParam(_a, _b),662 TypeStruct2SimpleParam { _a, _b },663 );664 }665666 #[test]667 fn codec_struct_2_dynamic() {668 let _a: String = "some string".into();669 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);670 test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(671 (_a.clone(), _b.clone()),672 TupleStruct2DynamicParam(_a.clone(), _b.clone()),673 TypeStruct2DynamicParam { _a, _b },674 );675 }676677 #[test]678 fn codec_struct_2_mixed() {679 let _a: u8 = 0xff;680 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);681 test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(682 (_a.clone(), _b.clone()),683 TupleStruct2MixedParam(_a.clone(), _b.clone()),684 TypeStruct2MixedParam { _a, _b },685 );686 }687688 #[test]689 fn codec_struct_2_derived_simple() {690 let _a = 0xff;691 let _b = 0xbeefbaba;692 test_impl::<693 ((u8,), (u8, u32)),694 TupleStruct2DerivedSimpleParam,695 TypeStruct2DerivedSimpleParam,696 >(697 ((_a,), (_a, _b)),698 TupleStruct2DerivedSimpleParam(699 TupleStruct1SimpleParam(_a),700 TupleStruct2SimpleParam(_a, _b),701 ),702 TypeStruct2DerivedSimpleParam {703 _a: TypeStruct1SimpleParam { _a },704 _b: TypeStruct2SimpleParam { _a, _b },705 },706 );707 }708709 #[test]710 fn codec_struct_2_derived_dynamic() {711 let _a = "some string".to_string();712 let _b = bytes(vec![0x11, 0x22, 0x33]);713 test_impl::<714 ((String,), (String, bytes)),715 TupleStruct2DerivedDynamicParam,716 TypeStruct2DerivedDynamicParam,717 >(718 ((_a.clone(),), (_a.clone(), _b.clone())),719 TupleStruct2DerivedDynamicParam(720 TupleStruct1DynamicParam(_a.clone()),721 TupleStruct2DynamicParam(_a.clone(), _b.clone()),722 ),723 TypeStruct2DerivedDynamicParam {724 _a: TypeStruct1DynamicParam { _a: _a.clone() },725 _b: TypeStruct2DynamicParam { _a, _b },726 },727 );728 }729730 #[test]731 fn codec_struct_3_derived_mixed() {732 let int = 0xff;733 let by = bytes(vec![0x11, 0x22, 0x33]);734 let string = "some string".to_string();735 test_impl::<736 ((u8,), (String, bytes), (u8, bytes)),737 TupleStruct3DerivedMixedParam,738 TypeStruct3DerivedMixedParam,739 >(740 ((int,), (string.clone(), by.clone()), (int, by.clone())),741 TupleStruct3DerivedMixedParam(742 TupleStruct1SimpleParam(int),743 TupleStruct2DynamicParam(string.clone(), by.clone()),744 TupleStruct2MixedParam(int, by.clone()),745 ),746 TypeStruct3DerivedMixedParam {747 _a: TypeStruct1SimpleParam { _a: int },748 _b: TypeStruct2DynamicParam {749 _a: string.clone(),750 _b: by.clone(),751 },752 _c: TypeStruct2MixedParam { _a: int, _b: by },753 },754 );755 }756757 #[derive(AbiCoder, PartialEq, Debug)]758 struct TypeStruct2SimpleStruct1Simple {759 _a: TypeStruct2SimpleParam,760 _b: TypeStruct2SimpleParam,761 _c: u8,762 }763 #[derive(AbiCoder, PartialEq, Debug)]764 struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);765766 #[test]767 fn codec_struct_2_struct_simple_1_simple() {768 let _a = 0xff;769 let _b = 0xbeefbaba;770 test_impl::<771 ((u8, u32), (u8, u32), u8),772 TupleStruct2SimpleStruct1Simple,773 TypeStruct2SimpleStruct1Simple,774 >(775 ((_a, _b), (_a, _b), _a),776 TupleStruct2SimpleStruct1Simple(777 TupleStruct2SimpleParam(_a, _b),778 TupleStruct2SimpleParam(_a, _b),779 _a,780 ),781 TypeStruct2SimpleStruct1Simple {782 _a: TypeStruct2SimpleParam { _a, _b },783 _b: TypeStruct2SimpleParam { _a, _b },784 _c: _a,785 },786 );787 }788}789790mod test_enum {791 use evm_coder::AbiCoder;792793 /// Some docs794 /// At multi795 /// line796 #[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]797 #[repr(u8)]798 enum Color {799 /// Docs for Red800 /// multi801 /// line802 Red,803 Green,804 /// Docs for Blue805 #[default]806 Blue,807 }808809 #[test]810 fn empty() {}811812 #[test]813 fn bad_enums() {814 let t = trybuild::TestCases::new();815 t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");816 }817818 #[test]819 fn impl_abi_type_signature_same_for_structs() {820 assert_eq!(821 <Color as evm_coder::abi::AbiType>::SIGNATURE822 .as_str()823 .unwrap(),824 <u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()825 );826 }827828 #[test]829 fn impl_abi_type_is_dynamic_same_for_structs() {830 assert_eq!(831 <Color as evm_coder::abi::AbiType>::is_dynamic(),832 <u8 as evm_coder::abi::AbiType>::is_dynamic()833 );834 }835836 #[test]837 fn impl_abi_type_size_same_for_structs() {838 assert_eq!(839 <Color as evm_coder::abi::AbiType>::size(),840 <u8 as evm_coder::abi::AbiType>::size()841 );842 }843844 #[test]845 fn test_coder() {846 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;847848 let encoded_enum = {849 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);850 <Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);851 writer.finish()852 };853854 let encoded_u8 = {855 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);856 <u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);857 writer.finish()858 };859860 similar_asserts::assert_eq!(encoded_enum, encoded_u8);861862 {863 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();864 let restored_enum_data =865 <Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();866 assert_eq!(restored_enum_data, Color::Green);867 }868 }869870 #[test]871 #[cfg(feature = "stubgen")]872 fn struct_collect_enum() {873 assert_eq!(874 <Color as ::evm_coder::solidity::StructCollect>::name(),875 "Color"876 );877 similar_asserts::assert_eq!(878 <Color as ::evm_coder::solidity::StructCollect>::declaration(),879 r#"/// @dev Some docs880/// At multi881/// line882enum Color {883 /// @dev Docs for Red884 /// multi885 /// line886 Red,887 Green,888 /// @dev Docs for Blue889 Blue890}891"#892 );893 }894}1mod test_struct {2 use evm_coder_procedural::AbiCoder;3 use evm_coder::types::bytes;45 #[test]6 fn empty_struct() {7 let t = trybuild::TestCases::new();8 t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs");9 }1011 #[derive(AbiCoder, PartialEq, Debug)]12 struct TypeStruct1SimpleParam {13 _a: u8,14 }1516 #[derive(AbiCoder, PartialEq, Debug)]17 struct TypeStruct1DynamicParam {18 _a: String,19 }2021 #[derive(AbiCoder, PartialEq, Debug)]22 struct TypeStruct2SimpleParam {23 _a: u8,24 _b: u32,25 }2627 #[derive(AbiCoder, PartialEq, Debug)]28 struct TypeStruct2DynamicParam {29 _a: String,30 _b: bytes,31 }3233 #[derive(AbiCoder, PartialEq, Debug)]34 struct TypeStruct2MixedParam {35 _a: u8,36 _b: bytes,37 }3839 #[derive(AbiCoder, PartialEq, Debug)]40 struct TypeStruct1DerivedSimpleParam {41 _a: TypeStruct1SimpleParam,42 }4344 #[derive(AbiCoder, PartialEq, Debug)]45 struct TypeStruct2DerivedSimpleParam {46 _a: TypeStruct1SimpleParam,47 _b: TypeStruct2SimpleParam,48 }4950 #[derive(AbiCoder, PartialEq, Debug)]51 struct TypeStruct1DerivedDynamicParam {52 _a: TypeStruct1DynamicParam,53 }5455 #[derive(AbiCoder, PartialEq, Debug)]56 struct TypeStruct2DerivedDynamicParam {57 _a: TypeStruct1DynamicParam,58 _b: TypeStruct2DynamicParam,59 }6061 /// Some docs62 /// At multi63 /// line64 #[derive(AbiCoder, PartialEq, Debug)]65 struct TypeStruct3DerivedMixedParam {66 /// Docs for A67 /// multi68 /// line69 _a: TypeStruct1SimpleParam,70 /// Docs for B71 _b: TypeStruct2DynamicParam,72 /// Docs for C73 _c: TypeStruct2MixedParam,74 }7576 #[test]77 #[cfg(feature = "stubgen")]78 fn struct_collect_type_struct3_derived_mixed_param() {79 assert_eq!(80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81 "TypeStruct3DerivedMixedParam"82 );83 similar_asserts::assert_eq!(84 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85 r#"/// @dev Some docs86/// At multi87/// line88struct TypeStruct3DerivedMixedParam {89 /// @dev Docs for A90 /// multi91 /// line92 TypeStruct1SimpleParam _a;93 /// @dev Docs for B94 TypeStruct2DynamicParam _b;95 /// @dev Docs for C96 TypeStruct2MixedParam _c;97}98"#99 );100 }101102 #[test]103 #[cfg(feature = "stubgen")]104 fn struct_collect_vec() {105 assert_eq!(106 <Vec<u8> as ::evm_coder::solidity::StructCollect>::name(),107 "uint8[]"108 );109 }110111 #[test]112 fn impl_abi_type_signature() {113 assert_eq!(114 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE115 .as_str()116 .unwrap(),117 "(uint8)"118 );119 assert_eq!(120 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE121 .as_str()122 .unwrap(),123 "(string)"124 );125 assert_eq!(126 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE127 .as_str()128 .unwrap(),129 "(uint8,uint32)"130 );131 assert_eq!(132 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE133 .as_str()134 .unwrap(),135 "(string,bytes)"136 );137 assert_eq!(138 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE139 .as_str()140 .unwrap(),141 "(uint8,bytes)"142 );143 assert_eq!(144 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE145 .as_str()146 .unwrap(),147 "((uint8))"148 );149 assert_eq!(150 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE151 .as_str()152 .unwrap(),153 "((uint8),(uint8,uint32))"154 );155 assert_eq!(156 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE157 .as_str()158 .unwrap(),159 "((string))"160 );161 assert_eq!(162 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE163 .as_str()164 .unwrap(),165 "((string),(string,bytes))"166 );167 assert_eq!(168 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE169 .as_str()170 .unwrap(),171 "((uint8),(string,bytes),(uint8,bytes))"172 );173 }174175 #[test]176 fn impl_abi_type_is_dynamic() {177 assert_eq!(178 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),179 false180 );181 assert_eq!(182 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),183 true184 );185 assert_eq!(186 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),187 false188 );189 assert_eq!(190 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),191 true192 );193 assert_eq!(194 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),195 true196 );197 assert_eq!(198 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),199 false200 );201 assert_eq!(202 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),203 false204 );205 assert_eq!(206 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),207 true208 );209 assert_eq!(210 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),211 true212 );213 assert_eq!(214 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),215 true216 );217 }218219 #[test]220 fn impl_abi_type_size() {221 const ABI_ALIGNMENT: usize = 32;222 assert_eq!(223 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),224 ABI_ALIGNMENT225 );226 assert_eq!(227 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),228 ABI_ALIGNMENT229 );230 assert_eq!(231 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),232 ABI_ALIGNMENT * 2233 );234 assert_eq!(235 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),236 ABI_ALIGNMENT * 2237 );238 assert_eq!(239 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),240 ABI_ALIGNMENT * 2241 );242 assert_eq!(243 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),244 ABI_ALIGNMENT245 );246 assert_eq!(247 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),248 ABI_ALIGNMENT * 3249 );250 assert_eq!(251 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),252 ABI_ALIGNMENT253 );254 assert_eq!(255 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),256 ABI_ALIGNMENT * 3257 );258 assert_eq!(259 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),260 ABI_ALIGNMENT * 5261 );262 }263264 #[derive(AbiCoder, PartialEq, Debug)]265 struct TupleStruct1SimpleParam(u8);266267 #[derive(AbiCoder, PartialEq, Debug)]268 struct TupleStruct1DynamicParam(String);269270 #[derive(AbiCoder, PartialEq, Debug)]271 struct TupleStruct2SimpleParam(u8, u32);272273 #[derive(AbiCoder, PartialEq, Debug)]274 struct TupleStruct2DynamicParam(String, bytes);275276 #[derive(AbiCoder, PartialEq, Debug)]277 struct TupleStruct2MixedParam(u8, bytes);278279 #[derive(AbiCoder, PartialEq, Debug)]280 struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);281282 #[derive(AbiCoder, PartialEq, Debug)]283 struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);284285 #[derive(AbiCoder, PartialEq, Debug)]286 struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);287288 #[derive(AbiCoder, PartialEq, Debug)]289 struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);290291 /// Some docs292 /// At multi293 /// line294 #[derive(AbiCoder, PartialEq, Debug)]295 struct TupleStruct3DerivedMixedParam(296 /// Docs for A297 /// multi298 /// line299 TupleStruct1SimpleParam,300 TupleStruct2DynamicParam,301 /// Docs for C302 TupleStruct2MixedParam,303 );304305 #[test]306 #[cfg(feature = "stubgen")]307 fn struct_collect_tuple_struct3_derived_mixed_param() {308 assert_eq!(309 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),310 "TupleStruct3DerivedMixedParam"311 );312 similar_asserts::assert_eq!(313 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),314 r#"/// @dev Some docs315/// At multi316/// line317struct TupleStruct3DerivedMixedParam {318 /// @dev Docs for A319 /// multi320 /// line321 TupleStruct1SimpleParam field0;322 TupleStruct2DynamicParam field1;323 /// @dev Docs for C324 TupleStruct2MixedParam field2;325}326"#327 );328 }329330 #[test]331 fn impl_abi_type_signature_same_for_structs() {332 assert_eq!(333 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE334 .as_str()335 .unwrap(),336 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE337 .as_str()338 .unwrap()339 );340 assert_eq!(341 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE342 .as_str()343 .unwrap(),344 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE345 .as_str()346 .unwrap()347 );348 assert_eq!(349 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE350 .as_str()351 .unwrap(),352 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE353 .as_str()354 .unwrap()355 );356 assert_eq!(357 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE358 .as_str()359 .unwrap(),360 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE361 .as_str()362 .unwrap()363 );364 assert_eq!(365 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE366 .as_str()367 .unwrap(),368 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE369 .as_str()370 .unwrap(),371 );372 assert_eq!(373 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE374 .as_str()375 .unwrap(),376 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE377 .as_str()378 .unwrap(),379 );380 assert_eq!(381 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE382 .as_str()383 .unwrap(),384 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE385 .as_str()386 .unwrap(),387 );388 assert_eq!(389 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE390 .as_str()391 .unwrap(),392 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE393 .as_str()394 .unwrap(),395 );396 assert_eq!(397 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE398 .as_str()399 .unwrap(),400 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE401 .as_str()402 .unwrap(),403 );404 assert_eq!(405 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE406 .as_str()407 .unwrap(),408 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE409 .as_str()410 .unwrap(),411 );412 }413414 #[test]415 fn impl_abi_type_is_dynamic_same_for_structs() {416 assert_eq!(417 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),418 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()419 );420 assert_eq!(421 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),422 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()423 );424 assert_eq!(425 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),426 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()427 );428 assert_eq!(429 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),430 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()431 );432 assert_eq!(433 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),434 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()435 );436 assert_eq!(437 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),438 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()439 );440 assert_eq!(441 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),442 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()443 );444 assert_eq!(445 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),446 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()447 );448 assert_eq!(449 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),450 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()451 );452 assert_eq!(453 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),454 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()455 );456 }457458 #[test]459 fn impl_abi_type_size_same_for_structs() {460 assert_eq!(461 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),462 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()463 );464 assert_eq!(465 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),466 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()467 );468 assert_eq!(469 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),470 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()471 );472 assert_eq!(473 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),474 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()475 );476 assert_eq!(477 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),478 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()479 );480 assert_eq!(481 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),482 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()483 );484 assert_eq!(485 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),486 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()487 );488 assert_eq!(489 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),490 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()491 );492 assert_eq!(493 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),494 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()495 );496 assert_eq!(497 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),498 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()499 );500 }501502 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;503504 fn test_impl<Tuple, TupleStruct, TypeStruct>(505 tuple_data: Tuple,506 tuple_struct_data: TupleStruct,507 type_struct_data: TypeStruct,508 ) where509 TypeStruct: evm_coder::abi::AbiWrite510 + evm_coder::abi::AbiRead511 + std::cmp::PartialEq512 + std::fmt::Debug,513 TupleStruct: evm_coder::abi::AbiWrite514 + evm_coder::abi::AbiRead515 + std::cmp::PartialEq516 + std::fmt::Debug,517 Tuple: evm_coder::abi::AbiWrite518 + evm_coder::abi::AbiRead519 + std::cmp::PartialEq520 + std::fmt::Debug,521 {522 let encoded_type_struct = test_abi_write_impl(&type_struct_data);523 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);524 let encoded_tuple = test_abi_write_impl(&tuple_data);525526 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);527 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);528529 {530 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();531 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();532 assert_eq!(restored_struct_data, type_struct_data);533 }534 {535 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();536 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();537 assert_eq!(restored_struct_data, tuple_struct_data);538 }539540 {541 let (_, mut decoder) =542 evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();543 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();544 assert_eq!(restored_tuple_data, tuple_data);545 }546 {547 let (_, mut decoder) =548 evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();549 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();550 assert_eq!(restored_tuple_data, tuple_data);551 }552 }553554 fn test_abi_write_impl<A>(data: &A) -> Vec<u8>555 where556 A: evm_coder::abi::AbiWrite557 + evm_coder::abi::AbiRead558 + std::cmp::PartialEq559 + std::fmt::Debug,560 {561 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);562 data.abi_write(&mut writer);563 let encoded_tuple = writer.finish();564 encoded_tuple565 }566567 #[test]568 fn codec_struct_1_simple() {569 let _a = 0xff;570 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(571 (_a,),572 TupleStruct1SimpleParam(_a),573 TypeStruct1SimpleParam { _a },574 );575 }576577 #[test]578 fn codec_struct_1_dynamic() {579 let _a: String = "some string".into();580 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(581 (_a.clone(),),582 TupleStruct1DynamicParam(_a.clone()),583 TypeStruct1DynamicParam { _a },584 );585 }586587 #[test]588 fn codec_struct_1_derived_simple() {589 let _a: u8 = 0xff;590 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(591 ((_a,),),592 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),593 TypeStruct1DerivedSimpleParam {594 _a: TypeStruct1SimpleParam { _a },595 },596 );597 }598599 #[test]600 fn codec_struct_1_derived_dynamic() {601 let _a: String = "some string".into();602 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(603 ((_a.clone(),),),604 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),605 TypeStruct1DerivedDynamicParam {606 _a: TypeStruct1DynamicParam { _a },607 },608 );609 }610611 #[test]612 fn codec_struct_2_simple() {613 let _a = 0xff;614 let _b = 0xbeefbaba;615 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(616 (_a, _b),617 TupleStruct2SimpleParam(_a, _b),618 TypeStruct2SimpleParam { _a, _b },619 );620 }621622 #[test]623 fn codec_struct_2_dynamic() {624 let _a: String = "some string".into();625 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);626 test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(627 (_a.clone(), _b.clone()),628 TupleStruct2DynamicParam(_a.clone(), _b.clone()),629 TypeStruct2DynamicParam { _a, _b },630 );631 }632633 #[test]634 fn codec_struct_2_mixed() {635 let _a: u8 = 0xff;636 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);637 test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(638 (_a.clone(), _b.clone()),639 TupleStruct2MixedParam(_a.clone(), _b.clone()),640 TypeStruct2MixedParam { _a, _b },641 );642 }643644 #[test]645 fn codec_struct_2_derived_simple() {646 let _a = 0xff;647 let _b = 0xbeefbaba;648 test_impl::<649 ((u8,), (u8, u32)),650 TupleStruct2DerivedSimpleParam,651 TypeStruct2DerivedSimpleParam,652 >(653 ((_a,), (_a, _b)),654 TupleStruct2DerivedSimpleParam(655 TupleStruct1SimpleParam(_a),656 TupleStruct2SimpleParam(_a, _b),657 ),658 TypeStruct2DerivedSimpleParam {659 _a: TypeStruct1SimpleParam { _a },660 _b: TypeStruct2SimpleParam { _a, _b },661 },662 );663 }664665 #[test]666 fn codec_struct_2_derived_dynamic() {667 let _a = "some string".to_string();668 let _b = bytes(vec![0x11, 0x22, 0x33]);669 test_impl::<670 ((String,), (String, bytes)),671 TupleStruct2DerivedDynamicParam,672 TypeStruct2DerivedDynamicParam,673 >(674 ((_a.clone(),), (_a.clone(), _b.clone())),675 TupleStruct2DerivedDynamicParam(676 TupleStruct1DynamicParam(_a.clone()),677 TupleStruct2DynamicParam(_a.clone(), _b.clone()),678 ),679 TypeStruct2DerivedDynamicParam {680 _a: TypeStruct1DynamicParam { _a: _a.clone() },681 _b: TypeStruct2DynamicParam { _a, _b },682 },683 );684 }685686 #[test]687 fn codec_struct_3_derived_mixed() {688 let int = 0xff;689 let by = bytes(vec![0x11, 0x22, 0x33]);690 let string = "some string".to_string();691 test_impl::<692 ((u8,), (String, bytes), (u8, bytes)),693 TupleStruct3DerivedMixedParam,694 TypeStruct3DerivedMixedParam,695 >(696 ((int,), (string.clone(), by.clone()), (int, by.clone())),697 TupleStruct3DerivedMixedParam(698 TupleStruct1SimpleParam(int),699 TupleStruct2DynamicParam(string.clone(), by.clone()),700 TupleStruct2MixedParam(int, by.clone()),701 ),702 TypeStruct3DerivedMixedParam {703 _a: TypeStruct1SimpleParam { _a: int },704 _b: TypeStruct2DynamicParam {705 _a: string.clone(),706 _b: by.clone(),707 },708 _c: TypeStruct2MixedParam { _a: int, _b: by },709 },710 );711 }712713 #[derive(AbiCoder, PartialEq, Debug)]714 struct TypeStruct2SimpleStruct1Simple {715 _a: TypeStruct2SimpleParam,716 _b: TypeStruct2SimpleParam,717 _c: u8,718 }719 #[derive(AbiCoder, PartialEq, Debug)]720 struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);721722 #[test]723 fn codec_struct_2_struct_simple_1_simple() {724 let _a = 0xff;725 let _b = 0xbeefbaba;726 test_impl::<727 ((u8, u32), (u8, u32), u8),728 TupleStruct2SimpleStruct1Simple,729 TypeStruct2SimpleStruct1Simple,730 >(731 ((_a, _b), (_a, _b), _a),732 TupleStruct2SimpleStruct1Simple(733 TupleStruct2SimpleParam(_a, _b),734 TupleStruct2SimpleParam(_a, _b),735 _a,736 ),737 TypeStruct2SimpleStruct1Simple {738 _a: TypeStruct2SimpleParam { _a, _b },739 _b: TypeStruct2SimpleParam { _a, _b },740 _c: _a,741 },742 );743 }744}745746mod test_enum {747 use evm_coder::AbiCoder;748749 /// Some docs750 /// At multi751 /// line752 #[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]753 #[repr(u8)]754 enum Color {755 /// Docs for Red756 /// multi757 /// line758 Red,759 Green,760 /// Docs for Blue761 #[default]762 Blue,763 }764765 #[test]766 fn empty() {}767768 #[test]769 fn bad_enums() {770 let t = trybuild::TestCases::new();771 t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");772 }773774 #[test]775 fn impl_abi_type_signature_same_for_structs() {776 assert_eq!(777 <Color as evm_coder::abi::AbiType>::SIGNATURE778 .as_str()779 .unwrap(),780 <u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()781 );782 }783784 #[test]785 fn impl_abi_type_is_dynamic_same_for_structs() {786 assert_eq!(787 <Color as evm_coder::abi::AbiType>::is_dynamic(),788 <u8 as evm_coder::abi::AbiType>::is_dynamic()789 );790 }791792 #[test]793 fn impl_abi_type_size_same_for_structs() {794 assert_eq!(795 <Color as evm_coder::abi::AbiType>::size(),796 <u8 as evm_coder::abi::AbiType>::size()797 );798 }799800 #[test]801 fn test_coder() {802 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;803804 let encoded_enum = {805 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);806 <Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);807 writer.finish()808 };809810 let encoded_u8 = {811 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);812 <u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);813 writer.finish()814 };815816 similar_asserts::assert_eq!(encoded_enum, encoded_u8);817818 {819 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();820 let restored_enum_data =821 <Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();822 assert_eq!(restored_enum_data, Color::Green);823 }824 }825826 #[test]827 #[cfg(feature = "stubgen")]828 fn struct_collect_enum() {829 assert_eq!(830 <Color as ::evm_coder::solidity::StructCollect>::name(),831 "Color"832 );833 similar_asserts::assert_eq!(834 <Color as ::evm_coder::solidity::StructCollect>::declaration(),835 r#"/// @dev Some docs836/// At multi837/// line838enum Color {839 /// @dev Docs for Red840 /// multi841 /// line842 Red,843 Green,844 /// @dev Docs for Blue845 Blue846}847"#848 );849 }850}pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -347,6 +347,10 @@
) -> Result<void> {
self.consume_store_reads_and_writes(1, 1)?;
+ if !limit.has_value() {
+ return Err(Error::Revert("user can't disable limits".into()));
+ }
+
let caller = T::CrossAccountId::from_eth(caller);
<Pallet<T>>::update_limits(&caller, self, limit.try_into()?).map_err(dispatch_to_evm::<T>)
}
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -264,16 +264,17 @@
value: value.into(),
}
}
+
+ /// Whether the field contains a value.
+ pub fn has_value(&self) -> bool {
+ self.value.status
+ }
}
impl TryInto<up_data_structs::CollectionLimits> for CollectionLimit {
type Error = evm_coder::execution::Error;
fn try_into(self) -> Result<up_data_structs::CollectionLimits, Self::Error> {
- if !self.value.status {
- return Err(Self::Error::Revert("user can't disable limits".into()));
- }
-
let value = self.value.value.try_into().map_err(|error| {
Self::Error::Revert(format!(
"can't convert value to u32 \"{}\" because: \"{error}\"",
@@ -433,17 +434,6 @@
let mut perms = Vec::new();
for TokenPropertyPermission { key, permissions } in permissions {
- if permissions.len() > <TokenPermissionField as evm_coder::abi::AbiType>::FIELDS_COUNT {
- return Err(alloc::format!(
- "Actual number of fields {} for {}, which exceeds the maximum value of {}",
- permissions.len(),
- stringify!(EthTokenPermissions),
- <TokenPermissionField as evm_coder::abi::AbiType>::FIELDS_COUNT
- )
- .as_str()
- .into());
- }
-
let token_permission = PropertyPermission::from_vec(permissions);
perms.push(up_data_structs::PropertyKeyPermission {
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -38,6 +38,7 @@
use pallet_common::{
CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations,
erc::{CommonEvmHandler, PrecompileResult, CollectionCall, static_property::key},
+ eth,
};
use pallet_evm::{account::CrossAccountId, PrecompileHandle};
use pallet_evm_coder_substrate::call;
@@ -93,25 +94,21 @@
fn set_token_property_permissions(
&mut self,
caller: caller,
- permissions: Vec<pallet_common::eth::TokenPropertyPermission>,
+ permissions: Vec<eth::TokenPropertyPermission>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
- let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions(
- permissions,
- )?;
+ let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?;
<Pallet<T>>::set_token_property_permissions(self, &caller, perms)
.map_err(dispatch_to_evm::<T>)
}
/// @notice Get permissions for token properties.
- fn token_property_permissions(
- &self,
- ) -> Result<Vec<pallet_common::eth::TokenPropertyPermission>> {
+ fn token_property_permissions(&self) -> Result<Vec<eth::TokenPropertyPermission>> {
let perms = <Pallet<T>>::token_property_permission(self.id);
Ok(perms
.into_iter()
- .map(pallet_common::eth::TokenPropertyPermission::from)
+ .map(eth::TokenPropertyPermission::from)
.collect())
}
@@ -159,7 +156,7 @@
&mut self,
caller: caller,
token_id: uint256,
- properties: Vec<pallet_common::eth::Property>,
+ properties: Vec<eth::Property>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -170,7 +167,7 @@
let properties = properties
.into_iter()
- .map(pallet_common::eth::Property::try_into)
+ .map(eth::Property::try_into)
.collect::<Result<Vec<_>>>()?;
<Pallet<T>>::set_token_properties(
@@ -753,9 +750,9 @@
/// Returns the owner (in cross format) of the token.
///
/// @param tokenId Id for the token.
- fn cross_owner_of(&self, token_id: uint256) -> Result<pallet_common::eth::CrossAddress> {
+ fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
Self::token_owner(&self, token_id.try_into()?)
- .map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::<T>(&o))
+ .map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
.ok_or(Error::Revert("key too large".into()))
}
@@ -764,11 +761,7 @@
/// @param tokenId Id for the token.
/// @param keys Properties keys. Empty keys for all propertyes.
/// @return Vector of properties key/value pairs.
- fn properties(
- &self,
- token_id: uint256,
- keys: Vec<string>,
- ) -> Result<Vec<pallet_common::eth::Property>> {
+ fn properties(&self, token_id: uint256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
let keys = keys
.into_iter()
.map(|key| {
@@ -784,7 +777,7 @@
if keys.is_empty() { None } else { Some(keys) },
)
.into_iter()
- .map(pallet_common::eth::Property::try_from)
+ .map(eth::Property::try_from)
.collect::<Result<Vec<_>>>()
}
@@ -798,7 +791,7 @@
fn approve_cross(
&mut self,
caller: caller,
- approved: pallet_common::eth::CrossAddress,
+ approved: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -837,7 +830,7 @@
fn transfer_cross(
&mut self,
caller: caller,
- to: pallet_common::eth::CrossAddress,
+ to: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -861,8 +854,8 @@
fn transfer_from_cross(
&mut self,
caller: caller,
- from: pallet_common::eth::CrossAddress,
- to: pallet_common::eth::CrossAddress,
+ from: eth::CrossAddress,
+ to: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -908,7 +901,7 @@
fn burn_from_cross(
&mut self,
caller: caller,
- from: pallet_common::eth::CrossAddress,
+ from: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -1030,8 +1023,8 @@
fn mint_cross(
&mut self,
caller: caller,
- to: pallet_common::eth::CrossAddress,
- properties: Vec<pallet_common::eth::Property>,
+ to: eth::CrossAddress,
+ properties: Vec<eth::Property>,
) -> Result<uint256> {
let token_id = <TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -1041,7 +1034,7 @@
let properties = properties
.into_iter()
- .map(pallet_common::eth::Property::try_into)
+ .map(eth::Property::try_into)
.collect::<Result<Vec<_>>>()?
.try_into()
.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -32,8 +32,9 @@
use frame_support::{BoundedBTreeMap, BoundedVec};
use pallet_common::{
CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations,
+ Error as CommonError,
erc::{CommonEvmHandler, CollectionCall, static_property::key},
- Error as CommonError,
+ eth,
};
use pallet_evm::{account::CrossAccountId, PrecompileHandle};
use pallet_evm_coder_substrate::{call, dispatch_to_evm};
@@ -96,25 +97,21 @@
fn set_token_property_permissions(
&mut self,
caller: caller,
- permissions: Vec<pallet_common::eth::TokenPropertyPermission>,
+ permissions: Vec<eth::TokenPropertyPermission>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
- let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions(
- permissions,
- )?;
+ let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?;
<Pallet<T>>::set_token_property_permissions(self, &caller, perms)
.map_err(dispatch_to_evm::<T>)
}
/// @notice Get permissions for token properties.
- fn token_property_permissions(
- &self,
- ) -> Result<Vec<pallet_common::eth::TokenPropertyPermission>> {
+ fn token_property_permissions(&self) -> Result<Vec<eth::TokenPropertyPermission>> {
let perms = <Pallet<T>>::token_property_permission(self.id);
Ok(perms
.into_iter()
- .map(pallet_common::eth::TokenPropertyPermission::from)
+ .map(eth::TokenPropertyPermission::from)
.collect())
}
@@ -162,7 +159,7 @@
&mut self,
caller: caller,
token_id: uint256,
- properties: Vec<pallet_common::eth::Property>,
+ properties: Vec<eth::Property>,
) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -173,7 +170,7 @@
let properties = properties
.into_iter()
- .map(pallet_common::eth::Property::try_into)
+ .map(eth::Property::try_into)
.collect::<Result<Vec<_>>>()?;
<Pallet<T>>::set_token_properties(
@@ -788,9 +785,9 @@
/// Returns the owner (in cross format) of the token.
///
/// @param tokenId Id for the token.
- fn cross_owner_of(&self, token_id: uint256) -> Result<pallet_common::eth::CrossAddress> {
+ fn cross_owner_of(&self, token_id: uint256) -> Result<eth::CrossAddress> {
Self::token_owner(&self, token_id.try_into()?)
- .map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::<T>(&o))
+ .map(|o| eth::CrossAddress::from_sub_cross_account::<T>(&o))
.ok_or(Error::Revert("key too large".into()))
}
@@ -799,11 +796,7 @@
/// @param tokenId Id for the token.
/// @param keys Properties keys. Empty keys for all propertyes.
/// @return Vector of properties key/value pairs.
- fn properties(
- &self,
- token_id: uint256,
- keys: Vec<string>,
- ) -> Result<Vec<pallet_common::eth::Property>> {
+ fn properties(&self, token_id: uint256, keys: Vec<string>) -> Result<Vec<eth::Property>> {
let keys = keys
.into_iter()
.map(|key| {
@@ -819,7 +812,7 @@
if keys.is_empty() { None } else { Some(keys) },
)
.into_iter()
- .map(pallet_common::eth::Property::try_from)
+ .map(eth::Property::try_from)
.collect::<Result<Vec<_>>>()
}
/// @notice Transfer ownership of an RFT
@@ -855,7 +848,7 @@
fn transfer_cross(
&mut self,
caller: caller,
- to: pallet_common::eth::CrossAddress,
+ to: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -883,8 +876,8 @@
fn transfer_from_cross(
&mut self,
caller: caller,
- from: pallet_common::eth::CrossAddress,
- to: pallet_common::eth::CrossAddress,
+ from: eth::CrossAddress,
+ to: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -939,7 +932,7 @@
fn burn_from_cross(
&mut self,
caller: caller,
- from: pallet_common::eth::CrossAddress,
+ from: eth::CrossAddress,
token_id: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -1076,8 +1069,8 @@
fn mint_cross(
&mut self,
caller: caller,
- to: pallet_common::eth::CrossAddress,
- properties: Vec<pallet_common::eth::Property>,
+ to: eth::CrossAddress,
+ properties: Vec<eth::Property>,
) -> Result<uint256> {
let token_id = <TokensMinted<T>>::get(self.id)
.checked_add(1)
@@ -1087,7 +1080,7 @@
let properties = properties
.into_iter()
- .map(pallet_common::eth::Property::try_into)
+ .map(eth::Property::try_into)
.collect::<Result<Vec<_>>>()?
.try_into()
.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;