aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcroath <croathliu@gmail.com>2018-01-23 19:10:23 +0800
committercroath <croathliu@gmail.com>2018-01-23 19:10:23 +0800
commita6787a6308d2109006b036c8a6a331afa938912d (patch)
treedf1c7c3aadb4ed7fc54b32fed2791947be82370f
parent88e67c552e5da4d114d80be3ff471f4f2ed030f5 (diff)
downloaddexon-a6787a6308d2109006b036c8a6a331afa938912d.tar
dexon-a6787a6308d2109006b036c8a6a331afa938912d.tar.gz
dexon-a6787a6308d2109006b036c8a6a331afa938912d.tar.bz2
dexon-a6787a6308d2109006b036c8a6a331afa938912d.tar.lz
dexon-a6787a6308d2109006b036c8a6a331afa938912d.tar.xz
dexon-a6787a6308d2109006b036c8a6a331afa938912d.tar.zst
dexon-a6787a6308d2109006b036c8a6a331afa938912d.zip
accounts/abi: fix the `output` at the beginning instead of making a workaround
-rw-r--r--accounts/abi/argument.go10
-rw-r--r--accounts/abi/unpack_test.go36
-rw-r--r--mobile/bind.go18
3 files changed, 13 insertions, 51 deletions
diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go
index 65f79c9d4..ad17fbf2b 100644
--- a/accounts/abi/argument.go
+++ b/accounts/abi/argument.go
@@ -169,16 +169,6 @@ func (arguments Arguments) unpackAtomic(v interface{}, output []byte) error {
if err != nil {
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)
}
diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go
index a7901896a..391095073 100644
--- a/accounts/abi/unpack_test.go
+++ b/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 {
Int *big.Int
String string
diff --git a/mobile/bind.go b/mobile/bind.go
index 7b79bedaf..e8164d523 100644
--- a/mobile/bind.go
+++ b/mobile/bind.go
@@ -154,12 +154,20 @@ func (c *BoundContract) GetDeployer() *Transaction {
// Call invokes the (constant) contract method with params as input values and
// sets the output to result.
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
}