فهرست منبع

move to latest ethabi version

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 4 سال پیش
والد
کامیت
0b14fc5f09

+ 2 - 2
Cargo.toml

@@ -51,8 +51,8 @@ indexmap = "1.7"
 [dev-dependencies]
 parity-scale-codec-derive = "2.0.0"
 parity-scale-codec = "2.0.0"
-ethabi = "13.0"
-ethereum-types = "0.10"
+ethabi = "15.0"
+ethereum-types = "0.12"
 wasmi = "0.9"
 rand = "0.7"
 sha2 = "0.9"

+ 21 - 18
src/abi/ethereum.rs

@@ -24,7 +24,8 @@ pub struct ABI {
     pub name: String,
     #[serde(rename = "type")]
     pub ty: String,
-    pub inputs: Vec<ABIParam>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub inputs: Option<Vec<ABIParam>>,
     #[serde(skip_serializing_if = "Option::is_none")]
     pub outputs: Option<Vec<ABIParam>>,
     #[serde(rename = "stateMutability")]
@@ -62,15 +63,9 @@ pub fn gen_abi(contract_no: usize, ns: &Namespace) -> Vec<ABI> {
             Vec::new()
         };
 
-        let ty = if let Type::Struct(_) = param.ty {
-            String::from("tuple")
-        } else {
-            param.ty.to_signature_string(ns)
-        };
-
         ABIParam {
             name: param.name.to_string(),
-            ty,
+            ty: param.ty.to_signature_string(true, ns),
             internal_ty: param.ty.to_string(ns),
             components,
             indexed: param.indexed,
@@ -110,11 +105,17 @@ pub fn gen_abi(contract_no: usize, ns: &Namespace) -> Vec<ABI> {
             name: func.name.to_owned(),
             mutability: format!("{}", func.mutability),
             ty: func.ty.to_string(),
-            inputs: func
-                .params
-                .iter()
-                .map(|p| parameter_to_abi(p, ns))
-                .collect(),
+            inputs: if func.ty == pt::FunctionTy::Function || func.ty == pt::FunctionTy::Constructor
+            {
+                Some(
+                    func.params
+                        .iter()
+                        .map(|p| parameter_to_abi(p, ns))
+                        .collect(),
+                )
+            } else {
+                None
+            },
             outputs: if func.ty == pt::FunctionTy::Function {
                 Some(
                     func.returns
@@ -137,11 +138,13 @@ pub fn gen_abi(contract_no: usize, ns: &Namespace) -> Vec<ABI> {
                     ABI {
                         name: event.name.to_owned(),
                         mutability: String::new(),
-                        inputs: event
-                            .fields
-                            .iter()
-                            .map(|p| parameter_to_abi(p, ns))
-                            .collect(),
+                        inputs: Some(
+                            event
+                                .fields
+                                .iter()
+                                .map(|p| parameter_to_abi(p, ns))
+                                .collect(),
+                        ),
                         outputs: None,
                         ty: "event".to_owned(),
                         anonymous: Some(event.anonymous),

+ 1 - 1
src/sema/mod.rs

@@ -1543,7 +1543,7 @@ impl ast::Namespace {
             name,
             params
                 .iter()
-                .map(|p| p.ty.to_signature_string(self))
+                .map(|p| p.ty.to_signature_string(false, self))
                 .collect::<Vec<String>>()
                 .join(",")
         )

+ 6 - 4
src/sema/types.rs

@@ -661,7 +661,8 @@ impl Type {
         }
     }
 
-    pub fn to_signature_string(&self, ns: &Namespace) -> String {
+    /// The eth abi file wants to hear "tuple" rather than "(ty, ty)"
+    pub fn to_signature_string(&self, say_tuple: bool, ns: &Namespace) -> String {
         match self {
             Type::Bool => "bool".to_string(),
             Type::Contract(_) | Type::Address(_) if ns.address_length == 20 => {
@@ -674,10 +675,10 @@ impl Type {
             Type::Bytes(n) => format!("bytes{}", n),
             Type::DynamicBytes => "bytes".to_string(),
             Type::String => "string".to_string(),
-            Type::Enum(n) => ns.enums[*n].ty.to_signature_string(ns),
+            Type::Enum(n) => ns.enums[*n].ty.to_signature_string(say_tuple, ns),
             Type::Array(ty, len) => format!(
                 "{}{}",
-                ty.to_signature_string(ns),
+                ty.to_signature_string(say_tuple, ns),
                 len.iter()
                     .map(|l| match l {
                         None => "[]".to_string(),
@@ -687,13 +688,14 @@ impl Type {
             ),
             Type::Ref(r) => r.to_string(ns),
             Type::StorageRef(_, r) => r.to_string(ns),
+            Type::Struct(_) if say_tuple => "tuple".to_string(),
             Type::Struct(struct_no) => {
                 format!(
                     "({})",
                     ns.structs[*struct_no]
                         .fields
                         .iter()
-                        .map(|f| f.ty.to_signature_string(ns))
+                        .map(|f| f.ty.to_signature_string(say_tuple, ns))
                         .collect::<Vec<String>>()
                         .join(",")
                 )

+ 1 - 1
tests/substrate_tests/arrays.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use rand::Rng;
 
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};

+ 1 - 1
tests/substrate_tests/builtins.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, first_warning, no_errors, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/calls.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/contracts.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, first_warning, no_errors, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/enums.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/events.rs

@@ -1,6 +1,6 @@
 use crate::{build_solidity, first_error, first_warning, no_errors, parse_and_resolve};
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use solang::file_resolver::FileResolver;
 use solang::Target;
 

+ 0 - 1
tests/substrate_tests/expressions.rs

@@ -1,5 +1,4 @@
 use parity_scale_codec::{Decode, Encode};
-use parity_scale_codec_derive::{Decode, Encode};
 
 use crate::{
     build_solidity, build_solidity_with_overflow_check, first_error, no_errors, parse_and_resolve,

+ 1 - 1
tests/substrate_tests/first.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, no_errors, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/function_types.rs

@@ -1,6 +1,6 @@
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use solang::Target;
 
 #[test]

+ 1 - 1
tests/substrate_tests/functions.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{
     build_solidity, first_error, first_warning, no_warnings, no_warnings_errors, parse_and_resolve,

+ 1 - 1
tests/substrate_tests/inheritance.rs

@@ -1,6 +1,6 @@
 use crate::{build_solidity, first_error, first_warning, no_errors, parse_and_resolve};
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use solang::file_resolver::FileResolver;
 use solang::Target;
 

+ 1 - 1
tests/substrate_tests/libraries.rs

@@ -1,6 +1,6 @@
 use crate::{build_solidity, first_error, parse_and_resolve};
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use solang::Target;
 
 #[test]

+ 1 - 1
tests/substrate_tests/mappings.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use rand::Rng;
 use std::collections::HashMap;
 

+ 1 - 1
tests/substrate_tests/modifier.rs

@@ -1,6 +1,6 @@
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use solang::Target;
 
 #[test]

+ 1 - 1
tests/substrate_tests/primitives.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, first_warning, no_errors, parse_and_resolve};
 use solang::Target;

+ 1 - 1
tests/substrate_tests/strings.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 use rand::Rng;
 
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};

+ 0 - 1
tests/substrate_tests/structs.rs

@@ -1,5 +1,4 @@
 use parity_scale_codec::{Decode, Encode};
-use parity_scale_codec_derive::{Decode, Encode};
 use serde_derive::Deserialize;
 
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};

+ 1 - 1
tests/substrate_tests/value.rs

@@ -1,5 +1,5 @@
 use parity_scale_codec::Encode;
-use parity_scale_codec_derive::{Decode, Encode};
+use parity_scale_codec_derive::Decode;
 
 use crate::{build_solidity, first_error, no_errors, parse_and_resolve};
 use solang::Target;