diff --git a/pkg/vm/emit/emit.go b/pkg/vm/emit/emit.go index 4cae72f65..776af4594 100644 --- a/pkg/vm/emit/emit.go +++ b/pkg/vm/emit/emit.go @@ -100,7 +100,7 @@ func bigInt(w *io.BinWriter, n *big.Int, trySmall bool) { // Array emits an array of elements to the given buffer. It accepts elements of the following types: // - int8, int16, int32, int64, int -// - uint8, uint16, uint32 +// - uint8, uint16, uint32, uint64, uint // - *big.Int // - string, []byte // - util.Uint160, *util.Uint160, util.Uint256, *util.Uint256 @@ -119,6 +119,8 @@ func Array(w *io.BinWriter, es ...any) { Array(w, e...) case int64: Int(w, e) + case uint64: + BigInt(w, new(big.Int).SetUint64(e)) case int32: Int(w, int64(e)) case uint32: @@ -133,6 +135,8 @@ func Array(w *io.BinWriter, es ...any) { Int(w, int64(e)) case int: Int(w, int64(e)) + case uint: + BigInt(w, new(big.Int).SetUint64(uint64(e))) case *big.Int: BigInt(w, e) case string: diff --git a/pkg/vm/emit/emit_test.go b/pkg/vm/emit/emit_test.go index d19c75962..697a79b3b 100644 --- a/pkg/vm/emit/emit_test.go +++ b/pkg/vm/emit/emit_test.go @@ -225,6 +225,8 @@ func TestEmitArray(t *testing.T) { veryBig := new(big.Int).SetUint64(math.MaxUint64) veryBig.Add(veryBig, big.NewInt(1)) Array(buf.BinWriter, + uint64(math.MaxUint64), + uint(math.MaxUint32), // don't use MaxUint to keep test results the same throughout all platforms. stackitem.NewMapWithValue([]stackitem.MapElement{ { Key: stackitem.Make(1), @@ -323,14 +325,27 @@ func TestEmitArray(t *testing.T) { assert.EqualValues(t, opcode.PUSH1, res[192]) assert.EqualValues(t, opcode.PUSH2, res[193]) assert.EqualValues(t, opcode.PACKMAP, res[194]) + // uint (MaxUint32) + assert.EqualValues(t, opcode.PUSHINT64, res[195]) + assert.EqualValues(t, []byte{ + 0xff, 0xff, 0xff, 0xff, + 0, 0, 0, 0, + }, res[196:204]) + // uint64 (MaxUint64) + assert.EqualValues(t, opcode.PUSHINT128, res[204]) + assert.EqualValues(t, []byte{ + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0, 0, 0, 0, + 0, 0, 0, 0}, res[205:221]) // Values packing: - assert.EqualValues(t, opcode.PUSHINT8, res[195]) - assert.EqualValues(t, byte(21), res[196]) - assert.EqualValues(t, opcode.PACK, res[197]) + assert.EqualValues(t, opcode.PUSHINT8, res[221]) + assert.EqualValues(t, byte(23), res[222]) + assert.EqualValues(t, opcode.PACK, res[223]) // Overall script length: - assert.EqualValues(t, 198, len(res)) + assert.EqualValues(t, 224, len(res)) }) t.Run("empty", func(t *testing.T) {