|
|
@@ -365,6 +365,134 @@ func ExampleJSON() {
|
|
|
// 1f2c40920000000000000000000000000000000000000000000000000000000000000001
|
|
|
}
|
|
|
|
|
|
+func TestInputVariableInputLength(t *testing.T) {
|
|
|
+ const definition = `[
|
|
|
+ { "type" : "function", "name" : "strOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] },
|
|
|
+ { "type" : "function", "name" : "bytesOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] },
|
|
|
+ { "type" : "function", "name" : "strTwo", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "str1", "type" : "string" } ] }
|
|
|
+]`
|
|
|
+
|
|
|
+ abi, err := JSON(strings.NewReader(definition))
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // test one string
|
|
|
+ strin := "hello world"
|
|
|
+ strpack, err := abi.Pack("strOne", strin)
|
|
|
+ if err != nil {
|
|
|
+ t.Error(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ offset := make([]byte, 32)
|
|
|
+ offset[31] = 32
|
|
|
+ length := make([]byte, 32)
|
|
|
+ length[31] = byte(len(strin))
|
|
|
+ value := common.RightPadBytes([]byte(strin), 32)
|
|
|
+ exp := append(offset, append(length, value...)...)
|
|
|
+
|
|
|
+ // ignore first 4 bytes of the output. This is the function identifier
|
|
|
+ strpack = strpack[4:]
|
|
|
+ if !bytes.Equal(strpack, exp) {
|
|
|
+ t.Errorf("expected %x, got %x\n", exp, strpack)
|
|
|
+ }
|
|
|
+
|
|
|
+ // test one bytes
|
|
|
+ btspack, err := abi.Pack("bytesOne", []byte(strin))
|
|
|
+ if err != nil {
|
|
|
+ t.Error(err)
|
|
|
+ }
|
|
|
+ // ignore first 4 bytes of the output. This is the function identifier
|
|
|
+ btspack = btspack[4:]
|
|
|
+ if !bytes.Equal(btspack, exp) {
|
|
|
+ t.Errorf("expected %x, got %x\n", exp, btspack)
|
|
|
+ }
|
|
|
+
|
|
|
+ // test two strings
|
|
|
+ str1 := "hello"
|
|
|
+ str2 := "world"
|
|
|
+ str2pack, err := abi.Pack("strTwo", str1, str2)
|
|
|
+ if err != nil {
|
|
|
+ t.Error(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ offset1 := make([]byte, 32)
|
|
|
+ offset1[31] = 64
|
|
|
+ length1 := make([]byte, 32)
|
|
|
+ length1[31] = byte(len(str1))
|
|
|
+ value1 := common.RightPadBytes([]byte(str1), 32)
|
|
|
+
|
|
|
+ offset2 := make([]byte, 32)
|
|
|
+ offset2[31] = 128
|
|
|
+ length2 := make([]byte, 32)
|
|
|
+ length2[31] = byte(len(str2))
|
|
|
+ value2 := common.RightPadBytes([]byte(str2), 32)
|
|
|
+
|
|
|
+ exp2 := append(offset1, offset2...)
|
|
|
+ exp2 = append(exp2, append(length1, value1...)...)
|
|
|
+ exp2 = append(exp2, append(length2, value2...)...)
|
|
|
+
|
|
|
+ // ignore first 4 bytes of the output. This is the function identifier
|
|
|
+ str2pack = str2pack[4:]
|
|
|
+ if !bytes.Equal(str2pack, exp2) {
|
|
|
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
|
|
|
+ }
|
|
|
+
|
|
|
+ // test two strings, first > 32, second < 32
|
|
|
+ str1 = strings.Repeat("a", 33)
|
|
|
+ str2pack, err = abi.Pack("strTwo", str1, str2)
|
|
|
+ if err != nil {
|
|
|
+ t.Error(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ offset1 = make([]byte, 32)
|
|
|
+ offset1[31] = 64
|
|
|
+ length1 = make([]byte, 32)
|
|
|
+ length1[31] = byte(len(str1))
|
|
|
+ value1 = common.RightPadBytes([]byte(str1), 64)
|
|
|
+ offset2[31] = 160
|
|
|
+
|
|
|
+ exp2 = append(offset1, offset2...)
|
|
|
+ exp2 = append(exp2, append(length1, value1...)...)
|
|
|
+ exp2 = append(exp2, append(length2, value2...)...)
|
|
|
+
|
|
|
+ // ignore first 4 bytes of the output. This is the function identifier
|
|
|
+ str2pack = str2pack[4:]
|
|
|
+ if !bytes.Equal(str2pack, exp2) {
|
|
|
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
|
|
|
+ }
|
|
|
+
|
|
|
+ // test two strings, first > 32, second >32
|
|
|
+ str1 = strings.Repeat("a", 33)
|
|
|
+ str2 = strings.Repeat("a", 33)
|
|
|
+ str2pack, err = abi.Pack("strTwo", str1, str2)
|
|
|
+ if err != nil {
|
|
|
+ t.Error(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ offset1 = make([]byte, 32)
|
|
|
+ offset1[31] = 64
|
|
|
+ length1 = make([]byte, 32)
|
|
|
+ length1[31] = byte(len(str1))
|
|
|
+ value1 = common.RightPadBytes([]byte(str1), 64)
|
|
|
+
|
|
|
+ offset2 = make([]byte, 32)
|
|
|
+ offset2[31] = 160
|
|
|
+ length2 = make([]byte, 32)
|
|
|
+ length2[31] = byte(len(str2))
|
|
|
+ value2 = common.RightPadBytes([]byte(str2), 64)
|
|
|
+
|
|
|
+ exp2 = append(offset1, offset2...)
|
|
|
+ exp2 = append(exp2, append(length1, value1...)...)
|
|
|
+ exp2 = append(exp2, append(length2, value2...)...)
|
|
|
+
|
|
|
+ // ignore first 4 bytes of the output. This is the function identifier
|
|
|
+ str2pack = str2pack[4:]
|
|
|
+ if !bytes.Equal(str2pack, exp2) {
|
|
|
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func TestBytes(t *testing.T) {
|
|
|
const definition = `[
|
|
|
{ "type" : "function", "name" : "balance", "const" : true, "inputs" : [ { "name" : "address", "type" : "bytes20" } ] },
|