Explorar o código

accounts/abi: fix the `output` at the beginning instead of making a workaround

croath %!s(int64=7) %!d(string=hai) anos
pai
achega
a6787a6308
Modificáronse 3 ficheiros con 13 adicións e 51 borrados
  1. 0 10
      accounts/abi/argument.go
  2. 0 36
      accounts/abi/unpack_test.go
  3. 13 5
      mobile/bind.go

+ 0 - 10
accounts/abi/argument.go

@@ -169,16 +169,6 @@ func (arguments Arguments) unpackAtomic(v interface{}, output []byte) error {
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-
-	// if we reach this part, there is only one output member from the contract event.
-	// for mobile, the result type is always a slice.
-	if reflect.Slice == value.Kind() && value.Len() >= 1 {
-		//check if it's not a byte slice
-		if reflect.TypeOf([]byte{}) != value.Type() {
-			value = value.Index(0).Elem()
-		}
-	}
-
 	return set(value, reflect.ValueOf(marshalledValue), arg)
 	return set(value, reflect.ValueOf(marshalledValue), arg)
 }
 }
 
 

+ 0 - 36
accounts/abi/unpack_test.go

@@ -287,42 +287,6 @@ func TestUnpack(t *testing.T) {
 	}
 	}
 }
 }
 
 
-var unpackMobileTests = []unpackTest{
-	{
-		def:  `[{"type": "uint256"}]`,
-		enc:  "0000000000000000000000000000000000000000000000000000000000000001",
-		want: big.NewInt(1),
-	},
-}
-
-func TestUnpackMobileOnly(t *testing.T) {
-	for i, test := range unpackMobileTests {
-		t.Run(strconv.Itoa(i), func(t *testing.T) {
-			def := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
-			abi, err := JSON(strings.NewReader(def))
-			if err != nil {
-				t.Fatalf("invalid ABI definition %s: %v", def, err)
-			}
-			encb, err := hex.DecodeString(test.enc)
-			if err != nil {
-				t.Fatalf("invalid hex: %s" + test.enc)
-			}
-			outptr := reflect.New(reflect.TypeOf(test.want))
-			results := make([]interface{}, 1)
-			copy(results, []interface{}{outptr.Interface()})
-			err = abi.Unpack(&results, "method", encb)
-			if err := test.checkError(err); err != nil {
-				t.Errorf("test %d (%v) failed: %v", i, test.def, err)
-				return
-			}
-			out := outptr.Elem().Interface()
-			if !reflect.DeepEqual(test.want, out) {
-				t.Errorf("test %d (%v) failed: expected %v, got %v", i, test.def, test.want, out)
-			}
-		})
-	}
-}
-
 type methodMultiOutput struct {
 type methodMultiOutput struct {
 	Int    *big.Int
 	Int    *big.Int
 	String string
 	String string

+ 13 - 5
mobile/bind.go

@@ -154,12 +154,20 @@ func (c *BoundContract) GetDeployer() *Transaction {
 // Call invokes the (constant) contract method with params as input values and
 // Call invokes the (constant) contract method with params as input values and
 // sets the output to result.
 // sets the output to result.
 func (c *BoundContract) Call(opts *CallOpts, out *Interfaces, method string, args *Interfaces) error {
 func (c *BoundContract) Call(opts *CallOpts, out *Interfaces, method string, args *Interfaces) error {
-	results := make([]interface{}, len(out.objects))
-	copy(results, out.objects)
-	if err := c.contract.Call(&opts.opts, &results, method, args.objects...); err != nil {
-		return err
+	if len(out.objects) == 1 {
+		result := out.objects[0]
+		if err := c.contract.Call(&opts.opts, result, method, args.objects...); err != nil {
+			return err
+		}
+		out.objects[0] = result
+	} else {
+		results := make([]interface{}, len(out.objects))
+		copy(results, out.objects)
+		if err := c.contract.Call(&opts.opts, &results, method, args.objects...); err != nil {
+			return err
+		}
+		copy(out.objects, results)
 	}
 	}
-	copy(out.objects, results)
 	return nil
 	return nil
 }
 }