def test_serialize_basic_types_int8(self): self.assertEqual(ABI.serialize('int8', 0x10), b'\0' * 31 + b'\x10') self.assertEqual(ABI.deserialize('int8', b'\0' * 31 + b'\x10'), 0x10) self.assertEqual(ABI.serialize('int8', -0x10), b'\x00' * 31 + b'\xf0') self.assertEqual(ABI.deserialize('int8', b'\x00' * 31 + b'\xf0'), -0x10)
def test_serialize_basic_types_int(self): self.assertEqual(ABI.serialize('int256', 0x10), '\0' * 31 + '\x10') self.assertEqual(ABI.deserialize('int256', '\0' * 31 + '\x10'), 0x10) self.assertEqual(ABI.serialize('int256', -0x10), '\xff' * 31 + '\xf0') self.assertEqual(ABI.deserialize('int256', '\xff' * 31 + '\xf0'), -0x10)
def test_serialize_tuple(self): self.assertEqual(ABI.serialize('(int256)', 0x10), b'\0' * 31 + b'\x10') self.assertEqual(ABI.serialize('(int256,int256)', 0x10, 0x20), b'\0' * 31 + b'\x10' + b'\0' * 31 + b'\x20') self.assertEqual( ABI.serialize('(int256,(int256,int256))', 0x10, (0x20, 0x30)), b'\0' * 31 + b'\x10' + b'\0' * 31 + b'\x20' + b'\0' * 31 + b'\x30')
def test_serialize_basic_types_int16(self): self.assertEqual(ABI.serialize('int16', 0x100), '\0' * 30 + '\x01\x00') self.assertEqual(ABI.deserialize('int16', '\0' * 30 + '\x01\x00'), 0x100) self.assertEqual(ABI.serialize('int16', -0x10), '\x00' * 30 + '\xff\xf0') self.assertEqual(ABI.deserialize('int16', '\x00' * 30 + '\xff\xf0'), -0x10)
def test_serialize_basic_types_uint(self): self.assertEqual(ABI.serialize('uint256', 0x10), b'\0' * 31 + b'\x10') self.assertEqual(ABI.deserialize('uint256', b'\0' * 31 + b'\x10'), 0x10) self.assertEqual(ABI.serialize('uint256', -0x10), b'\xff' * 31 + b'\xf0') self.assertEqual(ABI.deserialize('uint256', b'\xff' * 31 + b'\xf0'), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0) self.assertEqual(ABI.deserialize('uint256', b'\xff' * 31 + b'\xf0'), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0) self.assertNotEqual(ABI.deserialize('uint256', b'\xff' * 31 + b'\xf0'), -0x10)
def test_simple_types_ints_symbolic1(self): cs = ConstraintSet() x = cs.new_bitvec(256, name="x") # Something is terribly wrong x,y = 10,20 my_ser = ABI.serialize('uint', x) self.assertTrue( solver.must_be_true(cs, my_ser[0] == operators.EXTRACT(x, 256 - 8, 8)))
def test_simple_types_ints_symbolic(self): cs = ConstraintSet() x = cs.new_bitvec(256, name="x") y = cs.new_bitvec(256, name="y") # Something is terribly wrong x,y = 10,20 my_ser = ABI.serialize('(uint,uint)', x, y) x_, y_ = ABI.deserialize('(uint,uint)', my_ser) self.assertTrue(solver.must_be_true(cs, x == x_)) self.assertTrue(solver.must_be_true(cs, y == y_))
def test_serialize_bytes_symbolic(self): cs = ConstraintSet() buf = cs.new_array(index_max=17) ret = ABI.serialize('bytes', buf) # does the offset field look right? self.assertTrue(solver.must_be_true(cs, ret[0:32] == bytearray(b'\x00'*31 + b'\x20'))) # does the size field look right? self.assertTrue(solver.must_be_true(cs, ret[32:64] == bytearray(b'\x00'*31 + b'\x11'))) # does the data field look right? self.assertTrue(solver.must_be_true(cs, ret[64:64+32] == buf + bytearray(b'\x00'*15)))
def test_serialize_bytesM_symbolic(self): cs = ConstraintSet() buf = cs.new_array(index_max=17) ret = ABI.serialize('bytes32', buf) self.assertEqual(solver.minmax(cs, ret[0]), (0, 255)) self.assertEqual(solver.minmax(cs, ret[17]), (0, 0))
def test_serialize_fixed_bytes_too_big(self): with self.assertRaises(EthereumError): ABI.serialize('bytes2', b'hii')
def test_serialize_fixed_bytes_less_data(self): ret = ABI.serialize('bytes4', b'aa') self.assertEqual(ret, b'aa'.ljust(32, b'\x00'))
def test_serialize_fixed_bytes32(self): ret = ABI.serialize('bytes32', b'hi') self.assertEqual(ret, b'hi'.ljust(32, b'\x00'))