@@ -19,13 +19,15 @@ package abi
1919import (
2020 "context"
2121 "encoding/hex"
22+ "encoding/json"
2223 "fmt"
2324 "math/big"
2425 "reflect"
2526 "strings"
2627
2728 "github.com/hyperledger/firefly-common/pkg/i18n"
2829 "github.com/hyperledger/firefly-signer/internal/signermsgs"
30+ "github.com/hyperledger/firefly-signer/pkg/ethtypes"
2931)
3032
3133var (
@@ -128,68 +130,49 @@ func getFloat64IfConvertible(v interface{}) (float64, bool) {
128130// with a focus on those generated by the result of an Unmarshal using Go's default
129131// unmarshalling.
130132func getIntegerFromInterface (ctx context.Context , desc string , v interface {}) (* big.Int , error ) {
131- i := new (big.Int )
132133 switch vt := v .(type ) {
134+ case json.Number :
135+ i , err := ethtypes .BigIntegerFromString (ctx , vt .String ())
136+ if err != nil {
137+ return nil , i18n .WrapError (ctx , err , signermsgs .MsgInvalidIntegerABIInput , vt , v , desc )
138+ }
139+ return i , nil
133140 case string :
134- // We use Go's default '0' base integer parsing, where `0x` means hex,
135- // no prefix means decimal etc.
136- i , ok := i .SetString (vt , 0 )
137- if ! ok {
138- f , _ , err := big .ParseFloat (vt , 10 , 256 , big .ToNearestEven )
139- if err != nil {
140- return nil , i18n .NewError (ctx , signermsgs .MsgInvalidIntegerABIInput , vt , v , desc )
141- }
142- i , accuracy := f .Int (i )
143- if accuracy != big .Exact {
144- // If we weren't able to decode without losing precision, return an error
145- return nil , i18n .NewError (ctx , signermsgs .MsgInvalidIntegerABIInput , vt , v , desc )
146- }
147-
148- return i , nil
141+ i , err := ethtypes .BigIntegerFromString (ctx , vt )
142+ if err != nil {
143+ return nil , i18n .WrapError (ctx , err , signermsgs .MsgInvalidIntegerABIInput , vt , v , desc )
149144 }
150145 return i , nil
151146 case * big.Float :
152- i , _ := vt .Int (i )
147+ i , _ := vt .Int (nil )
153148 return i , nil
154149 case * big.Int :
155150 return vt , nil
156151 case float64 :
157152 // This is how JSON numbers come in (no distinction between integers/floats)
158- i .SetInt64 (int64 (vt ))
159- return i , nil
153+ return new (big.Int ).SetInt64 (int64 (vt )), nil
160154 case float32 :
161- i .SetInt64 (int64 (vt ))
162- return i , nil
155+ return new (big.Int ).SetInt64 (int64 (vt )), nil
163156 case int64 :
164- i .SetInt64 (vt )
165- return i , nil
157+ return new (big.Int ).SetInt64 (vt ), nil
166158 case int32 :
167- i .SetInt64 (int64 (vt ))
168- return i , nil
159+ return new (big.Int ).SetInt64 (int64 (vt )), nil
169160 case int16 :
170- i .SetInt64 (int64 (vt ))
171- return i , nil
161+ return new (big.Int ).SetInt64 (int64 (vt )), nil
172162 case int8 :
173- i .SetInt64 (int64 (vt ))
174- return i , nil
163+ return new (big.Int ).SetInt64 (int64 (vt )), nil
175164 case int :
176- i .SetInt64 (int64 (vt ))
177- return i , nil
165+ return new (big.Int ).SetInt64 (int64 (vt )), nil
178166 case uint64 :
179- i .SetInt64 (int64 (vt ))
180- return i , nil
167+ return new (big.Int ).SetUint64 (vt ), nil
181168 case uint32 :
182- i .SetInt64 (int64 (vt ))
183- return i , nil
169+ return new (big.Int ).SetInt64 (int64 (vt )), nil
184170 case uint16 :
185- i .SetInt64 (int64 (vt ))
186- return i , nil
171+ return new (big.Int ).SetInt64 (int64 (vt )), nil
187172 case uint8 :
188- i .SetInt64 (int64 (vt ))
189- return i , nil
173+ return new (big.Int ).SetInt64 (int64 (vt )), nil
190174 case uint :
191- i .SetInt64 (int64 (vt ))
192- return i , nil
175+ return new (big.Int ).SetUint64 (uint64 (vt )), nil
193176 default :
194177 if str , ok := getStringIfConvertible (v ); ok {
195178 return getIntegerFromInterface (ctx , desc , str )
0 commit comments