From bc564842a8763e2bc05022045522d383c61fb5ad Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Wed, 14 Sep 2022 12:27:47 -0400 Subject: [PATCH 01/14] test: add basic types and tests for abi and wasm this will lead to implementation of full abi and wasm types, allowing for smart contract deployment. --- eospyo/types.py | 34 ++++ .../test_contract/bin_files/abi_bin_1.txt | 0 .../test_contract/bin_files/wasm_bin_1.txt | 0 .../incorrect_field_simplecontract.abi | 168 ++++++++++++++++++ .../test_contract/invalid_simplecontract.abi | 168 ++++++++++++++++++ .../test_contract/invalid_simplecontract.wasm | Bin 0 -> 10883 bytes .../odd_number_simplecontract.wasm | Bin 0 -> 10883 bytes tests/unit/test_contract/simplecontract.abi | 168 ++++++++++++++++++ tests/unit/test_contract/simplecontract.wasm | Bin 0 -> 10883 bytes tests/unit/transaction_test.py | 85 +++++++++ tests/unit/types_test.py | 42 ++++- 11 files changed, 662 insertions(+), 3 deletions(-) create mode 100644 tests/unit/test_contract/bin_files/abi_bin_1.txt create mode 100644 tests/unit/test_contract/bin_files/wasm_bin_1.txt create mode 100644 tests/unit/test_contract/incorrect_field_simplecontract.abi create mode 100644 tests/unit/test_contract/invalid_simplecontract.abi create mode 100755 tests/unit/test_contract/invalid_simplecontract.wasm create mode 100755 tests/unit/test_contract/odd_number_simplecontract.wasm create mode 100644 tests/unit/test_contract/simplecontract.abi create mode 100755 tests/unit/test_contract/simplecontract.wasm diff --git a/eospyo/types.py b/eospyo/types.py index a1a33c1..0f43716 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -1,7 +1,9 @@ """Eosio data types.""" +import binascii import calendar import datetime as dt +import json import re import struct import sys @@ -348,6 +350,28 @@ def from_bytes(cls, bytes_): return cls(value=value) +class Abi(EosioType): + filepath: str + + def __bytes__(self): + return self.filepath + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class Wasm(EosioType): + filepath: str + + def __bytes__(self): + return self.filepath + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + class Bytes(EosioType): value: bytes @@ -602,3 +626,13 @@ def from_string(type_: str) -> EosioType: msg = f"Type {type_} not found. List of available {types=}" raise ValueError(msg) return class_ + + +def hex_to_uint8_array(hex_string: str) -> Array: + return hex_string + +def bin_to_hex(bin: str) -> str: + return str(binascii.hexlify(bin).decode("utf-8")) + +def serialize_abi_json(abi_json: json) -> str: + return abi_json diff --git a/tests/unit/test_contract/bin_files/abi_bin_1.txt b/tests/unit/test_contract/bin_files/abi_bin_1.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/test_contract/bin_files/wasm_bin_1.txt b/tests/unit/test_contract/bin_files/wasm_bin_1.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/test_contract/incorrect_field_simplecontract.abi b/tests/unit/test_contract/incorrect_field_simplecontract.abi new file mode 100644 index 0000000..d85484f --- /dev/null +++ b/tests/unit/test_contract/incorrect_field_simplecontract.abi @@ -0,0 +1,168 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "clear", + "base": "", + "fields": [] + }, + { + "name": "messages", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + }, + { + "name": "text", + "type": "string" + } + ] + }, + { + "name": "sendmsg", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "message", + "type": "string" + } + ] + }, + { + "name": "testname", + "base": "", + "fields": [ + { + "name": "var", + "type": "name" + } + ] + }, + { + "name": "teststring", + "base": "", + "fields": [ + { + "name": "var", + "type": "string" + } + ] + }, + { + "name": "tinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "int8" + } + ] + }, + { + "name": "tuinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint8" + } + ] + }, + { + "name": "tuintsixfour", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint64" + } + ] + }, + { + "name": "tuintsixteen", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint16" + } + ] + }, + { + "name": "tuintthirtwo", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint32" + } + ] + } + ], + "actions": [ + { + "name": "clear", + "type": "clear", + "ricardian_contract": "" + }, + { + "name": "sendmsg", + "type": "sendmsg", + "ricardian_contract": "" + }, + { + "name": "testname", + "type": "testname", + "ricardian_contract": "" + }, + { + "name": "teststring", + "type": "teststring", + "ricardian_contract": "" + }, + { + "name": "tinteight", + "type": "tinteight", + "ricardian_contract": "" + }, + { + "name": "tuinteight", + "type": "tuinteight", + "ricardian_contract": "" + }, + { + "name": "tuintsixfour", + "type": "tuintsixfour", + "ricardian_contract": "" + }, + { + "name": "tuintsixteen", + "type": "tuintsixteen", + "ricardian_contract": "" + }, + { + "name": "tuintthirtwo", + "type": "tuintthirtwo", + "ricardian_contract": "" + } + ], + "tables": [ + { + "name": "messages", + "type": "messages", + "index_type": "i64", + "key_names": [], + "key_types": [] + } + ], + "ricardian_clauses": [], + "variants": [] +} \ No newline at end of file diff --git a/tests/unit/test_contract/invalid_simplecontract.abi b/tests/unit/test_contract/invalid_simplecontract.abi new file mode 100644 index 0000000..d85484f --- /dev/null +++ b/tests/unit/test_contract/invalid_simplecontract.abi @@ -0,0 +1,168 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "clear", + "base": "", + "fields": [] + }, + { + "name": "messages", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + }, + { + "name": "text", + "type": "string" + } + ] + }, + { + "name": "sendmsg", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "message", + "type": "string" + } + ] + }, + { + "name": "testname", + "base": "", + "fields": [ + { + "name": "var", + "type": "name" + } + ] + }, + { + "name": "teststring", + "base": "", + "fields": [ + { + "name": "var", + "type": "string" + } + ] + }, + { + "name": "tinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "int8" + } + ] + }, + { + "name": "tuinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint8" + } + ] + }, + { + "name": "tuintsixfour", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint64" + } + ] + }, + { + "name": "tuintsixteen", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint16" + } + ] + }, + { + "name": "tuintthirtwo", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint32" + } + ] + } + ], + "actions": [ + { + "name": "clear", + "type": "clear", + "ricardian_contract": "" + }, + { + "name": "sendmsg", + "type": "sendmsg", + "ricardian_contract": "" + }, + { + "name": "testname", + "type": "testname", + "ricardian_contract": "" + }, + { + "name": "teststring", + "type": "teststring", + "ricardian_contract": "" + }, + { + "name": "tinteight", + "type": "tinteight", + "ricardian_contract": "" + }, + { + "name": "tuinteight", + "type": "tuinteight", + "ricardian_contract": "" + }, + { + "name": "tuintsixfour", + "type": "tuintsixfour", + "ricardian_contract": "" + }, + { + "name": "tuintsixteen", + "type": "tuintsixteen", + "ricardian_contract": "" + }, + { + "name": "tuintthirtwo", + "type": "tuintthirtwo", + "ricardian_contract": "" + } + ], + "tables": [ + { + "name": "messages", + "type": "messages", + "index_type": "i64", + "key_names": [], + "key_types": [] + } + ], + "ricardian_clauses": [], + "variants": [] +} \ No newline at end of file diff --git a/tests/unit/test_contract/invalid_simplecontract.wasm b/tests/unit/test_contract/invalid_simplecontract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..36df4e812664ed4984d8404df7a215db0b525ed5 GIT binary patch literal 10883 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 literal 0 HcmV?d00001 diff --git a/tests/unit/test_contract/odd_number_simplecontract.wasm b/tests/unit/test_contract/odd_number_simplecontract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..36df4e812664ed4984d8404df7a215db0b525ed5 GIT binary patch literal 10883 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 literal 0 HcmV?d00001 diff --git a/tests/unit/test_contract/simplecontract.abi b/tests/unit/test_contract/simplecontract.abi new file mode 100644 index 0000000..d85484f --- /dev/null +++ b/tests/unit/test_contract/simplecontract.abi @@ -0,0 +1,168 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "clear", + "base": "", + "fields": [] + }, + { + "name": "messages", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + }, + { + "name": "text", + "type": "string" + } + ] + }, + { + "name": "sendmsg", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "message", + "type": "string" + } + ] + }, + { + "name": "testname", + "base": "", + "fields": [ + { + "name": "var", + "type": "name" + } + ] + }, + { + "name": "teststring", + "base": "", + "fields": [ + { + "name": "var", + "type": "string" + } + ] + }, + { + "name": "tinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "int8" + } + ] + }, + { + "name": "tuinteight", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint8" + } + ] + }, + { + "name": "tuintsixfour", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint64" + } + ] + }, + { + "name": "tuintsixteen", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint16" + } + ] + }, + { + "name": "tuintthirtwo", + "base": "", + "fields": [ + { + "name": "var", + "type": "uint32" + } + ] + } + ], + "actions": [ + { + "name": "clear", + "type": "clear", + "ricardian_contract": "" + }, + { + "name": "sendmsg", + "type": "sendmsg", + "ricardian_contract": "" + }, + { + "name": "testname", + "type": "testname", + "ricardian_contract": "" + }, + { + "name": "teststring", + "type": "teststring", + "ricardian_contract": "" + }, + { + "name": "tinteight", + "type": "tinteight", + "ricardian_contract": "" + }, + { + "name": "tuinteight", + "type": "tuinteight", + "ricardian_contract": "" + }, + { + "name": "tuintsixfour", + "type": "tuintsixfour", + "ricardian_contract": "" + }, + { + "name": "tuintsixteen", + "type": "tuintsixteen", + "ricardian_contract": "" + }, + { + "name": "tuintthirtwo", + "type": "tuintthirtwo", + "ricardian_contract": "" + } + ], + "tables": [ + { + "name": "messages", + "type": "messages", + "index_type": "i64", + "key_names": [], + "key_types": [] + } + ], + "ricardian_clauses": [], + "variants": [] +} \ No newline at end of file diff --git a/tests/unit/test_contract/simplecontract.wasm b/tests/unit/test_contract/simplecontract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..36df4e812664ed4984d8404df7a215db0b525ed5 GIT binary patch literal 10883 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 literal 0 HcmV?d00001 diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index 271cc6f..ea1eede 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -1,10 +1,12 @@ import datetime as dt import json +from pathlib import Path import pydantic import pytest import eospyo +from eospyo.types import serialize_abi_json def test_create_authorization_using_dict(): @@ -121,6 +123,89 @@ def test_backend_transfer_transaction_serialization(net): assert backend_data_bytes == server_data_bytes +def test_backend_set_wasm_code_transaction_serialization(net): + net = eospyo.WaxTestnet() + + data = [ + eospyo.Data(name="account", value=eospyo.types.Name("user2")), + eospyo.Data(name="vmtype", value=eospyo.types.Uint8(0)), + eospyo.Data(name="vmversion", value=eospyo.types.Uint8(0)), + eospyo.Data( + name="code", + filepath="/tests/unit/test_contract/simplecontract.wasm", + ), + ] + backend_data_bytes = b"" + for d in data: + backend_data_bytes += bytes(d) + + filename = ( + Path().resolve() / "/tests/unit/test_contract/simplecontract.wasm" + ) + with open(filename, "rb") as f: + content = f.read() + + wasm_hexcode = eospyo.types.bin_to_hex(content) + + server_resp = net.abi_json_to_bin( + account_name="eosio", + action="setcode", + json={ + "account": "user2", + "vmtype": 0, + "vmversion": 0, + "code": wasm_hexcode, + }, + ) + + server_data_bytes = server_resp + + assert backend_data_bytes == server_data_bytes + + +def test_backend_set_abi_transaction_serialization(net): + net = eospyo.WaxTestnet() + + data = [ + eospyo.Data(name="account", value=eospyo.types.Name("user2")), + eospyo.Data(name="vmtype", value=eospyo.types.Uint8(0)), + eospyo.Data(name="vmversion", value=eospyo.types.Uint8(0)), + eospyo.Data( + name="abi", filepath="/tests/unit/test_contract/simplecontract.abi" + ), + ] + backend_data_bytes = b"" + for d in data: + backend_data_bytes += bytes(d) + + filename = ( + Path().resolve() / "/tests/unit/test_contract/simplecontract.abi" + ) + with open(filename, "rb") as f: + content = f.read() + + abi_json = json.load(content) + + serialized_abi_json = serialize_abi_json(abi_json) + + abi_hexcode = eospyo.types.bin_to_hex(serialized_abi_json) + + server_resp = net.abi_json_to_bin( + account_name="eosio", + action="setabi", + json={ + "account": "user2", + "vmtype": 0, + "vmversion": 0, + "abi": abi_hexcode, + }, + ) + + server_data_bytes = server_resp + + assert backend_data_bytes == server_data_bytes + + def test_data_bytes_hex_return_expected_value(): data = [ eospyo.Data(name="from", value=eospyo.types.Name("youraccount1")), diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index 789e6c6..b6c0eed 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -1,10 +1,12 @@ """type tests.""" import datetime as dt +from pathlib import Path -import eospyo import pydantic import pytest + +import eospyo from eospyo import types values = [ @@ -93,11 +95,31 @@ "99 WAX", b"c\x00\x00\x00\x00\x00\x00\x00\x00WAX\x00\x00\x00\x00", ), + ( + types.Abi, + "tests/unit/test_contract/simplecontract.abi", + "tests/unit/test_contract/bin_files/abi_bin_1.txt", + ), + ( + types.Wasm, + "tests/unit/test_contract/simplecontract.wasm", + "tests/unit/test_contract/bin_files/wasm_bin_1.txt", + ), ] @pytest.mark.parametrize("class_,input_,expected_output", values) def test_type_bytes(class_, input_, expected_output): + uses_file = { + types.Abi, + types.Wasm, + } + if class_ in uses_file: + filename = Path().resolve() / expected_output + with open(filename, "rb") as f: + content = f.read() + expected_output = content + instance = class_(input_) output = bytes(instance) assert output == expected_output @@ -105,6 +127,16 @@ def test_type_bytes(class_, input_, expected_output): @pytest.mark.parametrize("class_,input_,expected_output", values) def test_bytes_to_type(class_, input_, expected_output): + uses_file = { + types.Abi, + types.Wasm, + } + if class_ in uses_file: + filename = Path().resolve() / expected_output + with open(filename, "rb") as f: + content = f.read() + expected_output = content + instance = class_(input_) bytes_ = bytes(instance) print(f"{instance=}; {bytes_=}") @@ -132,8 +164,8 @@ def test_size(class_, input_, expected_output): ( "string", "teststring", - "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]"+ - "^_`abcdefghijklmnopqrstuvwxyz{|}~ ", + "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]" + + "^_`abcdefghijklmnopqrstuvwxyz{|}~ ", ), ("string", "teststring", ""), ("int8", "tinteight", -128), @@ -233,6 +265,10 @@ def test_abi_vs_eospyo_serialization(net, type_, action, value): (types.Asset, "99"), (types.Asset, "99. WAXXXXXX"), (types.Asset, "99."), + (types.Abi, "tests/unit/test_contract/invalid_simplecontract.abi"), + (types.Abi, "tests/unit/test_contract/incorrect_field_simplecontract.abi"), + (types.Wasm, "tests/unit/test_contract/invalid_simplecontract.wasm"), + (types.Wasm, "tests/unit/test_contract/odd_number_simplecontract.wasm"), ] From b76b8c37613f62a93a905559c2f2b3a06c871f88 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 15 Sep 2022 18:01:25 -0400 Subject: [PATCH 02/14] tests: fix general abi and wasm tests and types - fix pathing issues for tests - add new simple testing contract files - add bin_to_hex, save_bytes_to_file, and hex_to_uint8_array functions - alter abi and wasm types to work with new functions - delete unnecassary contract files --- eospyo/types.py | 82 ++++++--- .../bin_files/wasm_pass_bytes.bin | Bin 0 -> 34349 bytes .../extra_fields_test_contract.abi | 29 +++ .../incorrect_field_simplecontract.abi | 168 ------------------ .../test_contract/invalid_simplecontract.abi | 168 ------------------ .../test_contract/invalid_simplecontract.wasm | Bin 10883 -> 0 bytes .../test_contract/invalid_test_contract.abi | 29 +++ .../test_contract/invalid_test_contract.wasm | Bin 0 -> 34346 bytes .../odd_number_simplecontract.wasm | Bin 10883 -> 0 bytes .../unit/test_contract/odd_test_contract.wasm | Bin 0 -> 39657 bytes tests/unit/test_contract/simplecontract.abi | 168 ------------------ tests/unit/test_contract/simplecontract.wasm | Bin 10883 -> 0 bytes tests/unit/test_contract/test_contract.abi | 29 +++ tests/unit/test_contract/test_contract.cpp | 8 + tests/unit/test_contract/test_contract.wasm | Bin 0 -> 34346 bytes tests/unit/transaction_test.py | 11 +- tests/unit/types_test.py | 24 +-- 17 files changed, 171 insertions(+), 545 deletions(-) create mode 100644 tests/unit/test_contract/bin_files/wasm_pass_bytes.bin create mode 100644 tests/unit/test_contract/extra_fields_test_contract.abi delete mode 100644 tests/unit/test_contract/incorrect_field_simplecontract.abi delete mode 100644 tests/unit/test_contract/invalid_simplecontract.abi delete mode 100755 tests/unit/test_contract/invalid_simplecontract.wasm create mode 100644 tests/unit/test_contract/invalid_test_contract.abi create mode 100644 tests/unit/test_contract/invalid_test_contract.wasm delete mode 100755 tests/unit/test_contract/odd_number_simplecontract.wasm create mode 100644 tests/unit/test_contract/odd_test_contract.wasm delete mode 100644 tests/unit/test_contract/simplecontract.abi delete mode 100755 tests/unit/test_contract/simplecontract.wasm create mode 100644 tests/unit/test_contract/test_contract.abi create mode 100644 tests/unit/test_contract/test_contract.cpp create mode 100755 tests/unit/test_contract/test_contract.wasm diff --git a/eospyo/types.py b/eospyo/types.py index 0f43716..8236dcb 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -8,6 +8,7 @@ import struct import sys from abc import ABC, abstractmethod +from pathlib import Path import pydantic @@ -350,28 +351,6 @@ def from_bytes(cls, bytes_): return cls(value=value) -class Abi(EosioType): - filepath: str - - def __bytes__(self): - return self.filepath - - @classmethod - def from_bytes(cls, bytes_): - return cls(value=bytes_) - - -class Wasm(EosioType): - filepath: str - - def __bytes__(self): - return self.filepath - - @classmethod - def from_bytes(cls, bytes_): - return cls(value=bytes_) - - class Bytes(EosioType): value: bytes @@ -628,11 +607,66 @@ def from_string(type_: str) -> EosioType: return class_ +class Abi(EosioType): + value: str + + def __bytes__(self): + return self.value + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class Wasm(EosioType): + value: str + + def __bytes__(self): + filename = str(Path().resolve()) + "/" + self.value + with open(filename, "rb") as f: + content = f.read() + hexcode = bin_to_hex(content) + uint8_array = hex_to_uint8_array(hexcode) + return bytes(uint8_array) + + @classmethod + def from_bytes(cls, bytes_): + return bytes_ + + def hex_to_uint8_array(hex_string: str) -> Array: - return hex_string -def bin_to_hex(bin: str) -> str: + if len(hex_string) % 2: + msg = f"Odd number of hex digits in input file." + raise ValueError(msg) + + bin_len = int(len(hex_string) / 2) + uint8_values = [] + + for i in range(0, bin_len): + try: + x = int(hex_string[(i * 2) : (i * 2 + 2)], base=16) + except: + msg = f"Issue converting hex to uint 8 array, Invalid hex string." + raise ValueError(msg) + uint8_values.append(x) + + uint8_array = Array(type_=Uint8, values=uint8_values) + return uint8_array + + +def bin_to_hex(bin: bytes) -> str: + # if type(bin) != 'bytes': + # msg = f"Expected string containing hex digits." + # raise ValueError(msg) return str(binascii.hexlify(bin).decode("utf-8")) + def serialize_abi_json(abi_json: json) -> str: return abi_json + + +def save_bytes_to_file(filepath: str, output_file: str): + bytes_to_save = bytes(Wasm(filepath)) + with open(output_file, "wb") as f: + f.write(bytes_to_save) diff --git a/tests/unit/test_contract/bin_files/wasm_pass_bytes.bin b/tests/unit/test_contract/bin_files/wasm_pass_bytes.bin new file mode 100644 index 0000000000000000000000000000000000000000..3a70c2f48065d6e1b72ae887741d0acbd6474918 GIT binary patch literal 34349 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 diff --git a/tests/unit/test_contract/invalid_test_contract.abi b/tests/unit/test_contract/invalid_test_contract.abi new file mode 100644 index 0000000..ef4f53c --- /dev/null +++ b/tests/unit/test_contract/invalid_test_contract.abi @@ -0,0 +1,29 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.2", + "types": [], + "structs": [ + { + "name": "hi", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + } + ] + } + ], + "actions": [ + { + "name": "hi", + "type": "hi", + "ricardian_contract": "" + } + ], + "tables": [], + "kv_tables": {}, + "ricardian_clauses": [], + "variants": [], + "action_results": [] +} \ No newline at end of file diff --git a/tests/unit/test_contract/invalid_test_contract.wasm b/tests/unit/test_contract/invalid_test_contract.wasm new file mode 100644 index 0000000000000000000000000000000000000000..36452bcbad674f215584c2b281d20e2577fea042 GIT binary patch literal 34346 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 diff --git a/tests/unit/test_contract/odd_test_contract.wasm b/tests/unit/test_contract/odd_test_contract.wasm new file mode 100644 index 0000000000000000000000000000000000000000..869cd1f1fdfcfd87a65740d76661fdae0cbeb8c2 GIT binary patch literal 39657 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 literal 0 HcmV?d00001 diff --git a/tests/unit/test_contract/simplecontract.abi b/tests/unit/test_contract/simplecontract.abi deleted file mode 100644 index d85484f..0000000 --- a/tests/unit/test_contract/simplecontract.abi +++ /dev/null @@ -1,168 +0,0 @@ -{ - "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", - "version": "eosio::abi/1.1", - "types": [], - "structs": [ - { - "name": "clear", - "base": "", - "fields": [] - }, - { - "name": "messages", - "base": "", - "fields": [ - { - "name": "user", - "type": "name" - }, - { - "name": "text", - "type": "string" - } - ] - }, - { - "name": "sendmsg", - "base": "", - "fields": [ - { - "name": "from", - "type": "name" - }, - { - "name": "message", - "type": "string" - } - ] - }, - { - "name": "testname", - "base": "", - "fields": [ - { - "name": "var", - "type": "name" - } - ] - }, - { - "name": "teststring", - "base": "", - "fields": [ - { - "name": "var", - "type": "string" - } - ] - }, - { - "name": "tinteight", - "base": "", - "fields": [ - { - "name": "var", - "type": "int8" - } - ] - }, - { - "name": "tuinteight", - "base": "", - "fields": [ - { - "name": "var", - "type": "uint8" - } - ] - }, - { - "name": "tuintsixfour", - "base": "", - "fields": [ - { - "name": "var", - "type": "uint64" - } - ] - }, - { - "name": "tuintsixteen", - "base": "", - "fields": [ - { - "name": "var", - "type": "uint16" - } - ] - }, - { - "name": "tuintthirtwo", - "base": "", - "fields": [ - { - "name": "var", - "type": "uint32" - } - ] - } - ], - "actions": [ - { - "name": "clear", - "type": "clear", - "ricardian_contract": "" - }, - { - "name": "sendmsg", - "type": "sendmsg", - "ricardian_contract": "" - }, - { - "name": "testname", - "type": "testname", - "ricardian_contract": "" - }, - { - "name": "teststring", - "type": "teststring", - "ricardian_contract": "" - }, - { - "name": "tinteight", - "type": "tinteight", - "ricardian_contract": "" - }, - { - "name": "tuinteight", - "type": "tuinteight", - "ricardian_contract": "" - }, - { - "name": "tuintsixfour", - "type": "tuintsixfour", - "ricardian_contract": "" - }, - { - "name": "tuintsixteen", - "type": "tuintsixteen", - "ricardian_contract": "" - }, - { - "name": "tuintthirtwo", - "type": "tuintthirtwo", - "ricardian_contract": "" - } - ], - "tables": [ - { - "name": "messages", - "type": "messages", - "index_type": "i64", - "key_names": [], - "key_types": [] - } - ], - "ricardian_clauses": [], - "variants": [] -} \ No newline at end of file diff --git a/tests/unit/test_contract/simplecontract.wasm b/tests/unit/test_contract/simplecontract.wasm deleted file mode 100755 index 36df4e812664ed4984d8404df7a215db0b525ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10883 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 diff --git a/tests/unit/test_contract/test_contract.abi b/tests/unit/test_contract/test_contract.abi new file mode 100644 index 0000000..ef4f53c --- /dev/null +++ b/tests/unit/test_contract/test_contract.abi @@ -0,0 +1,29 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.2", + "types": [], + "structs": [ + { + "name": "hi", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + } + ] + } + ], + "actions": [ + { + "name": "hi", + "type": "hi", + "ricardian_contract": "" + } + ], + "tables": [], + "kv_tables": {}, + "ricardian_clauses": [], + "variants": [], + "action_results": [] +} \ No newline at end of file diff --git a/tests/unit/test_contract/test_contract.cpp b/tests/unit/test_contract/test_contract.cpp new file mode 100644 index 0000000..b6509eb --- /dev/null +++ b/tests/unit/test_contract/test_contract.cpp @@ -0,0 +1,8 @@ +#include +class [[eosio::contract]] test_contract : public eosio::contract { + public: + using eosio::contract::contract; + [[eosio::action]] void hi( eosio::name user ) { + print( "Hello, ", user); + } +}; \ No newline at end of file diff --git a/tests/unit/test_contract/test_contract.wasm b/tests/unit/test_contract/test_contract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..36452bcbad674f215584c2b281d20e2577fea042 GIT binary patch literal 34346 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 Date: Mon, 19 Sep 2022 18:17:06 -0400 Subject: [PATCH 03/14] feat: implement main abi type and component types possible to deploy smart contracts now, needs tests adjusted needs new example not all contracts are supported as of now --- eospyo/types.py | 150 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-) diff --git a/eospyo/types.py b/eospyo/types.py index 8236dcb..27888d9 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -9,6 +9,7 @@ import sys from abc import ABC, abstractmethod from pathlib import Path +from typing import Dict, List import pydantic @@ -610,8 +611,155 @@ def from_string(type_: str) -> EosioType: class Abi(EosioType): value: str + def import_abi_data(self, json_data): + version = String(json_data["version"]) + type_list = [] + struct_list = [] + action_list = [] + table_list = [] + + for value in json_data["types"]: + type_list.append(AbiType(value)) + for value in json_data["structs"]: + struct_list.append(AbiStruct(value)) + print("list: " + str(struct_list)) + for value in json_data["actions"]: + action_list.append(AbiAction(value)) + for value in json_data["tables"]: + table_list.append(AbiTable(value)) + + types = ( + Array(type_=AbiType, values=type_list) if type_list else String("") + ) + structs = ( + Array(type_=AbiStruct, values=struct_list) + if struct_list + else String("") + ) + print(structs) + actions = ( + Array(type_=AbiAction, values=action_list) + if action_list + else String("") + ) + tables = ( + Array(type_=AbiTable, values=table_list) + if table_list + else String("") + ) + ricardian_clauses = String("") + error_messages = String("") + abi_extensions = String("") + variants = String("") + action_results = String("") + kv_tables = String("") + + abi_components = [ + version, + types, + structs, + actions, + tables, + ricardian_clauses, + error_messages, + abi_extensions, + variants, + action_results, + kv_tables, + ] + + return abi_components + def __bytes__(self): - return self.value + filename = str(Path().resolve()) + "/" + self.value + with open(filename, "r") as f: + content = json.load(f) + abi_components = self.import_abi_data(content) + + abi_bytes = [] + for value in abi_components: + abi_bytes += bytes(value) + + # hexcode = bin_to_hex(content) + # uint8_array = hex_to_uint8_array(hexcode) + # print(bytes(uint8_array)) + return bytes(abi_bytes) + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class AbiType(EosioType): + value: Dict[str, str] + + def __bytes__(self): + new_type_name = String(self.value["new_type_name"]) + json_type = String(self.value["type"]) + return bytes(new_type_name) + bytes(json_type) + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class AbiStruct(EosioType): + value: Dict + + def __bytes__(self): + name = String(self.value["name"]) + base = String(self.value["base"]) + print("name: " + str(name)) + field_bytes = [] + for field in self.value["fields"]: + field_name = String(field["name"]) + field_type = String(field["type"]) + field_bytes.append(bytes(field_name) + bytes(field_type)) + + field_bytes_array = Array(type_=Bytes, values=field_bytes) + print(bytes(name) + bytes(base) + bytes(field_bytes_array)) + return bytes(name) + bytes(base) + bytes(field_bytes_array) + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class AbiAction(EosioType): + value: Dict + + def __bytes__(self): + name = Name(self.value["name"]) + json_type = String(self.value["type"]) + ricardian_contract = String(self.value["ricardian_contract"]) + + return bytes(name) + bytes(json_type) + bytes(ricardian_contract) + + @classmethod + def from_bytes(cls, bytes_): + return cls(value=bytes_) + + +class AbiTable(EosioType): + value: Dict + + def __bytes__(self): + name = Name(self.value["name"]) + index_type = String(self.value["index_type"]) + key_names = self.value["key_names"] + key_types = self.value["key_types"] + json_type = String(self.value["type"]) + + key_names_array = Array(type_=String, values=key_names) + key_types_array = Array(type_=String, values=key_types) + + return ( + bytes(name) + + bytes(index_type) + + bytes(key_names_array) + + bytes(key_types_array) + + bytes(json_type) + ) @classmethod def from_bytes(cls, bytes_): From 5381571e6cbde352893fb97d6df5b11a6bdb547b Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Tue, 20 Sep 2022 15:20:58 -0400 Subject: [PATCH 04/14] docs: add deploy contract example and test contract fix abi serialization bug --- eospyo/types.py | 13 ++--- examples/deploy_smart_contract.py | 64 ++++++++++++++++++++++ examples/test_contract/test_contract.abi | 29 ++++++++++ examples/test_contract/test_contract.wasm | Bin 0 -> 34346 bytes tests/unit/transaction_test.py | 15 +---- tests/unit/types_test.py | 2 - 6 files changed, 100 insertions(+), 23 deletions(-) create mode 100644 examples/deploy_smart_contract.py create mode 100644 examples/test_contract/test_contract.abi create mode 100755 examples/test_contract/test_contract.wasm diff --git a/eospyo/types.py b/eospyo/types.py index 27888d9..8396308 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -622,7 +622,6 @@ def import_abi_data(self, json_data): type_list.append(AbiType(value)) for value in json_data["structs"]: struct_list.append(AbiStruct(value)) - print("list: " + str(struct_list)) for value in json_data["actions"]: action_list.append(AbiAction(value)) for value in json_data["tables"]: @@ -636,7 +635,6 @@ def import_abi_data(self, json_data): if struct_list else String("") ) - print(structs) actions = ( Array(type_=AbiAction, values=action_list) if action_list @@ -676,14 +674,13 @@ def __bytes__(self): content = json.load(f) abi_components = self.import_abi_data(content) - abi_bytes = [] + abi_bytes = b"" for value in abi_components: abi_bytes += bytes(value) - # hexcode = bin_to_hex(content) - # uint8_array = hex_to_uint8_array(hexcode) - # print(bytes(uint8_array)) - return bytes(abi_bytes) + hexcode = bin_to_hex(abi_bytes) + uint8_array = hex_to_uint8_array(hexcode) + return bytes(uint8_array) @classmethod def from_bytes(cls, bytes_): @@ -709,7 +706,6 @@ class AbiStruct(EosioType): def __bytes__(self): name = String(self.value["name"]) base = String(self.value["base"]) - print("name: " + str(name)) field_bytes = [] for field in self.value["fields"]: field_name = String(field["name"]) @@ -717,7 +713,6 @@ def __bytes__(self): field_bytes.append(bytes(field_name) + bytes(field_type)) field_bytes_array = Array(type_=Bytes, values=field_bytes) - print(bytes(name) + bytes(base) + bytes(field_bytes_array)) return bytes(name) + bytes(base) + bytes(field_bytes_array) @classmethod diff --git a/examples/deploy_smart_contract.py b/examples/deploy_smart_contract.py new file mode 100644 index 0000000..30b976b --- /dev/null +++ b/examples/deploy_smart_contract.py @@ -0,0 +1,64 @@ +"""Deploy a smart contract.""" + +import eospyo + +setcode_data = [ + # data to set wasm file to account me.wam + eospyo.Data( + name="account", + value=eospyo.types.Name("me.wam"), + ), + eospyo.Data( + name="vmtype", + value=eospyo.types.Uint8(0), # almost always set to 0, has to be set + ), + eospyo.Data( + name="vmversion", + value=eospyo.types.Uint8(0), # almost always set to 0, has to be set + ), + eospyo.Data( + name="code", # select "code" field to set a wasm file + value=eospyo.types.Wasm( + "test_contract/test_contract.wasm" + ), # path from current directory to wasm file + ), +] + +setabi_data = [ + eospyo.Data( + name="account", + value=eospyo.types.Name("me.wam"), + ), + eospyo.Data( + name="abi", # select "abi" field to set a abi file + value=eospyo.types.Abi( + "test_contract/test_contract.abi" + ), # path from current directory to abi file + ), +] + +auth = eospyo.Authorization(actor="me.wam", permission="active") + +setcode_action = eospyo.Action( + account="eosio", + name="setcode", + data=setcode_data, + authorization=[auth], +) + +setabi_action = eospyo.Action( + account="eosio", + name="setabi", + data=setabi_data, + authorization=[auth], +) + +raw_transaction = eospyo.Transaction(actions=[setabi_action, setcode_action]) + +net = eospyo.WaxTestnet() +linked_transaction = raw_transaction.link(net=net) + +key = "a_very_secret_key" +signed_transaction = linked_transaction.sign(key=key) + +resp = signed_transaction.send() diff --git a/examples/test_contract/test_contract.abi b/examples/test_contract/test_contract.abi new file mode 100644 index 0000000..ef4f53c --- /dev/null +++ b/examples/test_contract/test_contract.abi @@ -0,0 +1,29 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.2", + "types": [], + "structs": [ + { + "name": "hi", + "base": "", + "fields": [ + { + "name": "user", + "type": "name" + } + ] + } + ], + "actions": [ + { + "name": "hi", + "type": "hi", + "ricardian_contract": "" + } + ], + "tables": [], + "kv_tables": {}, + "ricardian_clauses": [], + "variants": [], + "action_results": [] +} \ No newline at end of file diff --git a/examples/test_contract/test_contract.wasm b/examples/test_contract/test_contract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..36452bcbad674f215584c2b281d20e2577fea042 GIT binary patch literal 34346 zcmdU&3vgW5dEd{ycXzRiy8sq^i6ms}>{_ZNTe86yNIFi13tMm5Qf%3=9Xk{REG+^c z0OCPYE=54Ltg0QSX415EGHJuOnJQ_e45vvNCr&CP^w`RCm~m3OjVGZKCw1yHp=a8R zlhkH^|L@#=fCMek@x%$p-FxqOeCIpg>wM=s=bm-ri$^2pT=Y9p<6-9>PF7Y{q7^Qu zR-#i67kFB64?9v~-SEY2#9eeMJe?x*6zPwb(8`+l4ZauX{P z367wjqPDdOkdrHUQJOf(Z2^FJqpGZ26{Q7`TcJJuag*9j_{za5nWkO*@xsfK=Irs> z_{7qYx!FUL<4fa*7LUBY=?Y4&Hs=2ZxuTLvN1I0%n@cXzLk|x}=Z-hS zQ*EI+K6$7Mk}I`pOw2zP%9Q38j?6ACx*p51hgnzFg9qxNM`q?GrY9a9KQeo0etcp4 zXmhE#u*mJibaOJa@8A1k#jMe7f;PV}H$S)7oYc+a@&uq+PWRP`<%Naj z?9!p7BS)LAS4mscgt~FO*;UiP_8mIZJh9ZAom@P;ba=N*RlI!Y(9z|YrNet%RgdYR zLx*SP#+Me4EFBIgQ($~@vR$AJW71&ssZ!6OLo^D+emzmbKrGL$12TE!cpC^6n#bA| zc$(={=V`X{MC*&okF+aR4;@-sSe~6&Iy^~p18T05v`A7-N#($%Lo=ZVgWYm)Xku=% z=?0VUeUIC;xzytdrD$_cv^nCBub!U5<{r0s^Wf$!Ten70Y4g^I%eLxu)$Kcy%Fdzd zcSb|kmr5^7UY^{Lc=AgT|Ljtt`pd8PkuUX>d+LQ^G!L|561k|fEm?`O)isx{xa@_` zw=X@Fs5m}9Kl7Nop;C=p7Nw;(KJ@PIeb-X&4}K|nPr=n*k)Cqi)lSr2?wyamt1vpY z8vfS4?0n3#l56iTdKWU*e&M6P>)uir&FuNVf99wE_XqyM)n1mS#jgAgpr88d-~V4f zzG8r=@x zn?KfYBk_}?RE)FQl6Uv1I``3(%KM0$dX$nKjk;{*F6CyY*IX@1eUkq3D6|=QH`9nN zYdBKF@l+#O*DyqAHC)IWPSkKAG@P^=76$cL4ab)^-038p6H()x-lefiN1|xu74&zy zLHbBsB@-G{Z;oB3tE;0*Rm+*Xo$H53(~`^1!|$i#sAL2L>dMryJNjJh#%$XNl_96v z%vKhC^nfK-yOV364i>&u3R=_2nr~4=#Pdp0%hM1XD*DJuN7+dT1cHr1)^n^8li{)x zQ;_|{6sewa(=dL7VXUu;NR7h=#0Q={p+-znvrEx2@z$DA zt=n9*4sMQe0{(_F1=H`3g>{^{yF`N=bxA^8FH}wS)Q|QvSkg+pm{8REIKWP|jQyr<33Q@Hc+>?><&t0m z^??Y%6#+e6n$F^7AET~brQ#*iG*tlv0M@|_Yz8#k4#aCq*R|qstD$fi>RouRL%2a< z2ynTKK?RU@>OuNimlGn8P7H`Tq%(SVKtj3=wMlY|HtCXUlMyfHSF8SI+Ejt|nRGn0 zI}tyvy6lS>|J~W2VK7U=9wBn+CnUo0Xl<`raB!`K?ERU$TRg1o+iAjfbG$`Dbp4x@ zsKH22Hx5Rwm0f7i@tfmv!#HQWn|?O4w3`QGiYfO1h6O>1M`c(pj#`UQiHB=wPsLxf zwZDTV(kCLbozmrd8xivCqlMSGdqan=N-mLaB)%SR!tGCLp|GQRLB_~KxXjCFcfP@UZy-W%6+ckcez(DZ61g9R-6ha7H&$r5+1j?LZC)H^CU-;S=VCRP5RSgERGO zQ#S%Dy)%xPq^Q~b$vhXDf`x&^$@H_0!v5q0Frx>lOtar@kWu1i7}_2+48iBo^wUus zosuL4CB7w@Z&(#~OLD?T@01~NwSzK0_u9Qk@M!2F4F>b+DNMC7_gz9%PbbD!K6Dbf zN&-HG>1W?*?SqK5kC6ps+>}QVDX>hGi*T6vRcF+CyD}#A*^_if@*HF9Fk2d3?lh3` z>m0fpr@x*i$x4w~SLlj?jj|ifQOGdHP6`45HG^hyc~q84wo{{h!509Tw_p2?dLhlC zdXe&l%&Vb7_P(jCcu&2U`XZXZ=vlJNx8Vh3F|F`a>`z<-HW`B}6>ht8$O^sW7IU2E zH1ZU(Vc33c7zb<@vaibBxwfiVtuD{ziC=b8kRhwx(^mkRh}2*-5t-BrC=aEK4J3}a zdXL5$$#y4q%siDbS9_h^MffA-dQ@egjIv%I4Ivfnb^_Vd$`x%$%WAL7-N67U>%}bz zjb;y`Raxb}z63@vF8gBEJ0o@lq+c3?JxD&7vn(gtSFVBr#iayw)+BKpOXhsulT-31`*y%fR_b$q= zo5_mDaj~Z;crckOP4O)el>bHs8M~cQF*%2>w6xO2?FQJQ^-`& z=ut0UBPDu#`AKSDMhVF7d!YnE(v<`2uUR^~s?#S)T0@RhDZ^NgMIU?+gXR<1jhJny zwWRm>gr0JfJd>GgUb5+%!AZtePBQdR1Z-Qt6H6&Q+bDm?mmilb^`t8?F|t#PkEfZ8 zC5(5B1tW~7b}8UB$~EG$G7{gf3qvz}xYRSHG5YSIk+=-L*bgeiSv0m%dwpH@ERvat zJT)<9`eItfcX?XVJsfnJ)8JZ2pJr72Rw9tcC019j8Ivc!#h8dp1J_87XVPyq7NSS_ znz6|6ep_5L7alP~rQ}mL5Jx78Hr+LEU9%IUHXaJjSnajUN2b#2B$#-z7Opvc&f(i+ z%mUN1k$F=H-1(NkWfHzx%&ZDoEBk_+J`Kwza)s>mBk?ePRY4+?74Z9Rnnoei^ur{y0Dh9tV)|dA zsEF9#96!`ZvY%NqktPrTw)G;PME%71MBw$rM6?7(B@wAdL?RDun({pvReQ44=$;|` zC={Jp3My{1asxmpLZq|`jgtH%h(H0*Qg5gN7zh-Ph6xyxT$kZFDJOTV2>Ibtn44Bi zfBxG;>2(VDO_Ka)zdfk8H1?ar`kD0Ggmz2Czge`2Eai~}V#8&d(!SBz--VTr)uqQ# z_JnE3YWdBW^%y6U`H|}`M3JvuXJ2;@WgnO)6rqWS>fK9?R?&x(7QA2Wk;Xl7;{F_- zW+^#5D@4_ckJ{J0L)i}u08gqxbf{S}z<$98*( zDAK}nW5ZAJEUw}?eDKNrNjbfbIT*pbsGV95URuR?K&VN@#jMkKj?c+^S?fxnPwl zR0_6W?GtNGeagOMwQ)_wt)~g%mDPoZp(ZeTAyhFtPhHTsvhL?X-Lze|S9Kp$ps~{K zQL91sBz;deO0GUGDn9hwx7?Z$03~C-+?epoAW9}`6oL^6j zn>)1d(1Q7DI(GZh^@{Hsi=L|YNdXE<=mSF%Dhv%6c%FnEh@_;#;w!Q7Wlg+62-YYP zSLqV%@r6mCg;J%X}H_QWc* zrm@vXwyjuCB>9D09oyYm4M39YYnRYbeap_Ro>E9vg}Wg$!58lhw5(sjXohlkpdB=X zAZ2&G(Hx`iyX1rsh{-w%BS})$=5^jJ!AP<%J@I(>#!mk5*I7UiKEvza4$F8F4-x{D zr6<_X;isrB+{~DW;5?w)!SzB7A^nekXDe8ds$kwL z6k(jGY5=K*RVr~jOlf@Ie}02=t1CZP>u)K(MnH||#cE9!OWYTDEpPd1e<5}*id&dm zfkz%5BT#lZ#lNu<=iI)T*r}u+smuqB3)m(wk{P(8uWwzat9{pODWLhj^CyiC?xo~ZS2b+G? zkkwVo3b$9X*C2aiu3jToK~J)}YzLf#NBt6_jZLz0wVZryn5exr4uFX1-L;MdzDAI% zUduZo>mLi57T?w`-CiH0Pn&3~#Ah>~Ej(}K3c*cT{6gFI5F;Ki0Wq|o33Qi;WCUMv z_aPI^^D%L7+F?|#i67PMCt1>x5FNaCs9rG|6vukrCc64fSz&3azKL>xERJ2TR2#;( z_`$X-u=X|iNx?;^)N0(}zMzuBjV)F|6Voa6@7(otr?PB{qh< zbrj;#^DDK%bx9J<&6+=DXF_3eg*Vd{;55oZQh^LW0X1J90zgs5p&074WY)ToFv4uY z4W#nQy$g*^T5k>0tYYRxrjuw}`kahmq_ujsi@(w|ad#)wpiDzFiygYW`}LnbJD|SG>l{9Z;1! z8+<>$r1z~o+77CqLAu4Q8sAFR&o2#@Lf;HI~3nD>o zd^3o_fGP#O-2T51bT!mUsAXewX{@5L8G;h$fjQbUl*Q&G`t-O60N#MB)HEhvY-|2` z?&#M=O}R-8C|OUHLXD7OBQ<5aQ9j>pT!!(~(Px8gK2vB}mDAh-`-~PoNDXzbw9Tub z*lAlIxk|AP-6-9S#A=~MftGca(S!VLEYTo1I~xkEsSp)5DAd7#vfUV* zZDSzCgY-jLS?W2$m6Yo_f@td|)s%G!Jo3|<4D`T>FrRm%0qt;P{RH&c`u2YxI1 z@r+E1-9Y zx0LPf)CG0QW=)$yZy*bx!)S57yOFaz0CG(rDbi`=yizFI)yNq=`AzJbTgon;vrvi+ z;->?Qv#J5S4vaHOv056R2pltLwerKX?{v`+wNA@<^(ka|9IH1(^f7z6*-2l{72tHK zr2uER3!PczPC|-4Wu$i6KCKjLbm4yyJU0pX7rKzY5RhM0ae#FITom$D=>kC6@Dz~0 zAmmX^V|Uq1xbJ6y5VTaVUvQewdO*D;zl@2i3a;AD|@_^q?V?+2J- zXg-I~-pO#$qw#~)fPrI-D?@(Zj$;i58HN~y-*3`@BeSm#`5lC4x6VxaoijAS{L$u- z1G4&&H;`oseHs1|xHE*Eb^K zZDcrF)V>YT=m{hhHV{VS!4cD(F{in>9%a7`bv2BHJ8kurt7gTqR-riSONJZ8Kl=-R z`MWmk^#I#rjf_tQB^$bcVE?*}O95pZp?H7+w@ZEX zb(5SY>Kej11bQ+NCwW&v1?ihc_A|Yh{h%oTG2>5CZfY{^6hd7q$k5m9y4b0vQ|%3=XZF?hW-iMsQUrRLG6sAWs)7>oB`m z$uY|@X=9elzy_FIptTJ#J5PpWK8T}XwiYnEps5%2I+&eT3KhCAqilEz=6S7B-we|# zS&m5?Gsa3u=jE8;mf8qLi<@!Rub|tRE3rErusbVU&bC@Ne%Vy9mBL&QDpEF#Sr^NJ z+A0HtPM=nlLb<$83d&HnyH6L(>Jz<+nI8+pnvfJIFgt-WI|H)I6h_l+A03Smbth`!wA~f8dbK zYq=6Dj@5tL1*sv*SUTW`P*5X~#*EyoF?jsy&;EHtKpDa@wL>Hr$PodRwu!)lIu9sK-2Orf`s!Dx+!a^3y@puezyj))`QQUykPAm%KuN-7f<|tRq>1VIl34|9fnX2evFwz; zZkk0-NGsvrS-Za#ue2T7%zzaYRD>NF9fu$ z#Wh-#U!u;@U2}6|R=cMBcJpru5qPcjN3AWG>f_nGk8$lyqSePs!KR%x67<&^VTt%c z+_oukm!hAJeA?2`)qI91tS(}sEifjK7h;8UGeCs2MlGoR(}`3bCMET4!sI+{Y+_Ib zMQE-l8J!T$Y3A=fhEp~b3^m0DgFc^ETT}~hZGLh#?QV*qtVqoU_USMhE*dN}+DvhRUvnvZs|py}T^2YdhesdK5P#B9sexjl47M?WyYS zMS=hdJ{O+}l>cfJD1VU|zBULH!v=wp)~ms(SF6-76k=_|F}uTNyFz$1BY)*UGNG+> zv6fJ@$iP0t?_jfmN{4@l4a>zzYq>bdmy0{#679&#!6iAkMBubp+`tiFidkB=0gPY` z>#shN?9!kN95R_GXcHNrzIZHOz$a#`4MmFY$d96fi8iT6+$Z=`R*P-qVLA6D_Y5F8 z4uZ_4O569IWZLv@(Hxq2*1U$0rIwy$#O*z05i)Rp=}nc!9t>eMYs#=k#>Rf?BOm(g zr+?+k|2}#vYL)lOB}VUS04|t$tScaO<*N&l=*JP5BDf_+V$>47nueXw^5?aT+!p~a5%$uu9*Fwu@+Lo2GyNBuqXB1a0dVJ_2FrIc-mqGQO?)# zoY#qJZ}#ym39s(xg1pd;_P%H!V}v6g>#Z@qwogCHgz6dW@PqjVRG-we2|QNJ9Yi|l zX#>XJ8oem{+oQL09eO_+v6I`j!U?$ql#_1S*%tD5Gmm9L@OrYKB zU^B6%+3K%+_O-KY=GAqEm(|0_nO*vqgoZ-dm`DRz`4UIA5Rx zh{3z7MGE5OVMMMDs63Vak0f+G%0BX2Iz9p_MA;v;?`&+PH=%=ojHZk#h}Qb1Vx`A+_y(OQgqB6soHtSS{FC3=>dTLQUuhi% zFiBnuOk$J+t?qunJnR3ZXa7(qT3CJ;o4R_Smw`6sPnP6v7}QvM@;hhOH9+_2jykix z`x!ozge{hYh-EL%+ZQKG`o&`YLN0GWO0d}=3vl<0B%6MccyOcK7@ zh$%pD4Qwpo)Z@?KJ(|!KIVW`T2 zy%b^Se-UA*O{F@sf#HaAV{EIm*ZK#o^OlezTzdVzcD-1tm)+9~zSO%?;4O6y##)Ir zGJAWg0mVcV!*@{OK`}Ue7HBvQ~W;YRH&RAnn zCcxO8*monxMR_W`5f*s$NOrnPoj z(t?p}LXy2op`|_>$P_bPph1nw^n|w|36^UVzhSwNPWg1PF1oUQ1GP0@1aH=mO#Rq} z4NkVnjOL_MhJGI)SIf31O;sYGu1CMM21+9x^vmBEePD+sLZh#;&{d8ya0p(qqAJ5n zzdPun`^Jt|OW8+ROS$2F4QG@Le1;&dzc-3qp-@QpZ^MH~NvS`xO_d@jVChvXt}w;z z3k{J{Qi>We^r`Zt%c?{wz}&iBWzA9;2|8d4Dg*gCDQbvk5nQW9`bY1KT8;kfdoiy{bp%7(Y=I4Fw(oaqTNcBWRyl(OBiOE3zOjSWBWNrY?{@9uAWq_Ct6pc zht?BHK7bYJ2WU0#i5ZYiPbzBqc;1mMmv_XvvgWKS1uU#Z?pqeBwv^SDK?Y7naGbbk z-rIj*9X0pt8;T>*-WL_ezgzjs+(xq3>dBR|hc1P+rl3pWdag^G|1O2CjrQhlNfX-Z zB+Z65a}C45qFF&l(DaU8uo-`^d)1$|Rv&PXa^tq;)fl&JKSq#zTRU^2aotdT8(J3f2^@1uX!<>@U4624x2&P@t@eL zkH5rQ0D*x!eE-LPtX<{8?UP~AWjnSRlhpt5rk-sEfHhS$vA6~G!tIY}pkZmk_usL= z!a7hXQ#MMivA**M*`!{W099nTg>a)q$98MXFMzJmioI5CGGDlT{Fsu%YXMNqw%S*LD zWKTPTknwJ_4MVMAM*fi!z!OkD(Rp)<>S94)IK0yhSqv^>A>;tCAZD-WUQlLW8uP2iw0v~k!gL)>dBfzGMIx*UOrq>{K?n^0+rS?dkjg7ZCPS9|>X1xgnZzjc z)svX}u?CqJM+?4J4zIn}#GU5|Jf#R75CnXyvDcI?f(Ht@olS5A60+6*+R*+$QFS2*5 zbA~})s8@0EE6^^7%iE0s-LL@*$oOE6IYUWah>T&s>9w(5jbbTH z7JWYldE$)lxo3!P^THZiv)<#u6=QB;or`h2jE@*l^+_6N81R<#wRRF%{j}dYQcf>} zNYTyl%3b6uNB~QyQb+!+q>l8^e5g~AcfTXLZ4UMZwau&{%9jHXd5pFo1rJRua)-=b z%E&t{X=x{~C%qgylN4hWe9TD?Pdk-prkd3kAhk1}RU9Eaj`+|neUZjP*)X)~0Y(KM zG}})VHmWdNghA;QJ|~&?)g|wR<4`9xJCI9D$5~4<9DH<`&2HV}XD<`tE?SAF>{de- zLyzczh>g7GT`yr+Lq2^}F)+$I&pQiR9qJ{#m|n?*{B^+GtmG^V^wJcW&h{YxLG-UC z%Hos^8tVdnMu!4uY3u4vI2cfK_ZH zA2tc2@hY^kF*3Qeg>k)Y6NpxR%J4@_E~Y4VYPtSy!0e=>bz>Ks@IKhEzu3(*&AcV|9TSq_F zU4X_2$;(y;Y6KX6*i}T>bSj(C&w&e3ljwX~yJ64#k6s6(U&81!1rPOQ)a_gWLqdk0 z3`5fFeQ$2>Em!uwlM6hVeMOPrlgxge$6~gbd+9TGQVP4~OseQCTZC6Txigu2%!20t zY(&e%9k>|JUTIQ1YMj7CV9t9HiC&s&iRt=E3P?5Rw^g!e6M{T#Vu8}c^!W1DV6Mc9 z%|Vqge3#R0VjpXElBI|+v%+IQe06v1jPA0g$2jP%49m0MgY5``GoPfdY?o!#C&Pv) zw#G>#KBip6qn#!hr7H+Oh9;&#)}-&Z7opfiurJ?~U^@pGCGNF&X(;q`1X?aT^J$ko z&4+4^<(jAAw+c4!uE=Gxt0%;E?@%M*fK9Esn@O%m>Y2FZY9mBa(|3a>J+PYEAlrQ) zr(?M!u$C_JItjZZ!vU16SFwqLS{!Di9i1G_sdZcq@T7wz4zuFU`=jaUh_g~dw9yvN zeMFeiRET-i%&qP|>7cwJ?crdPilE6I2{2e< zXdT|ELso-J6zlL#<{Mgg)e3a_Y)pSMf_w3(g+95k45I*$a0gyyhgHX;Mpjc}PQh8> z@Z;z4^K^9D?`X5AG`G9FfDGh7vfC-GV@>H2>80Ztfhs|c^LY{g&nEItxEZDF8cvOv z$8)P{Y){qWthfbFHUMg6bC$DB6#=ly_SO6#ylwyxj4GRsvxR0O0B!gkh=l=dd9vOa zMG={Fi;E$Xj7YwW~)N*X>tYEl#3>h8^K zQ=Jx!$9LLTtku&IN=UZ#&$BifqKdjhfayXmz?@7BRXmqkFfTH*Y8#A@5?`o0ML8q1 zVuD+za(Z*N8#+1{(wOWCOKRCkmxqY}xexb*d5L=Rm@NIBF~ znvOl9In~Nmq|33iF4(2)((?(M_5hpiFpC5xQEgb8x2AQtHJun*Z&Mj8SQ4)a17z=E z+f|jH&|3g(TILH7GwJ)WL5Ni(zSyLTmBvroX{(+HGkfcWk=CiSMb#yq)pvK{oGPJn*O%ViVpUVQ9#WbOaKMG2187F z@rzv=$_G3%HZ#_GQCDwhz-(<$=jkqL#tetKbt0!|l#^wSEDwVI*Hd_0*={pOtmkKE z|64d|1q8s-7U7|NR+`D)KeeP5M0SPgi&?_27-aKP(y46c^3+16^=PVbAPz$VOXN%V z&fQ2c*%C&oAFB-2Zx2-j;>zMsDleW`aZH}@L^wlnb)-NU+ka`sNOB{R=Hum;qd?NN z)}|s!!7n0N*oDMiTQ*t|SC6K`$$_?wBEQw;qu3Q)*_de}^l_7n43+}m<1ANd&4!np zYs`%Gt}jPK2X4XC&iE`|pr()=8{nPBEJx=L9TTTEfQ5wQg?Ja6kX;x|X%jz|;4Awi z+kIVpHp zb>l77#EOvGS%!;wV~!OWt%NBZ8$*TcCaGs?3o=YPnDh4eRHshk#Noj=D2~&lLZ&M~ zU~b|;lC_y-LNKab@SP!F3doOsUJ_wsAhAy$U9&EE4?`))cf2a>%h?~Jo zb1H7wD4fZ0ONZd6O2=f6bddK z)eM3DX!lOmD+!Ds126Vk;ldJelx+3=)>(Yrdasb}?L+BAQ@xjg5u@2&q3$=s5RS8u z*QB8l>7kThA_1Xmy&whu^`bm#!~#VS_v$J!AymFRGpQ$q40GM<)#idZE`6)Z4ItZ-!r z0j@zvgir4{R1ux7BmDIrLoyomcr_Rxs#hvSE`M^gH@0VH<{OXmIK4s$~XyeJzYOw%vw-VnAZD zjl{!kBrX^dRbD48+K=_rW*bP}nGmDKoILY6OgqSOwPZA_CKbShuOm@|18i`$I@uss z%sz}9V*P4!jV;Q?R%4dXpUsdB_fK&i9>Uo_oF#O3Uqu3&(>Xf5j4q!5j}Pt7Sj+Inil&s&ii{S`#OGo0RAB}OFTXOfpZ#z$^DAfx#baqBZq;WvD09S_)B{FiST5H0?;IHNh^S1 z%^*4qVN!Vbpo63>`$jG~l$$#x39njVTt9gr$U+cui8eN@2>XdxAx0HK{<0Q|`WI|j zLPiCPCr=iBVcbGyIbXBLGyS^Es%3H_UZ^>|E|V9JXo}PBLgpGv8eMR=ST2XzgWaUMpXmCRo=(#zxzXTihL8wZ%PG&l+}D zt+i`?)-@q>S@&PG?u!?Ab~A`4G6>1spp>lJEZVrE^j(1C@9 zrrGR6%tiJ`x@5684Z}Ry#51lJ(7Teyfn&6@xP$g7DO=+(haxb&wz|+)$I%OP5u#~I z#{ec5xksAkOW|#LbV9*lqDcx4b5U?OQKAKheQZk)=!EdetLQ>$P0nkSrYv(rdx^i8 z-a=F;L{iwdO52LPQzkN!Y136Z^8N`$2n>o8Q`6Ph;Ky))A(>%|epB-nRF4vh{gmZk znjVL+s!TR<5R1=g+S{UUoM{Q&D>$ZKlPuI;S&smPJZLZ>Fm1>Jn{)ZaR27Yu6xE|y zk%)i~$rgCX-*S*-SpmYYsY{Da-@Q=8Lxr_>Yk}-cWN$Qv-fI&!vGl<38b5U=CW>O3 zbLt&I<|1LiCmsc(RXcE^zNueksomUIC zx;D6ppG@6$-S!>)Nb1X8euJ+!UJ(ksSpGG&{;e+zJv>%OQl0D6%7x?#g^Be0urdzqniY9OC1!H-xYd9CQRlw!e~V!8Nq!1%J4N>KImXB7=;pLKO_zV`Z!TT>f#*3GP%qr1FGRz` z!@Gue5APY?JG^grWO)DZf#HL@hIj4SwR_i|U3+)!+cmOl|E>eO4(=Y_y=(XG-FtTL z-Mw%3$nO2S59~g;XL!%9J-hep*|T@gzC9y*_U}2c=iuJqy}S1A-n(b--o5+wj_lpP z_rTtR`-b=J+P8b(o_%}w?b|o9Z~wjn`wor_kL()RJ+fzH@5sK9k&*o)2SyI=AKt%f z|L*;J_V3-lZ~w^t{reB>KX_pHz^((k59~Rx_rSgbBM0^$IB?+LK~OwM^9KQakZK1> zLI^+Q(g)R9=PuqJt~ZW`>pR1B^dsT=^to`I`l?-5pL|W`_&dL8!mdw#_TSjG`J2Cq zLY)Wfmfzo0_*W{@Ei?SqAXzs)_zLH?koAVwyzQYoZ#$q;SN>_`FWo*#(GC9;-A>=} zP`$B(b5fGQ`>wCn3hB!>z5JDr&d$vrd&Cz@18Bs~^0uCvZ@g}MrMG|RhMQjT!4EwC zk6!ia*MH|fzWoh%-TS6@yz^b(^X~V2@1cjsCnlSR-+N?gdS+p9>9P0!lap|tKzRD$ z{(EL-n(rN-@sB))hA%dcEjMQ;n(mErNBNOy-&|OjTX1h_F7gA;es*rjFEr;Dnv47% z^!Ot)P4{L}#{JULWA4G`!qFp({22DEpKQ(^X->Ka=9>%S`q6Bw$HUPhOG~7`dCo5` zPdw@mV_y8+f}cFH(41JBTX?LU!>>_KG#3}$ohs2hab%I-!+!ht%yJWBH0Ni=7v9_S zhgFjw-lk~bWVAE6fyEc0~O^DEqfPdDb47bx|}^5SFeo>_i7 zdtrGVoc!Wri%ZR;egaF^DMiZs+`{<6k(tN*^6dC=?4fn~p4sE$Ge@Y@Y)-p3EX*w~ z-Zt4(bAIN?>@@YqCvTgZrIPh9fOcw*9a?yU-k;c+@b>CMN;B=wT!k+}Oh0baU3v zAAw@`y!L^dxh;O=eSog~7`LjqG5y#$?6kfuAQ|+b!@rQ8i$I5o_beh2oyUjxIq*OT zBl;aDniJyP(eb6c`4%he+K%4PWt)TDdH@wwUey0<=d^pUxlBNIksKQlKsZ}KtA zZ=iPyJ%oH59iM&7&&|_O(ce0s^MIZjOD3C(6AMS?kvVW}vvq8I^73rS)x@JmW+r`0 zBvq(I9uv>DM7nm{l7dB575TbbXv^OuB4V_C-`q05=O*}#b@$dK4Y5JTCiurg5$CE1i@=1LZdFG`e6%NE`J5W+t?zUUum z!i~iyeWHyA7v`4cCgx^x{)?hHhC$&w+>zWqLiVC4lMC7+G;J<{=;G3m*N7N+~G~T&G#)JOV)j}AUU*lwspKM5$lo{m*=qtBI#QVg#bhqIyrA%_tdU_c>Jhr z$ojG^-P|bC3_(sN*DAOkw>LMJ-Z!@}-B$nBbGQ0$WMBBwa&!f|d1U!0Twb1? zbl+`k&y!jshK+4BAIuTT!yv3B*7P@`*txZYPk|49?pldY51%q0e7H57tu_3&HT<_V ze7UuLJ_CGedCgGKHKQ|{>{XM6c zYx-&@B@R03#~Fwjfn*5gP#aWio-DugD8nt(vS4f4bMx%-%*-u35xPsa+;r1Ti>-gJ zdd;hDnz(6#ETVjA{0eS}0jBY*xgkQBvRTJv#1GThb33;J5zx?#{Qg_7`%{{(~>Bpf6Vm$$WR` zw+q@0lGFY}lAN=zN=W9L{|JxUxl`X8|E Date: Thu, 22 Sep 2022 01:24:55 -0400 Subject: [PATCH 05/14] feat: add schema for abi validation adjust abi and wasm tests --- eospyo/types.py | 63 ++++++++++++------ .../test_contract/bin_files/abi_bin_1.txt | 0 .../bin_files/abi_pass_bytes.bin | Bin 0 -> 53 bytes .../test_contract/bin_files/wasm_bin_1.txt | 0 .../extra_fields_test_contract.abi | 3 +- tests/unit/transaction_test.py | 23 ++++--- tests/unit/types_test.py | 24 +++---- 7 files changed, 66 insertions(+), 47 deletions(-) delete mode 100644 tests/unit/test_contract/bin_files/abi_bin_1.txt create mode 100644 tests/unit/test_contract/bin_files/abi_pass_bytes.bin delete mode 100644 tests/unit/test_contract/bin_files/wasm_bin_1.txt diff --git a/eospyo/types.py b/eospyo/types.py index 8396308..ee63d34 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -9,7 +9,7 @@ import sys from abc import ABC, abstractmethod from pathlib import Path -from typing import Dict, List +from typing import Any, Dict, List import pydantic @@ -608,23 +608,45 @@ def from_string(type_: str) -> EosioType: return class_ +class AbiSchema(pydantic.BaseModel): + comment: str = None + version: str + types: List + structs: List + actions: List + tables: List + ricardian_clauses: List = None + abi_extensions: List = None + variants: List = None + action_results: List = None + kv_tables: dict = None + abi_extensions: List = None + + class Config: + extra = "forbid" + fields = {"comment": "____comment"} + + class Abi(EosioType): value: str def import_abi_data(self, json_data): - version = String(json_data["version"]) + + abi_dict = AbiSchema(**json_data) + + version = String(abi_dict.version) type_list = [] struct_list = [] action_list = [] table_list = [] - for value in json_data["types"]: + for value in abi_dict.types: type_list.append(AbiType(value)) - for value in json_data["structs"]: + for value in abi_dict.structs: struct_list.append(AbiStruct(value)) - for value in json_data["actions"]: + for value in abi_dict.actions: action_list.append(AbiAction(value)) - for value in json_data["tables"]: + for value in abi_dict.tables: table_list.append(AbiTable(value)) types = ( @@ -668,18 +690,22 @@ def import_abi_data(self, json_data): return abi_components + def abi_bin_to_hex(self, abi_components): + abi_bytes = b"" + for value in abi_components: + abi_bytes += bytes(value) + + return bin_to_hex(abi_bytes) + def __bytes__(self): filename = str(Path().resolve()) + "/" + self.value with open(filename, "r") as f: content = json.load(f) - abi_components = self.import_abi_data(content) - - abi_bytes = b"" - for value in abi_components: - abi_bytes += bytes(value) - hexcode = bin_to_hex(abi_bytes) + abi_components = self.import_abi_data(content) + hexcode = self.abi_bin_to_hex(abi_components) uint8_array = hex_to_uint8_array(hexcode) + return bytes(uint8_array) @classmethod @@ -701,7 +727,7 @@ def from_bytes(cls, bytes_): class AbiStruct(EosioType): - value: Dict + value: Dict[str, Any] def __bytes__(self): name = String(self.value["name"]) @@ -721,7 +747,7 @@ def from_bytes(cls, bytes_): class AbiAction(EosioType): - value: Dict + value: Dict[str, str] def __bytes__(self): name = Name(self.value["name"]) @@ -736,7 +762,7 @@ def from_bytes(cls, bytes_): class AbiTable(EosioType): - value: Dict + value: Dict[str, Any] def __bytes__(self): name = Name(self.value["name"]) @@ -799,9 +825,6 @@ def hex_to_uint8_array(hex_string: str) -> Array: def bin_to_hex(bin: bytes) -> str: - # if type(bin) != 'bytes': - # msg = f"Expected string containing hex digits." - # raise ValueError(msg) return str(binascii.hexlify(bin).decode("utf-8")) @@ -809,7 +832,7 @@ def serialize_abi_json(abi_json: json) -> str: return abi_json -def save_bytes_to_file(filepath: str, output_file: str): - bytes_to_save = bytes(Wasm(filepath)) +def save_bytes_to_file(eosio_type: EosioType, filepath: str, output_file: str): + bytes_to_save = bytes(eosio_type(filepath)) with open(output_file, "wb") as f: f.write(bytes_to_save) diff --git a/tests/unit/test_contract/bin_files/abi_bin_1.txt b/tests/unit/test_contract/bin_files/abi_bin_1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_contract/bin_files/abi_pass_bytes.bin b/tests/unit/test_contract/bin_files/abi_pass_bytes.bin new file mode 100644 index 0000000000000000000000000000000000000000..8dc3f7384b67c9b13c9d46357485314475ea81ff GIT binary patch literal 53 xcmXrvOU*CN%(t>iOv=+q<003V@3cdgU literal 0 HcmV?d00001 diff --git a/tests/unit/test_contract/bin_files/wasm_bin_1.txt b/tests/unit/test_contract/bin_files/wasm_bin_1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_contract/extra_fields_test_contract.abi b/tests/unit/test_contract/extra_fields_test_contract.abi index ef4f53c..4d478c0 100644 --- a/tests/unit/test_contract/extra_fields_test_contract.abi +++ b/tests/unit/test_contract/extra_fields_test_contract.abi @@ -25,5 +25,6 @@ "kv_tables": {}, "ricardian_clauses": [], "variants": [], - "action_results": [] + "action_results": [], + "extra_field": [] } \ No newline at end of file diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index e0ab19e..9025e8b 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -1,3 +1,4 @@ +import binascii import datetime as dt import json from pathlib import Path @@ -124,7 +125,7 @@ def test_backend_transfer_transaction_serialization(net): def test_backend_set_wasm_code_transaction_serialization(net): - net = eospyo.WaxTestnet() + net = eospyo.Local() data = [ eospyo.Data(name="account", value=eospyo.types.Name("user2")), @@ -132,16 +133,14 @@ def test_backend_set_wasm_code_transaction_serialization(net): eospyo.Data(name="vmversion", value=eospyo.types.Uint8(0)), eospyo.Data( name="code", - value=eospyo.types.Wasm("test_contract/simplecontract.wasm"), + value=eospyo.types.Wasm("test_contract/test_contract.wasm"), ), ] backend_data_bytes = b"" for d in data: backend_data_bytes += bytes(d) - filename = ( - str(Path().resolve()) + "/" + "test_contract/simplecontract.wasm" - ) + filename = str(Path().resolve()) + "/" + "test_contract/test_contract.wasm" with open(filename, "rb") as f: content = f.read() @@ -164,7 +163,7 @@ def test_backend_set_wasm_code_transaction_serialization(net): def test_backend_set_abi_transaction_serialization(net): - net = eospyo.WaxTestnet() + net = eospyo.Local() data = [ eospyo.Data(name="account", value=eospyo.types.Name("user2")), @@ -177,16 +176,20 @@ def test_backend_set_abi_transaction_serialization(net): for d in data: backend_data_bytes += bytes(d) - abi_test = bytes(eospyo.types.Abi("test_contract/test_contract.abi")) - abi_hexcode = eospyo.types.bin_to_hex(abi_test) + abi = eospyo.types.Abi("test_contract/test_contract.abi") + + filename = str(Path().resolve()) + "/" + "test_contract/test_contract.abi" + with open(filename, "r") as f: + content = json.load(f) + + abi_components = abi.import_abi_data(content) + abi_hexcode = abi.abi_bin_to_hex(abi_components) server_resp = net.abi_json_to_bin( account_name="eosio", action="setabi", json={ "account": "user2", - "vmtype": 0, - "vmversion": 0, "abi": abi_hexcode, }, ) diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index a7ff47b..34b948a 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -1,6 +1,7 @@ """type tests.""" import datetime as dt +import json from pathlib import Path import pydantic @@ -131,17 +132,12 @@ def test_bytes_to_type(class_, input_, expected_output): types.Abi, types.Wasm, } - if class_ in uses_file: - filename = Path().resolve() / expected_output - with open(filename, "rb") as f: - content = f.read() - expected_output = content - - instance = class_(input_) - bytes_ = bytes(instance) - print(f"{instance=}; {bytes_=}") - new_instance = class_.from_bytes(bytes_) - assert new_instance == instance + if class_ not in uses_file: + instance = class_(input_) + bytes_ = bytes(instance) + print(f"{instance=}; {bytes_=}") + new_instance = class_.from_bytes(bytes_) + assert new_instance == instance @pytest.mark.parametrize("class_,input_,expected_output", values) @@ -264,11 +260,7 @@ def test_abi_vs_eospyo_serialization(net, type_, action, value): (types.Asset, "99 "), (types.Asset, "99"), (types.Asset, "99. WAXXXXXX"), - (types.Asset, "99."), - (types.Abi, "test_contract/invalid_test_contract.abi"), - (types.Abi, "test_contract/extra_field_test_contract.abi"), - (types.Wasm, "test_contract/invalid_test_contract - 2.wasm"), - (types.Wasm, "test_contract/odd_number_test_contract.wasm"), + (types.Asset, "99.") ] From 27967e7c4fb35f67b5205de2551db022dd105b48 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 22 Sep 2022 07:39:09 -0400 Subject: [PATCH 06/14] docs: reformatting and add pathlib dependency --- eospyo/types.py | 16 ++++++++-------- pyproject.toml | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/eospyo/types.py b/eospyo/types.py index ee63d34..10a91db 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -776,10 +776,10 @@ def __bytes__(self): return ( bytes(name) - + bytes(index_type) - + bytes(key_names_array) - + bytes(key_types_array) - + bytes(json_type) + + bytes(index_type) # noqa: W503 + + bytes(key_names_array) # noqa: W503 + + bytes(key_types_array) # noqa: W503 + + bytes(json_type) # noqa: W503 ) @classmethod @@ -806,7 +806,7 @@ def from_bytes(cls, bytes_): def hex_to_uint8_array(hex_string: str) -> Array: if len(hex_string) % 2: - msg = f"Odd number of hex digits in input file." + msg = "Odd number of hex digits in input file." raise ValueError(msg) bin_len = int(len(hex_string) / 2) @@ -814,9 +814,9 @@ def hex_to_uint8_array(hex_string: str) -> Array: for i in range(0, bin_len): try: - x = int(hex_string[(i * 2) : (i * 2 + 2)], base=16) - except: - msg = f"Issue converting hex to uint 8 array, Invalid hex string." + x = int(hex_string[(i * 2): (i * 2 + 2)], base=16) + except ValueError: + msg = "Issue converting hex to uint 8 array, Invalid hex string." raise ValueError(msg) uint8_values.append(x) diff --git a/pyproject.toml b/pyproject.toml index fe6a8ed..df59a06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ pydantic = "^1.9.0" httpx = ">=0.22" pycryptodome = "^3.15.0" base58 = "^2.1.1" +pathlib = "^1.0.1" [tool.poetry.dev-dependencies] pytest = "^6.2.5" From 5a8c997e8725f7191b5c085f2cebdd39afa04d76 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 22 Sep 2022 07:51:16 -0400 Subject: [PATCH 07/14] refactor: fix pathlib dependency --- poetry.lock | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/poetry.lock b/poetry.lock index bd9249f..7c6ab1a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -280,6 +280,14 @@ python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +[[package]] +name = "pathlib" +version = "1.0.1" +description = "Object-oriented filesystem paths" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "pathspec" version = "0.9.0" @@ -640,6 +648,7 @@ packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] +pathlib = [] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, From 1b298272785f4f56f14d12e955c7a3fd4178aa60 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 22 Sep 2022 08:01:59 -0400 Subject: [PATCH 08/14] refactor: fix flake8 warning --- eospyo/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eospyo/types.py b/eospyo/types.py index 10a91db..770c3c3 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -814,7 +814,7 @@ def hex_to_uint8_array(hex_string: str) -> Array: for i in range(0, bin_len): try: - x = int(hex_string[(i * 2): (i * 2 + 2)], base=16) + x = int(hex_string[(i * 2) : (i * 2 + 2)], base=16) # NOQA: E203 except ValueError: msg = "Issue converting hex to uint 8 array, Invalid hex string." raise ValueError(msg) From 202ef3e913c5d82ac93bf3e91625b2698cd4c654 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 22 Sep 2022 08:15:24 -0400 Subject: [PATCH 09/14] refactor: fix abi and wasm test paths --- tests/unit/transaction_test.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index 9025e8b..9662741 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -133,14 +133,14 @@ def test_backend_set_wasm_code_transaction_serialization(net): eospyo.Data(name="vmversion", value=eospyo.types.Uint8(0)), eospyo.Data( name="code", - value=eospyo.types.Wasm("test_contract/test_contract.wasm"), + value=eospyo.types.Wasm("tests/unit/test_contract/test_contract.wasm"), ), ] backend_data_bytes = b"" for d in data: backend_data_bytes += bytes(d) - filename = str(Path().resolve()) + "/" + "test_contract/test_contract.wasm" + filename = str(Path().resolve()) + "/" + "tests/unit/test_contract/test_contract.wasm" with open(filename, "rb") as f: content = f.read() @@ -169,16 +169,16 @@ def test_backend_set_abi_transaction_serialization(net): eospyo.Data(name="account", value=eospyo.types.Name("user2")), eospyo.Data( name="abi", - value=eospyo.types.Abi("test_contract/test_contract.abi"), + value=eospyo.types.Abi("tests/unit/test_contract/test_contract.abi"), ), ] backend_data_bytes = b"" for d in data: backend_data_bytes += bytes(d) - abi = eospyo.types.Abi("test_contract/test_contract.abi") + abi = eospyo.types.Abi("tests/unit/test_contract/test_contract.abi") - filename = str(Path().resolve()) + "/" + "test_contract/test_contract.abi" + filename = str(Path().resolve()) + "/" + "tests/unit/test_contract/test_contract.abi" with open(filename, "r") as f: content = json.load(f) From 8bd8d3559c58ccaf316ca71f01acca4e011132a8 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 22 Sep 2022 08:19:21 -0400 Subject: [PATCH 10/14] refactor: fix paths in types test for abi and wasm --- tests/unit/types_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index 34b948a..edc5735 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -98,13 +98,13 @@ ), ( types.Wasm, - "test_contract/test_contract.wasm", - "test_contract/bin_files/wasm_pass_bytes.bin", + "tests/unit/test_contract/test_contract.wasm", + "tests/unit/test_contract/bin_files/wasm_pass_bytes.bin", ), ( types.Abi, - "test_contract/test_contract.abi", - "test_contract/bin_files/abi_pass_bytes.bin", + "tests/unit/test_contract/test_contract.abi", + "tests/unit/test_contract/bin_files/abi_pass_bytes.bin", ), ] From b5f7f277c3e20fd0368d1a3e26d1aa3538dc8c84 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Wed, 5 Oct 2022 13:49:25 -0400 Subject: [PATCH 11/14] refactor: change file loading implementation change/simplify tests to work with new file loading change example to work with new file loading --- eospyo/types.py | 31 +++++++++++++++-------------- examples/deploy_smart_contract.py | 4 ++-- tests/unit/transaction_test.py | 33 +++++++++++-------------------- tests/unit/types_test.py | 20 ++++--------------- 4 files changed, 34 insertions(+), 54 deletions(-) diff --git a/eospyo/types.py b/eospyo/types.py index 770c3c3..a716c5a 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -628,7 +628,7 @@ class Config: class Abi(EosioType): - value: str + value: dict def import_abi_data(self, json_data): @@ -698,11 +698,7 @@ def abi_bin_to_hex(self, abi_components): return bin_to_hex(abi_bytes) def __bytes__(self): - filename = str(Path().resolve()) + "/" + self.value - with open(filename, "r") as f: - content = json.load(f) - - abi_components = self.import_abi_data(content) + abi_components = self.import_abi_data(self.value) hexcode = self.abi_bin_to_hex(abi_components) uint8_array = hex_to_uint8_array(hexcode) @@ -788,13 +784,10 @@ def from_bytes(cls, bytes_): class Wasm(EosioType): - value: str + value: bytes def __bytes__(self): - filename = str(Path().resolve()) + "/" + self.value - with open(filename, "rb") as f: - content = f.read() - hexcode = bin_to_hex(content) + hexcode = bin_to_hex(self.value) uint8_array = hex_to_uint8_array(hexcode) return bytes(uint8_array) @@ -828,11 +821,19 @@ def bin_to_hex(bin: bytes) -> str: return str(binascii.hexlify(bin).decode("utf-8")) -def serialize_abi_json(abi_json: json) -> str: - return abi_json - - def save_bytes_to_file(eosio_type: EosioType, filepath: str, output_file: str): bytes_to_save = bytes(eosio_type(filepath)) with open(output_file, "wb") as f: f.write(bytes_to_save) + + +def load_bin_from_path(path: str): + filename = str(Path().resolve()) + "/" + path + with open(filename, "rb") as f: + return f.read() + + +def load_dict_from_path(path: str): + filename = str(Path().resolve()) + "/" + path + with open(filename, "r") as f: + return json.load(f) diff --git a/examples/deploy_smart_contract.py b/examples/deploy_smart_contract.py index 30b976b..f3b6ef7 100644 --- a/examples/deploy_smart_contract.py +++ b/examples/deploy_smart_contract.py @@ -19,7 +19,7 @@ eospyo.Data( name="code", # select "code" field to set a wasm file value=eospyo.types.Wasm( - "test_contract/test_contract.wasm" + eospyo.types.load_bin_from_path("test_contract/test_contract.wasm") ), # path from current directory to wasm file ), ] @@ -32,7 +32,7 @@ eospyo.Data( name="abi", # select "abi" field to set a abi file value=eospyo.types.Abi( - "test_contract/test_contract.abi" + eospyo.types.load_dict_from_path("test_contract/test_contract.abi") ), # path from current directory to abi file ), ] diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index 9662741..6a78137 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -1,14 +1,10 @@ -import binascii import datetime as dt import json -from pathlib import Path +import eospyo import pydantic import pytest -import eospyo -from eospyo.types import serialize_abi_json - def test_create_authorization_using_dict(): auth = eospyo.Authorization.parse_obj( @@ -91,7 +87,6 @@ def test_backend_serialization_matches_server_serialization(net): def test_backend_transfer_transaction_serialization(net): - net = eospyo.Local() data = [ eospyo.Data(name="from", value=eospyo.types.Name("user2")), eospyo.Data(name="to", value=eospyo.types.Name("user2")), @@ -125,7 +120,9 @@ def test_backend_transfer_transaction_serialization(net): def test_backend_set_wasm_code_transaction_serialization(net): - net = eospyo.Local() + wasm_file = eospyo.types.load_bin_from_path( + "test_contract/test_contract.wasm" + ) data = [ eospyo.Data(name="account", value=eospyo.types.Name("user2")), @@ -133,18 +130,14 @@ def test_backend_set_wasm_code_transaction_serialization(net): eospyo.Data(name="vmversion", value=eospyo.types.Uint8(0)), eospyo.Data( name="code", - value=eospyo.types.Wasm("tests/unit/test_contract/test_contract.wasm"), + value=eospyo.types.Wasm(wasm_file), ), ] backend_data_bytes = b"" for d in data: backend_data_bytes += bytes(d) - filename = str(Path().resolve()) + "/" + "tests/unit/test_contract/test_contract.wasm" - with open(filename, "rb") as f: - content = f.read() - - wasm_hexcode = eospyo.types.bin_to_hex(content) + wasm_hexcode = eospyo.types.bin_to_hex(wasm_file) server_resp = net.abi_json_to_bin( account_name="eosio", @@ -163,26 +156,24 @@ def test_backend_set_wasm_code_transaction_serialization(net): def test_backend_set_abi_transaction_serialization(net): - net = eospyo.Local() + abi_file = eospyo.types.load_dict_from_path( + "test_contract/test_contract.abi" + ) data = [ eospyo.Data(name="account", value=eospyo.types.Name("user2")), eospyo.Data( name="abi", - value=eospyo.types.Abi("tests/unit/test_contract/test_contract.abi"), + value=eospyo.types.Abi(abi_file), ), ] backend_data_bytes = b"" for d in data: backend_data_bytes += bytes(d) - abi = eospyo.types.Abi("tests/unit/test_contract/test_contract.abi") - - filename = str(Path().resolve()) + "/" + "tests/unit/test_contract/test_contract.abi" - with open(filename, "r") as f: - content = json.load(f) + abi = eospyo.types.Abi(abi_file) - abi_components = abi.import_abi_data(content) + abi_components = abi.import_abi_data(abi_file) abi_hexcode = abi.abi_bin_to_hex(abi_components) server_resp = net.abi_json_to_bin( diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index edc5735..76e4d89 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -98,29 +98,19 @@ ), ( types.Wasm, - "tests/unit/test_contract/test_contract.wasm", - "tests/unit/test_contract/bin_files/wasm_pass_bytes.bin", + types.load_bin_from_path("test_contract/test_contract.wasm"), + types.load_bin_from_path("test_contract/bin_files/wasm_pass_bytes.bin"), ), ( types.Abi, - "tests/unit/test_contract/test_contract.abi", - "tests/unit/test_contract/bin_files/abi_pass_bytes.bin", + types.load_dict_from_path("test_contract/test_contract.abi"), + types.load_bin_from_path("test_contract/bin_files/abi_pass_bytes.bin"), ), ] @pytest.mark.parametrize("class_,input_,expected_output", values) def test_type_bytes(class_, input_, expected_output): - uses_file = { - types.Abi, - types.Wasm, - } - if class_ in uses_file: - filename = str(Path().resolve()) + "/" + expected_output - with open(filename, "rb") as f: - content = f.read() - expected_output = content - instance = class_(input_) output = bytes(instance) assert output == expected_output @@ -135,7 +125,6 @@ def test_bytes_to_type(class_, input_, expected_output): if class_ not in uses_file: instance = class_(input_) bytes_ = bytes(instance) - print(f"{instance=}; {bytes_=}") new_instance = class_.from_bytes(bytes_) assert new_instance == instance @@ -295,7 +284,6 @@ def test_array_to_bytes(type_, input_, expected_output): def test_bytes_to_array(type_, input_, expected_output): array = types.Array(type_=type_, values=input_) bytes_ = bytes(array) - print(f"{array=}; {bytes_=}") array_from_bytes = types.Array.from_bytes(bytes_, type_) assert array_from_bytes == array, f"{array=}; {array_from_bytes=}" From c5f84231b881c6e0c7d740aecc3127dcdaabf24a Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Thu, 6 Oct 2022 13:17:41 -0400 Subject: [PATCH 12/14] feature: implement Wasm deserialization additionally, add from_bytes wasm test --- eospyo/types.py | 17 ++++++++++++++++- tests/unit/types_test.py | 1 - 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/eospyo/types.py b/eospyo/types.py index a716c5a..bed28b0 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -793,7 +793,11 @@ def __bytes__(self): @classmethod def from_bytes(cls, bytes_): - return bytes_ + uint8_array = Array.from_bytes(bytes_=bytes_, type_=Uint8) + uint8_list = uint8_array.values + hexcode = uint8_list_to_hex(uint8_list) + value = hex_to_bin(hexcode) + return cls(value=value) def hex_to_uint8_array(hex_string: str) -> Array: @@ -817,10 +821,21 @@ def hex_to_uint8_array(hex_string: str) -> Array: return uint8_array +def uint8_list_to_hex(uint8_list: list) -> str: + hexcode = "" + for int8 in uint8_list: + hexcode += ("00" + str(format(int8.value, "x")))[-2:] + return hexcode + + def bin_to_hex(bin: bytes) -> str: return str(binascii.hexlify(bin).decode("utf-8")) +def hex_to_bin(hexcode: str) -> bytes: + return binascii.unhexlify(hexcode.encode("utf-8")) + + def save_bytes_to_file(eosio_type: EosioType, filepath: str, output_file: str): bytes_to_save = bytes(eosio_type(filepath)) with open(output_file, "wb") as f: diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index 76e4d89..24e98c9 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -120,7 +120,6 @@ def test_type_bytes(class_, input_, expected_output): def test_bytes_to_type(class_, input_, expected_output): uses_file = { types.Abi, - types.Wasm, } if class_ not in uses_file: instance = class_(input_) From 7e0ff21b1a13a9b481676692d49daeb7fe7899a4 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Fri, 7 Oct 2022 15:07:32 -0400 Subject: [PATCH 13/14] feature: add zip file loading also remove external pathlib dependency change tests to use zip files for binary files to save space --- eospyo/types.py | 17 +++++++++++++---- examples/deploy_smart_contract.py | 2 +- examples/test_contract/test_contract.wasm | Bin 34346 -> 0 bytes examples/test_contract/test_contract.zip | Bin 0 -> 13783 bytes poetry.lock | 9 --------- pyproject.toml | 1 - .../bin_files/wasm_pass_bytes.bin | Bin 34349 -> 0 bytes .../bin_files/wasm_pass_bytes.zip | Bin 0 -> 13789 bytes tests/unit/test_contract/test_contract.wasm | Bin 34346 -> 0 bytes tests/unit/test_contract/test_contract.zip | Bin 0 -> 13783 bytes tests/unit/transaction_test.py | 4 ++-- tests/unit/types_test.py | 10 ++++------ 12 files changed, 20 insertions(+), 23 deletions(-) delete mode 100755 examples/test_contract/test_contract.wasm create mode 100644 examples/test_contract/test_contract.zip delete mode 100644 tests/unit/test_contract/bin_files/wasm_pass_bytes.bin create mode 100644 tests/unit/test_contract/bin_files/wasm_pass_bytes.zip delete mode 100755 tests/unit/test_contract/test_contract.wasm create mode 100644 tests/unit/test_contract/test_contract.zip diff --git a/eospyo/types.py b/eospyo/types.py index bed28b0..e8577e6 100644 --- a/eospyo/types.py +++ b/eospyo/types.py @@ -7,6 +7,7 @@ import re import struct import sys +import zipfile from abc import ABC, abstractmethod from pathlib import Path from typing import Any, Dict, List @@ -842,10 +843,18 @@ def save_bytes_to_file(eosio_type: EosioType, filepath: str, output_file: str): f.write(bytes_to_save) -def load_bin_from_path(path: str): - filename = str(Path().resolve()) + "/" + path - with open(filename, "rb") as f: - return f.read() +def load_bin_from_path(path: str, zip_extension=".wasm"): + filename = Path(str(Path().resolve()) + "/" + path) + + if filename.suffix == ".zip": + with zipfile.ZipFile(filename) as thezip: + with thezip.open( + str(filename.stem) + zip_extension, mode="r" + ) as f: + return f.read() + else: + with open(filename, "rb") as f: + return f.read() def load_dict_from_path(path: str): diff --git a/examples/deploy_smart_contract.py b/examples/deploy_smart_contract.py index f3b6ef7..953458f 100644 --- a/examples/deploy_smart_contract.py +++ b/examples/deploy_smart_contract.py @@ -19,7 +19,7 @@ eospyo.Data( name="code", # select "code" field to set a wasm file value=eospyo.types.Wasm( - eospyo.types.load_bin_from_path("test_contract/test_contract.wasm") + eospyo.types.load_bin_from_path("test_contract/test_contract.zip") ), # path from current directory to wasm file ), ] diff --git a/examples/test_contract/test_contract.wasm b/examples/test_contract/test_contract.wasm deleted file mode 100755 index 36452bcbad674f215584c2b281d20e2577fea042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34346 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 AUjP6A literal 0 HcmV?d00001 diff --git a/poetry.lock b/poetry.lock index 7c6ab1a..bd9249f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -280,14 +280,6 @@ python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" -[[package]] -name = "pathlib" -version = "1.0.1" -description = "Object-oriented filesystem paths" -category = "main" -optional = false -python-versions = "*" - [[package]] name = "pathspec" version = "0.9.0" @@ -648,7 +640,6 @@ packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -pathlib = [] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, diff --git a/pyproject.toml b/pyproject.toml index df59a06..fe6a8ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,6 @@ pydantic = "^1.9.0" httpx = ">=0.22" pycryptodome = "^3.15.0" base58 = "^2.1.1" -pathlib = "^1.0.1" [tool.poetry.dev-dependencies] pytest = "^6.2.5" diff --git a/tests/unit/test_contract/bin_files/wasm_pass_bytes.bin b/tests/unit/test_contract/bin_files/wasm_pass_bytes.bin deleted file mode 100644 index 3a70c2f48065d6e1b72ae887741d0acbd6474918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34349 zcmdU&3zS_~dEfUr=iWQ_&bc#lM=whngZI7I#ReNjuaQKco-^RL0S62L0+GivS6DNn znbACiOl8d&jO%uhqNHg{veHJOS#^@ySz1lfkdV}qhy~7bDT}1ghLwnfq@<*YSgXw< z4^V&qZ=d@ZX@o7p3du)tZEF)CCs*>KG;xyK0s!+yRavO}qHxg_kDH z+2ghGiKQcRvxg?fm&Ok*9(jM$6_i|U&Mh99J2bwy*j!k0MJ1JvHjgegmt3TW9v+U) z9dCxG+Cp=D@=zBfS8COmn13{sDa|h&nO$0RJ(gn+v#zWM57a{s&&*9sPdqYyWcJYf z_`>+n=2CNEk=u#s=45E!zxRcTS)n!mtEPeNJ9MadVyQVhxp;W#@NSo?c=^zwqsuc(hxfRu z9@9gI4$sVuFD)KfIvh}@!1&~3yFeSpq`~M@rJh5FXcUP3dZL7ZSe{)6Wb(-IHV`T_ zkF_iCG}Ech(`@I7))$u_Zda@xI<&N~JUg*;c#`G@)LbWNk))cE%7IOXWn!OdH?ZjGYS=B*KzZPn|l+jk_D zokQ2}jE1f+m0ps(G`S)1`N=t8e@ZI0@uBF}|_)_$qf~&nOJ>|Tsov6LkJ0E># zVRURY{H=Z2`Iu)V*WO?BE@Z6z!bgACy`?ak+4KMS%uoNH5B!Czy(CSGUHKhAKlRtY z|G$51#Q;&`@zvF?8foTgkERPzvJ%rupUd0;NtwGj{xHv3?RX=aYQ!Tvh14fT8;N&Q z*}zmbf2`p~;wMI_7-zL5@9tA|?xQJ{_YpVsC?z`@b=k^Y%FRx%xmuL^B>k6BXfyI| zrV(A%aHNLgsYbG{VTjObxR5uTsNq6rIB7L34C=8OjxTSx(@8ofqQ*PDOJkRgMA6F2 z=se@5E6^@1 zkMk57C|PqplqpgrvAn3(fRwwTW45iH2=T0NPoE1tsNJL<)o!F6+NKR7LOqcr?1|zP zP>j4Asz>o?LQM$Z`l8I$A>hsNh0#WQM;~+;bgt@B>O*(*rIFr)3{gt0QG&Lp>~3?A z#7DXm@1k0eL$xqfmw2u~43z~NF2Qr0{TbkL~PU@fJ9s9Ak* z((%;pMEtbsvM*x%cV~Zw!7K@Tgvh0zkO;@4wY_S=!L=5$_h;^I@vydUrwQB5@fHcu z^>0+71|vP)I2gHBcA-JXZ;s0i}QPnZ`{v1-3YAo&Nyb0qGtCe^IT{O76uY0)6X;t`;!yEj2@se&3>0bMv0$hXnVvk1fNIJ zPe*ZdN|F?m_?Be8VO88M$q665Q-;LV4$A!8Yxg3-BcY2l7|f@qFxAG~cM4HGofupB z&`IPf3HTJIpLwUX4BesK);IAK#ck6Z8@kbdx||KvBKdysZm{VZL~ z8|tk`zGtlWRHN+UXBrhG{Ox`5wF;Fl`^w3B4`>$Dhobu60Q*COXeoV5|ldiO=1n1R=UW1oN%(3pvnph*>nfQX_lCSc#zKJks8ii2P50lUW_(?*G z>3@x)B4U4Y{9q%=erC-?nm_>9){A@+^%Lh4f!7lg(GnPyM5G=Oi9EDv%J*bc?a5Z7 zdxr3%P;_P~sJP9_4FI7CkIVd(l|sZe0(idGVhpR1U&;*C(t91ZNinEdK(8V7l(-HWmtZjBznKh`Mc z&G?dLdqpOjJ_5SR4&Xu-Z%JwmqJN}k<*8c|*C59ywXG!CGx09Ugn5)$o+eDcFLwPpmohDf^Pu#x)hUo+5}>Ru>+En!xCVP{r&#bwT6Gx}OVm({|ln)qOyL z#!9_~5gTHTuR@-Ud&2daSPY%f1(3Oal8bsCjU;&!FePRy6>p zn^5py%2|mXyAM8>{z)7{I_C-e7lO($POh#-vRy14bBw_+#N4JNZLjX8}R@46lPbEaOQ$ zNC;4to?t_VpQO5QGh-rx^MGy#*9$d-^gs5xUIvC!6+XJkPcN}Ljrbz1LT=)A@ax>swjwQpNXhQK*P%sChKb zSMX=*tVuGK5GtxDR8*zCN(dEI@=#GV^;HCx%s$H`R8(z+imI(pQADlV?#!a4X)E=j zn^Xs1=${Z;pv^yR$Aexpc=gDtXMawd%|_NLw|Dgg%D!kg0mc`oh(`()x+>yX2J(rH zm(v#e3GUWnf^@J@(_fWAz7`N!-0H)hY(#)>+5xU{75&2>Z z`3<@E0&SOCmH+QI(es{G<-daUm>mUYa~349!1SR}k?}7ZKP@WA1g9ESurvekAzO-7 z!Ms-}!Z=aY08$OBRN{D;()hmr@_Of1SAL+@-%@;yfEv+@)tW4pxG(Tp-tyJ{LhM`= zw=lT^k32j^pzLyre`6)ixqUOSQ%OHknGYHluuWhjGjK;=-?~m$`>xqmK#b?0#z5ZO z15;VAm^qN`)TNUBh%&kUfyK8;ezQEWDwfA^x(umGcFUc8vOU6XBc}9gwpYEQ4{g?$ z^snBN1-3}Tqp3!P9!moWO=+3CiruOx`rM`J)h;6_R4C@FGJ+zLX|ar*G*+?a!nF|| zZ2DD0R#z=6++N9Eh3t*FdW~EKJ;~~_9dHsJ^-G90Hp$A>a`LrdqW0Q203xP$*E$yX z8bPjlE$@h|e=KBLd|SJ8dwq~TZKACbpUr%>@Vu2P1UF^z3vJs&jCjBV#L$8!&|M;u z5q!nnhfFZf$Hc*Dhf%pEepIucU`b0tbnxDxdc|l^9P4?T=;}9Rg{7(bCdvV_ICi~K zZ5ZF;2ivZ|+SlYK1s9=Gt8s_>f=UiIwpigXJ~sxHHX6!>B&)@wq2xC!&s)tri_#sR z#IkE)WZo*oq{oHq0!~{uBCD4IBJ#jD>-?8M3XAVe15>YLzEbP^^Ez6*Q0r9S8@<`P!{d>0XMR@`cD zZVcvz3zux=Eq#oi;DdM#<|Yh3+wcw8b`}(v-w?N9LOgi5?{j63d3)xx0F-bea9UMHXSTw1D zvtui{v;ADlZzk@hVrNv0DjODSg_uK>E=*7jsnY=|5bDkT!>Orf-rC268xm{j+ywe8 zu`%SWqY#&#Td57MOOj}A*8C|u6AF_nyqUHDr%@h~3SpkyerOH2VsO3+ibw2~_-O zVl1e^!fk5cbW%sX>swSljAWN_6kyuD)$7x##&y&6?b?u6^H;OXl->cj;#Dj&0}UMs z3-`@^zAg_XJbCaHM%N6W9e zvoR265-^EnIFWuUpCObRG*}<059LWabCd?!ll2|&tYmg*hh}k5`7TI+^)AUimFU{m z>~9A&C)2RY;9q*We!cG}l_0A*kwfNEdD~XkJ2PeYrT%)q(+>=Rchzsg&WNxuaL9&q zKvnK+REFw9eyguc)wjwDi4-W&h)bXhRFN0M z=?4OLc9)j38&zXgBR+9dD^_rJmFj3(MMRSzIkK0M2m{3i~<>fa)3nI>CT2? z%#=4j7Q7Mqjk)8irlcmu9d)0lj* zt@-DTu8>a$e)98?arY_SDk$|)~vMTFO z(U4-irEGVnE~ryBYuXfg16cqaMvL>^jhy8HkZS@-kxnD$l|s?3M$YKTZ(`rvQg-p2 zg;Hz~KOJD4RSn>EV4P8k)zbJx;Fv+Hl^>>kr;CQDbz07=Pa(@=SiK>lkJ(GjPWp1L z0H;eW1vtZ9=*%j25>oUjBem1^X{Au33;&DYxk<=B--Y~zfc&b81FQq!qL8Ob7XZqJ zr-1wgA&+VryUS+6eLo9?$c+h#g_kSr9kw|(n>Hf^MRpxQ(;yV${)oYx3;%z8S(>n9BVMhFvKAIev<|qnSFK0?;u3Gb!OV{oS_Nk zk2a4Skkya8fhx!>-_Z*fY`3j2Rq>-~p= z!!W9b-J<;j8o$myK583^f#~#J+jXp9S?P3Fn+7H0B2bGuzK29`2eQcxLkoal4|CqU zz7Y{`Bg4_6_HBqpPavtVfiNNuj+o|*InBlODEn=wt6?PEX{)zfH7ky_3dLDpGTbQs z*UzYP`Qt5;b4!ms|d3k}$9sK7`ggf?p7(xt!od27LBAObNhctH3 z-9YKf01N18fR<2(FjW5W5B=P~vNbTQoVC^x$ly?5aA@UpZ>ZNXf~!iQLT&^HdAe9x zhuOtSj#-XL8?#&nHo)uxt!;?ec`_vPK^zUUwSd_LO}(hs!R)+JsL+KOWy4c2&uf+X zW|&sVa!lHoF;+@CFUJhG)J8B`+>E<^1>MeEiQVad-C5ysw$-}v%chF06y}0Zk+NaT zx>yd>Rv934`n0MP%H@4hP=>PIeY#jypXgQ0G?AI0MoGjdbN3E0be4U3H{wj#^(#&u z2Sa*!Dvv+l{C|Pq;B@V73qxE8IIOV%r$RXn^t*PC@c&Yos20}?<+>csv)y36LRhK= z<~(4iq@rg9ih?=v_wjV5lY740FhTxYxiMJVLEdTdwh$(u<{8zbY+h5uBDcHSr|CBO z1BYy0%avGhtp3|BNDWcO(g8n&f*OG|X5?m#!Q)qd_Rk{%$`FpJ9U{R%jtHo6c zud3@5>HsMf^C3 zy{@bT;j1MJZ3I#$auF<0W5_OL5nwuN5+BN03n}17)z-z5PYHh((AJ67}jB9Tctv+4~HtnpDpug4# zOT-uAwoQq<6#aDM)0T#=<}*ZLbrBnFfiZ!+5G$mc0V1R|YC-j%N~H2IDXDK0Cg*8m z6N54+LUTpQ=!9@iGk^CnoU*B4s3|rW^!dEnqFR7!^OLh7cT8KzDnnd0bFrK=5(H52x%hOT{8ytu`HRf(wLzd5HVBloUJXvYTBUxz5NjKb*&R096~e0-`6~yK z32mi|wS=NY2KFI-2b&F4I{ZUyST0Ul%f(5)T-*VdXh&WSF3G_q0;kR5295wz%+j(A zU<7MefAx`Mmj-3vkjX?ro5%q5#bfybJ~3l$C{lb!eiR){v`IbUKEa=|T5KZ^%egPQ zX8_4@5M(x0+P?QB)24Te=FrSD<~4*Ywe$=lZtp3Jkb(P)Z>lu*KnSZ@Q-(b+^pUtN$yKZd{**)1(nI|Gl`u6HN8$czw) zhng>S7wIYiBTDJNj}mR>iXLN!!x^@7#q9r#wU81vsP5!}J*n@8Gx(3M4Nu#{(-td; za=wP=yiQbmlaFsncy&h?NS-(5^7uO&fyq}ABXV^><*D?4CZX$5_L1Mx@exoV%KoT*XJae92^|DvG-XslwAMEj zD?Q*shv-)D60-l*BND0GMk0e?eVe}=LJ}Zf(Fvo*H|Rtmv@ELTyos{so_JlWFF*3V zrF9sgs`B2HKcES(3Y9P-E?h*UheLfbP>B zb!L6{GkhosTPz6?%U+nbFHDy7i^cqfT;70`V6#CM;O=QjHvJ^=(g(l(pML)fgL%f7 zBz(0IQ-I(a*jU1;$DYP}G@&hYWR1NL-2y<64_BH!ts4^sTA0w{I-AgT0b0)i3TnD# zB-&8=c?C4ci5pv8eZsH@1N?@< zP?ZIHF~ZRQ0>V(6N_A!f!x87k*j8z;^$%L-Eg?m?^!j`4da+b5yQdd?sduHoTk0H) zwGwM&_V!i-iis%59WCNr+ww+P2b=ivG^-PgRa4mXa=llw6^|zN?KMeiq-rkBZX(2- zvBsiIfU!HV?^be?>>&lwIAjL7sdvxH%Kd|Jsg#t$UsQ6XQo%$rCE$xxq!Q3F7Y3AC zomqx#FGy5<%AT(Fwg*jybfk#Qf+ z`mqZeoNSXB%}J*W{XRghmTga(szg9tkA7Mqgo}s~lzE5WHkX zRfd;-chE)mjUBC)vX8Qsa>M%?&L|o93_)CfZxp*ip^)(3h6j<7Qh#QfDn(Gh(yLfp zVT#)q8X~2n6g6V#Q{_vSRf$x9xplkBnx!xjbifu=2J&@M)DX`ixK@kwkKP%z8vWUK zYpVa5Fn+f>A-?uMSjP{Mboy3E;3O{umwQ*t5y+9yYd=Z$;|PBx z^9-QKFN(?L%1VDda;?9(b)#$2dWh&`HJdxe&XeA-N7qaClI(Mi!wcZvW?v!IOUQL&Rr>>X8eQhRe#!AeZWD=joX%2V%)apB);YN#&?beuI09~UMd#&1JzHs~aF(rrB0-%`3 zZ^?WZ){4XmSgY>OdS~$-dzlFhbE;HMWzp2A+z)BlbWmo1W#7A8EPsy%s6c*-iL_Rh zmui8?o^}QyJJI@h#N)b9B4mxhSHS%ZPYpiBOjeTj5;FEkCjqu=| zT86eaxxU^i&Ny4S45gTDH%LXy*w1X0&T=uH-uOMiV$%bDx*fN|8>mpcJpj{4^w;KbxVFMPB@xdH(hLXGx8N+_lYh%3{ z#ZsCq`hE`b#2Mjp&k*0{g*CQjy~l$q#@xa>7vp#tA2FcnlQhsU;4SHE?If`JX}@)( zoL&ZzqMPHDyU16N0G3dtj{I9m9qFO@P^TjAen)iM9PABhn^{AYF9#y>7;Qlc9-3I> z4w=1_k#}0s(oSAadO3C`DaI=Jn3Eo!b}G?KHLEW`YG*#HI6`BcNVld)Ju3Vy^;y}>wvjg$ypfar71F>iFs~%@Qlq7&-+1>Y{2`zVu-2sO2i=?1TV`R6lJym ztJp|BY!XJ}RcK{nWO8c@<9gdB5Uu>iRmtvD6uIzm$7kD!JiXy=$nf*ME#cVV8(r50Z6n4#-RMAXEOJg z1va50{}(xiCQIDv`4ocAIUy)@Ml)Af}UkZRCxt7Oq81bN!T0;P%R@#U?- zT!|H%gDPS8E~neXKGy6cOA%pag~x#S%I?@1-DORWanM^CmS?{k+Yth1K1pBRF3YM< zh7D0{jgv-vOu2|hJ54f5R}g*-O-zHVN#AcTLa~crU%n~9b`CH~+-vdDQ0S=$v|M)P z(=L0857ivYHBZ5B6>Q*Lk;`URPl)Z_p+>?1n_6`@lU$F~GjYq+Mu?=Q?*>nLU^TTt zw);R%$8t$vEnVbw5_U<311MRqViN_mILt^pIystC>$n`?Ne4+BX2qTNN7K_0XQhT{ zqb;8Mh%lq68ii`Ylmj^7U+rO(KuH#5(%lxFgkj`YXskh*Tit!qL3u;k!@(vML6bWY zV6eo{I=oYdtOl1T*5RGZH?;7o73lPtnEqx2_u^3teR5$LMgbt<4!q0`tByyFtft1C zg0sTm$Is#C>FBiI(PmL;Zg+VB8OVWTw^Lfjn$jiGOUE+;Re~Jn^CSSCP2`<$GfLSt zoEkBY=T_C&o~p-LaSNVo0MyFnEN7c40$`QxtNB5A-2fmMRW==G3(ZCV+VDFN3j^Bn zWW6(rA~NX~7egi)k$f4;)h5#~Ms{{MIV?&CCbF3UxfTAEKQTVXZNOk2%H z51)G?9=eW@ za;T>?9eYG`s+Fxsmt$#NuuIvc=MpyU0XE%X770wE+ORfnP3v%LIx)1~rZQNtBwiH; z$lgP?t13UCw*c6*%oiYL()VM75UWUhu}K#zji0vDRy`4B_SOp{ty5{sy=DO@H+U!! ztj|1;M9RqMCQ6_Ll2-?^DkSwt>fv?OTVgs%o4SemxuteA{cW8U9qb>YfSNa$01A8! zhM4l=7rQi+4|ry5W~}w1uHMjq+1jAa(_Pez84h#nL{8BtC(9gJ9t8bwr|`J4-DZwh z&(F^O_i)k*2!N$6!bAJ4G?Tr5YDq1K>KI`Uyg_l+=8i{@mah;O(8orz&njuj?N!CCQfYt3kk^!@h&zYyD*s2CVniz zSN2J^2jzqTL!(ukp5GSLBtK{AY>|{Aae-{R4hk%0Y?TNLZ**N#+g^#6$+!9AHl=}c zQt+_q##^e16(O~=3>Wjp94j(f2~#>Yh6>qDQqR;DWSDd?=k4>UPMyYy!-H>79H&Wz zOjm%w+{A+nt1z>&9mIiYT?f+e^^kgf;6EJN2q( zEv%?gGUzXD7wAlzl026sKshCOtZqQb%~&4Vvcl^qIS{Cr5Q=9~8_{5(qNQ&{ItI-F z-jZUu#^i{4Cecxy;}3X`FBL8|<0{XAILP{j#NnWiS~qbt9(NIE3kVOih*Jx@W;wJ% z!BeTa$~ql}!}8NXEtmyaq@~x)Xb=5GPS-;}$t7N0)}%-W*`SFTFFLWjmT?kU+&T># z7FKj}4QHz`k|2eHwuel=8iPxd@W`;>a-;_m!z#v=)GAS!Ea4@=D*6k(e#yEqjO<7~I{!GYXjjs+{;#n9u_tan z7x_)3o*swL^V2eCFqJYnskv@d4T8BjZGi`P*+p?us1-|4$LiRzN>w<~^~C8(`O`D( zpySY@*5h|XcHB>%sd)^3LsvzSL5TQ@RjlNXwIgOK(cvljgoh<;8{q1KNP#=VEU0}Oee zT+>j*;V-r6oxa97^j!v>SNUL8Fz9BoVUrp3JNhbN8-{9VaOvx+Wd?hFEsQp{-G+f; zKw`3u#6xW)E*KJ3UMDTukM-1M8%W-n5TnMNJpDOLJIHdiWHhTL6~KhABT<6`Y;d(Y z*&tWUK8ze<{c3ZKEy~7LW0ugL&5#ZEPjMa|!r4EZC3JURMFN}CIYou~UWhR&+*(~HerL+2KS zsPh(<+70k~6*>1f4+r=`_i}_c^+CpxuSs)z=%F29_ZOeFfS_r!ybml-A3t^_JI0ok zU&B%aMTcFM^1P+ImKOW6zE-hMS>gdpOk0Vcw8XuZn6wgq#S(|X91kq3Wk2;f(P?<9 zc8E^u{3T@jI(~fs{vk654(_oAEOM3e8@MMPq&?Ik3 zD}Z6mAUX_TQh4~FgQP9{MlLy&n>!^5uUcVTKY1X?LJ)F^Ha4sX`-xZ~MioN-vKET^ z7i?KVMg@x}PZoY*+(KqKU$e+F{kqJmWpW~3s5!hYlNXO@iqq~w<{C>HU2wNpE{EBL zT(q@2ce~|sT3yIRjkR1 zm3{yH$|REU>zW5xbMRFY1N`So`n?4Q*&|-5rwK)DS{D6kS0DA)u=K^Gz|ZGZdedrO z{{Tv#kM9~dCI8NbRPHeUS7z;vb&lqSS-d`fwX7FkD_@)@Sl2?vM%#^B+#OxD#XVQg z8g^H$wQGIWH6e3Z_g}E?3l@N@ZH~Mk0n_vsA|e$`u+Aj59}?k|JSq;V(1Ojowdkie z*jg|B=$*BZcug<1aVq=I=z593;qU2&_d`C%mh ziZz1lBsC5q3r{rZYD+tj-W6;S2gNH|UjSE$axwk0D9R6_S6s?$4U^F86>4H)W?iw+ zfrW;q+3Z8iMfOL!WU)65!#vrq6LS2Y)cR5gz(9$=t5~t&TEvWEOSJA ziNBcMLR2V3QrNdj+lswYCNh#~(^Wh2{s~1042l#})79AE$8dllnPH25Q}Y&7j}nUg zl;vQW9*3~1Og3>4i_dA=+oErrX$jpcIHq5dEYx0Jj{t={XfPo#ZO8(fbNR(o6^)h@ z)uUOFh=32t7I?_ta*$+M0m84TON&n5y->tMg|&BUf$U6VZ#0J9YZErH^uX{MKXoQ1 ziej2`>K#GmB4NQN9tERSJ8+`Fd1CgqqlACGB&DKrZj_JyM(x|Vn_jW#?ru{2Ru6wxf7zvv$MVju=@0lxp(rDr zR|~efHn@qOOxPudFgReJU77Dyj{x!A!tuG8c&$;v+P{dXE^z!NBlk%zZ z`4Asu#6^4vwK-JFA%u=7vLll2%6uw(dimhLxLf!f;^VO7_NP;Whyrjw$>&RnbG4T{ zcjn2+jgAet)qnd@=f3d&ieT|cehP0pMfUMI#>eUC=CnFZmw)STE?xTm=QtQpFWjWh zN5jLzyM}iU?-|}Zyl;49c>nN$;e)$|ckSA>d)J;_dw1>IHL`2}t^>Oc?jGK~YxnNm zdv@>Ly>Iu(?)|$D>^`_>c+ajqyZ7wbvv<$FJtKSe?>VsN;NIcAyY}whyJzp-z5Di# z?A^cjz}|!VhWG8-w|n27eS7!q+c&ar|GoqJ4vq|u>>AlUvS(!P$i9)0k^LhFMh@;D z-oI=A?)`iA@7=#||H%IR`w#3tcwqRzt^>Od>^ZRaz`g?`2lgL0aNyuUP&`QU2LXMM zY6nR|2tVc02h>^TF5VulH;#tuJHvJKBjNhgxp1BOs$Ex~cva^3JHKhdu1|dS-`TbK zo4<)dod@ie-``aDH!9LCGyK*dSvNlLGUv9C_4-%6?ZG>5JD^fm{%Pee-9Aat4gVC~ zPT%ohy|IIHQj)>@uCLY#=}R`f^yQDt&dnct*cVF!XvEI)ww{}Byl#7?w}0q{n_l+8 z4?OlyUh&G;zV4si{`$M_ed9ac`L6GN_j|tQ&_m-Blg-2LJu)>tv#_}I===ZKNw`lS zJpFM0Ju@@S_m0o_haW}57n{eHo3j&5_lCKn{K&L#E-cI~xVJPH`2lA?JGbN)n)3_I zMSc%@{Nb6VdlM<+erf4Z_ds*u=#fQ!413m3HfN7CC*7Opn+xOm(QK>7!_gy4OQgSP z&Mz)cJmL>yUi{pGpFFbAoLHJ$c(k3vuTf7l7Z=@~D$zV~WRc&)e*5^$auZ`T=V!(j z-rMwtRg)j%_Dhe>3lG1@k6<_bO!M%PHyn;1p%-sn=IOBKSGWbAZp!DoOZ8Y zm|I-DZL+E6{LGQrY3h$p-ZnQ&CF@}T?cUJprBMUO(Cqbdv$J$vBoa-RV1b`+HW#`` zryt#(^mEHg>kA)V=2yGj-E)ge{>Y-AoO|DF`(b%@p*cSBh+&#dP6Bw*!$>N)v4y$m z=B%GT0>$om^_z3%w)m0v0lM;I+^Xir^kd_&)B3i6WYC8W|3Z2$0v#savxr1=9v|fA zzyl$S=y#lGPKb9$$CvWvThxTB%SVwbm*qE5lkOSE=VssQ-umd#hv#OFOc;^<%-r0( z$;T|ef!-Dp~e3KmsWoSqMGudgQkHd^H8GB^GD^EU^^4^#T|07gex@l}25udNmkiue1bQwW2Bo|!4ena53kQn!iOGwgDb;J~{L#e!!WK)uvD_JPMC{Z>oTXgqB2>;0V zqJOvvHx`@pi8dZsm|L2gn48J@FN)?E28Hi%M{@fx*^8n~E@+F;w7CSLi%UmlgL%pM zLBqL(zA^7`hd1pu-?xA)S@+F?>8p2r%9q;EA80uWW`&v!ubE8Z%1UZ>ptKfRv-qc)r-`v7(F_IxQ{6|#XD1nV-h#ZMEFB~Eoy&8K1#Us zd3koyeV4I4Pil=AHn!1xFh?j4gRquZ)8B|<=hhNF1wQz>Yb8ECe9C>K{P7jLijpgi@2>n-x%?{cy!8h+owF~3-}>XbJKxgUU&ulG55Bm9zFZ|F z^WB}_E@(GMPWul@a?ZXgA(?OfBRp>BPJM6uw=N%PdBH#VsjWYx)H(aAgk-+E^IPS@ a6}fKzA?ME7S0yC#t((lHg}Yzn-2Vq2SYz6XV3TZQFMCzqe}NcBiXmYVb5qJyp|+GN53n zKtMnMAWSZHH3qpmF(x)3Ai6LhAe8^A9!4&9298E9E(XS4u4XRu##Z)2T3Ru#BB*uO zJ2!b3CmZPvOWl%^fQI@)?w8!PV0KxZ4+8V2X0|Cj8&OF_gb0d6fDmb#CNZEP1QH4v z8A*7krwhvHkAd2&Ynv~k_rq=#x7*BnkBfDO+hy-91XHMgXxeED!Srrafe9mx6zY6+nj+cl_-InWXo^BFAw{&QZvdw=xV0#g>!_{=! zQdaJ*Qv2>gZwDjd)Xm4^KVxfS?bow?9T`&ewDr>Qc%7GEt2)Q&@iO3UYqtHew$O3Ib^3fFX12zupt|mOx54de{t}~Rk;CUU<5k;Hd9&1Ut^bcF{sOCd zV-aaL_nE>P$yLug`*LPxdZw*hE3;=0_ACOMC%JOb0x2Fql;k;8Ff`jG=uoNPJAFMvI?BJ0!aw(}Q!@Eu0p zfW4+oyZZ+GGRvOI!qRhnj?#JM&~ zS4MhVqSSb$DxzgY+oZN-RZC*RwbqR^%I)%Ud39HCl|5(6QiQ8RDa*cwV?NtD{73bG z0hMZsV|`32UA-!Gi_{r@2bnHZc6GV*DS8%K2m1Hn-=tV6d2(e(N2bhBSxYCX{)X$W zi9G*v$<9!1{+LS47<&`UK;+edEeb^r@5I%jZcML*0ET>_oRhoNfhbE_@1=LXNKRnCq86^PXq||V@jZ**e z$Y|Mzd1{~ykW_JV18eUpM;cW`7aU+RPjrJ9+ERaAV%}b+$cljA-Ep7Zt|G3V_-*H+ zB?d^HcO^@JIr*yQ1afP(2ckR260&fNNlGG$iRy!+Ln;bPe49xk0?O5n&<1 zm>;jNR7-wvo?0Rioqy38sa9o-5C(9A(B}(?f*RJu3CZLeCE)|Ka>C{R?md|%;S|;F zjkTMqk=_H!i&04X1S~Hf&zU|%>@)q95oX4iD8~YltAUiybd$n~rQ&7<7hR#p13_MR z0kq$5gJQXl-v?+K`o2s;j9DoYk6f+55bAd{65sHYHg^aqg_aKLrnOz10bCLOORm%$ zZdRX8v~9Vh(s`CuO!VPk!}4|=wtEoZKvRr*&ib~v35`#o+&38^j;pc+60X2BZ zy)64sLF6!88Bk8bdQ?^t0D7Q$dPnHVWhI$sN$EvVPSivGLq?uy;rQt~G?%rHwh9Eh zkyIE;p8IO9F#Q=KalKWj6W^5IB&E>(#K!;C5cUjBA<*o6PCiE7<`nKp)aVWy%%X|4dbY08< zHvd5q6ZFN?`(&UUvc9zmR3tRYSBko$V6y+EJ2j8Sa$sXvK5r~m)byXzCl}{ZcL16Q zY(NJ-lTB2yBx?ryqz(Nb;`ir-t0^SDte(64M1(DMRPH<0f)aIn+<^+)3((-=xPX%Es@Ce_Trc=nS zYsM=Y6Wn$8Zx7?)GX6<2?s`vo*SW){U~Gt!W*XUy?HZCt*4FRXI;w{#5eK)LwsAXT z-}Re9a-0PX7p>Kb4=4(XXe8V+x}q;=lFl;%$n(gPHA#{R0p#k5Rd_2)hBtlp$o!1) zYM?Vr2R`te}K&BA-2xeq~+ShF*TV521ObjY?QV~Cc_niLj} zeFj+jg-r=m#|B?_n|k9~oks}?B%!!ktbxN|sq*}avb5+g?O|ZH!^4{Rmh|J*5L%x) zT%Tr!&^^~s-yRiDm(y=Y!nh6J-Lp|MD|d>&kAIeYw*7PBOG`_;{TT>A)++=Qm+EN9 zb&oT`0Phug(VE8m4;K@CMta>JtC3Vq8V#jMo*nz&p2+KdnSZym@FoVJdP59KgQGYdlWujUzd<1;Ce1UiGjZg>k>N*`6i*Hh z;PaQ&2pMV?0}dyb*DjBGWelC}beNK>f6d6RbbLceZ-Ary1qhbWn(lbdB!WFdZu48b zB2KkxemijFFWGlgE5o)jjKlA;fT(=MX0$)p{IiQyq)P&vk`ii}E z8|462{@tsgB$Y1f?T} z?Pir+N70xMrY@owUsjF>9o~8|kT~o8Uf3OIsQ{H&#y>VP_*_l!0{Ou=7xYf!>fAK4 z37^&$G<49@4YMnOl+7+;xtc9MZJAgF(?;DUJPA$hhqd^L%`N&XV(d~oR{5>Au}vEoJKH^bF$9m95D}K zLjrp5@QB*`KAbQnwvANyyIo)K^fYGi^$6BAw`sGUziZe!SKPdqcosmmmxw6?{>s^`Bks^y zU9*x=?+C(dHRQ-jdnmvC0_(FON`t%p@L+d{?3A@a`bN*3Q#Se@l0>oakJm9Kd?u{9 z1}*U_R4szVpN^9$4*pL$ijCj)l7r;Wtpku3OX_&9nE^j^Jr;{FE}Yj^oIgsu=4}f3 z^RY4@F_ylT`H7^(*M8Ta6ZyJMUVn`9yACO&_*L;fj#UeMS;KCSw^&XYA=@e1|58#@zHO_9N`J){V)tfS_fz#`TX#`cxhRiT7is@iRoLrw z6RoWqQq)IX1XmY*>{S7Dkm;kku4;o;pb3TU6n-TuV5Stj2$~-vf;xVoUv2lNwOh3*-99mM$FFcG3Cwu2#&mc$T+9|#7oUoDRgZI1@QH3-R?`wB8 zQf-mHB{1)Q*QaGY)Sg$Dm(`YYwJqL@%=w;^mqk;`@&?mY`=X}U6<*x{aCP*3pf0`UKUgvj$oexYGKR+?3`u8SB#G1(zxZ%N<))MP?oB8lbSZ+p zac2WSNf$cQaWuLBJciu)%jsJmR-JkdeiL{Cp)9iHxkwf9E8N`z4e3Y8% z8%kGvn9%u;d8PMey*F~gg?@=t%fj(fpDm8+pg7D|IG z26OT>;Vi?8Adqb*3%CV;trWMsmjxC`P35lzvh(y#+R6ahgC;k=4|@JSuF@e-V~gtY z+Q`!7A!T{mS_*Lsja|OaYAZ0ym2n|CXVd3GioTbdc@!$A^)m|FB#wE|NhieACe@f@uC9e5q+I76)_5^hNAF+fi{)6E-xn=@h}>rU zNOicw@J^*}qro95-+ItN>x7Uv7u!7WGIP-#dzE-E=~vAyS|=l?8cflp02=mIfjm{7veTF z+bPJ}jV7z>Y3Y_|jKAQx?R1rzZsKdDC8%jkNpHi`=|DpVtV~ec=JNTk_c@9`A`Y|v5G|l76SEHLjwY4h!FE;XvZeEm}g-x;Ibx>XLEk4E#x&`r|9ZyK#QZ}Q@fk! z1t)pRQ^wXEI^DX5%T}jH<*?~g=)-uW#)yYMkgbC9D+d7Y4b~eqgmAA2mpFo`C%~hL zyjkzESpz=dPYOhoRYi=$XsX&hsv@Dw_FxM3{DcAavV7z z9v35hbS~!|l_9PXQM1$sR{U-#7_$#h0qV(NM{cN^IqKf+>w|}j5?y~>hL0;;o9nSS z(g;%>B|_~@sN4Lg6m5v#L(L0QeYi`m^H`0Zu%Hm^)7Qj+)oJ0Zr^jD}<(orz@iNGM zrbuIOKmE)L;Z0W;)wg4(!)~pBREt6-!u*lh_`{m@2p-9OV;BlWm#Qr6eGom~>+GDg zHrU$@@fyH@FodO?v&7aol1Mv`;3)&z=?+;;9`d&H)6vF!)OFC3rk0>3P%5Q11G_39 zF-ARa;byBHc3y1Ob$Yn<47AffPCAn8-Ul9Tdoq{s5M6qK3wN;O<2BL1Q!5TIdYb9A zI`GK67d66;X(Tr2gYd)@?Rfbo0GlZBJYF&Lxs`4vUZxFpntuwiO9Q<0b6)kJJA2Sm z#f;NX$nTQDI5u7B?3-ft`x*jAQF-YlJSD-5nP);b^RIX_B7w)LZ$CO)dy-gfco0IG zyIcQlOI2Qdm<`n@|*V zwZ>cvwp(MN6kd;<2nImolh@M&ANcG&m$m!S#-j_I6Waqlgf#+FvTUttR)}L;+pxT- zQ{viv`Sfv-zj^5Fd7ypqmi%oE=nkOOql46=L+R3>^B@g7Sg~k#ItZ-p*^N7?iW8t-(2n=(htZ=7ZTULOA+^!`KDxWOfl|v7<~lR)YB@PiWXz zxOp0~71m_${0-dZ<;#Ect~8S<;=4*hOfnC$65nnNK?mb-rVM3^GEGDHhH0wzhcP&J zE|sC@XI&s)0|Ci#k5l%Fej!S(GP59shzY&HemGeX!DT79E}oT&^V^RaG?djedD36h zS81*b@I2W4dIUUJgKo{ML#h2vU=l?iM*o%#Gh#H8capbb47*N&!gkEowAJpX7MY`7 zB1V0i4?IWniz%Hfs9M_8K_0Uf$BqssEKyXT%~MxT5gsC4gda+lUu3{kscMcx_66S_ zA8z%eRw}A8gq9&G+#|j0J&aJG7l!mbbf7A!D5)=Z!*)c_`*SEEe)e3$WTO)8v%ku3y#ijVG4hD8;pS_u+i-P4YtYS1-;FQZ@4pJ5}`40 zbZ$>MH@>C}r9b~@kSl$@=*7~fVdRc&-zGeZ&Bzjd zujHC=Gn&Tq#9{18+4SE%vT5`i!Pt(f>A!}%mO~Xu;pJ%>4Dxz-rtdCM@o=6DPc;7vg1iTI7w5xX?P3rlOgg7vh;nDB`$C zPAF#Sm!s*mrF(4#F31zzlCuuUVn5dE2L;mKd>?wggj^D$ zWpw2Xe5(f(!Tx(+=MdRsc%4-4I(RJB<-vRRJCnQKAI#>IH+}`;4fZ%AX7BGJ`s2v-ySrVd)tNOY-~M%*ME?NkZy(p4cyr&ysVX-SdfErFT{+q~*{~OVR5WsYRrgvnXvrR0R9o=b6QE z8kbA`W7Z6Ci|y0f@Q;U;H^6k@p#Oq%ME*b;weT24gyK}x6Euk`0g`pTaFLT4&cY_& zOUMD*hjyd8j8{F+S08vYEYr{QRnSM5`-@wtNA`v0=;e;egt?0ieQs*}9>_|Lugr~_ zzuKsZ{@Q~GCKHinZe2+SM17?B4Pe~CY0j;S|Ly{LDx_LFC@!bgO*#Z-Dl#KA`C%nh9DqVhiMts`KQ}O3UIAk0p&x|SE1A!X1RcXd7j;PC49qrzZ zd$6;+I>(6Wrt;$&@aD6^bY!TO_WdDBVCgVti^$$<}QuFR$6$vtLH1I;} zZC|DegwKLSb`nc4FtcrM``f?o@dwf~8_!e0E9?$6M_r(`UkltKSHe-f?;fXr9Xm%2 zpJb1=-w1cy{jy5qkoT(%WCl5>wl5S2gSvf0>CF{Yors*kyJwymo&N5opKT2#cYHVZ z`Vz$~3pdXtm051NPU!k%fmv>ldD`Z8n)1)QcbjF?{ENYou2c-K3Z{R(zFXzZs>-4X z=A>j-6=LK!p)TN9(9sbok+4Cg(~bp`I8CYsLr7PWG!4{PYKv2n7AZ$G2ocF=pub7S3zoXDj zy1IVLNw{Qh-lvHk;vzaxQF2_^rg4ZEZPqt)M7lPk6SW=hScM1vVWL>$mUF*qmvEFW z!JzztAWKn1^7^K6JD2X~Qs0FLgM+Yg&7#^^Kx}$t$iV*heO#eeGZFTW%3xbH7&x_z zE$RM>PF@vushrLq@1{4+gXFLs`8Q3q4OOU15a-7LW)No{&_xkV^I!+e4=u)W`EeC znUzMSY48$t)eL*&8xhs`I_?@~UJXg6nUhZzEXih-6(t1R2IZc6G^2wL;w|}M8<-Hi z>z#aK#u4*eqJx0}5|8+k)TUQHdfm6r&I7lD$R?TXe}~@VsM0sAb^Qy-W~)GM=Kf<6 zyA`h*jgb&s)EaT=w-ZE=#$b3AUz~3?G7oI2nq<0LoWkR1bRZfOEUb{4Q9sCn_NNEQ zBh;-~A_lX9r}MM^1il2>bK(fcD{7)#oc8)4L4|;H?z5s>7)TSDXAw>quDh@a0JREJ zrm-PPa#`h|0X#wwjI^&sh>}VbvUKTbViGGAmWpoqM4O8mElf!+b-lFo0gst-nWn%h zV$ZnaAxWCFh}zPrbLL0hc|w6Gy2W#&o}W9>aI-_CQO|sQN|eprf(jThviH9;D@y-f zcvMS$Y)S{D4>2pbFS4>nm;2$U9=-0s;IY7uGl+}4!Ql**0uSN}2{2{{k?^9DjR)X8 zE#rHcl21(aZgj)9u2hP6)ebmr264o?o8j(+slR1R7ii6N_Z*%TP@)AiYXMzIiFNIn zO))rBsX7cWW)@8wlmP7@Enb5-5cn{8{`(v2cA2COrsE&bXkX_prWh0 z-=t!T6IV;DLP{9Zk@j4WwEVINr+cW4rfx6a6Rh-Ze5Kvc-B$R(Kb#XPn2RQUB{OFf zb#n*5bd`3^!8~MyZ$o??Rsra&Y?}>HRWkgyammuSnqrvUulGGGR1IW*>i9^qr%Am( zN0{xPL!X96m39NM9I}{@wqGNydp!}A3~=A-dM8C?Klyaf!AvHEg|0B7((xryJ%ijL z@jI_@pdXq%&z1cqp@Cpc*`nI%{E#M!jv(szZNrRVD{_he<@&?#GZxQeGJ}-Y5soeF zyII2Nxz1l!O$=L@Fw63gvwfSyLg8$U?5LJLj%vf_b0z%VE)!-b9l8N6$2)t@LcJae znC0`tl%H_>AVsR9n1hv!z}1 zcCah3nGP{VfvD)K;%w?97-z#J!gLo?R+s%1aFs80kUEzvL-SM0an^@REE$+zXvDzP zf}cz~n>!o6W|OS)i5QxUb4_(+BtTVl;Tut0Xoja77ZGhhB`uRBsn+uw`-SnMvt%Ax zy=%&*-M8uwOGC~mHSCLp%R|}RWtkXH*+Q1)@QMWC)OXf>)<_@^k0$&qvy^1A`{;nj z#G+86Ui?5vuQLycEMW8@JZQ?rqQ`5T>&J#a5KF8CtPj93B^5i;0svl32oLnof>mIh zf0CAPz3rlDlv2opRuXFJolEaNjPrgl)+0QxKo68zd4JPoLx}NM#YY6@7WtNe)wZJL z#-UmzMnGs^#j#yhNEpXkOH>UT%~=C+r~G@Zdv#JvOwLi#P2X_mEAC^d1qC0ZV&s+1 z%B@|)betYa(;pt)xD8iGYC2uLM&ng*2!Z3|Ra{Xs3FL;vbM4j*ngftt3+s)m2!c(cq7uCO298}`+#%jinHj|l^dS2r1jC*G9{zg zvLJ^aYoAN3QwQ_4T8Lk5#Ai};QIy|vq|MbbZNf(?3h)<@xH=}n-EL@E4FhBFXS$Gb3&?z#ecGw=0e!w;a$%Ec&*%ECM*(?8N@VDIdLYl=KW|vO;b^{{jofo zHc3{p`}$ttJ`Tb^1&_8H@w^cLDGQMJ6zH@ZmsUPE&Y7pSTdUtB?Z>sB;Vg|U3~N;u zE^bi8B+7)i<+a4_Vlldt4}*>~_M!*wZdsO!bG2_Z%yPk5zgk(2`P(wS+XENqZ{SoO z;V|*}q+mL0H%XIl?D^(GES(&!-qT2Dui9WbkOX}PzS@4C7t&bIt(}@#75N9Q?P9jn z8nhx*m&XoG2FO#E*nQ;BrhL!KR#mS7*xbOauxz?-i9F{;e{J_hg6@x zH)^P*r!lp#Y!PBM%3>7_Yv5XtA-CYK%Z0i8tx?Lad;7XR3Ut_8TD$ za*)kSvcK1`U5e=VZFyi3)YTdF{M?*s?z2|5G!vf_z zJHGf`$vvG2ICRWkC4Wx1@R?T?6I~f{kjv4Xm0DP@h8jARRrZ;V{VFGR=GJPfem}D7 z4PSpi(3{6?zmrFe1R`l#!kpJAO`;8I#2W%7>Q4Pv0;Q;^kZ{q`yix=uDzUzhsHJ6s zBBd+o8QCBH{EqJ3S6<@4yYB5w-|3l~tC_8-ci-d5q0(Z$xKA#gU~H0UMcqd>nQ(*9 zzG+}hFMBtAR9Rl8ulr#qyd49?wD59AB%C}59#v9nRTC6LLif+=r0;az z8-?Y<9>NqZ*xXLcNfh?t2ieZ5`hK=z6QCSJ;2t@x1u6EEOoRt&Z94PIcb*+SN3&uU zy%;%YJ!CVMQ`TNGE7qa>Pn@K7M7tBh-%Wo`bQv}4UVtKnhbMPODgnJK;5%`WT$Tjz z>q&)L$m`bEGBJN_VJLl`*6RWmzObi?)U^2Qgn_@ zom`z}%^k(&?WC%#DVk?^re>z8=KT-@W(iPi4*|-|7p}lDAU*D|(qg2wXe&U?0rD%F z)v#t^0j@7EMoA#aCv28 zjhTa0v14pMOy0rm;M=&sZ&#C735eD}8^EGZ?(B?FgM|4fg|)1A$i`!XXe|WBiY!uJ z_##%_iMjOh6~vh7wW<1`sYvnC@km`HR!ToKlz(BlaQ5L|j-23H`}mpk%U`&g_+`)Q zdJaqLvx&0|PpGhm`TC4=OD9ki>Q0d%8{Z$uW$N8xnqr3aY_?&uiYv2<_fFu1#vwD< z4pLsYFUaMKuNod5)k0*1Cnb;br&UOli($o$?#KAKPzRV=W`k7~5)C8&yGl?S z#x&8uWAoJAN_4M)>TJ_Zq@?3Anp>y4ylLkFgG;uirCkuKf}n~r`F## z!^x(-&%$9xi|?g0wGg!AoCZ?z{^H%o!R;c9RBA~hx^oC=XDi-oVSX1OBG6ozty248 zs^eY?mrG0u;VA?Ko!&_S;YX#`q$-59F=JpBJj$B})aQ#loxQ-QyGN;6cs<*(jT-p_i+{*{-WizdimNF>&roT_SG88$!FKwQV`GJW zp(LGM21k9dHXym$*I)O;Am09`Vldez!AbV+B>9RiWczeg8NjSij?jxEawpLd-yt&1 za)k;)wCJ2iZISDI5%D6LS)HOaGBrA(TQ|jO&aZlMkU--Y<51Vz;Qr0dJVI9ce4c%w zO5BbubTL&akK9D}bVVspe?avfwY!&y6^8?i7JMUIkQ zc;$U{r2`q>)<#IK_~s0g)FY?!*%B+8 zF;vO+tq=|1V^`Tc2SOML3BA;x_TSPsQuEbp!EmrZP#WydM&>Wpm;usHZh)EBrq}F&UQ}OOWazzLxPeum6U}mQ=LZp! z21rYv#C3b3Oo#GP#L^f*bcK!Uj)bLh0p82e@Cn!RtXfR$cd5gB$f1&nDZ8o+Zbfmf zMW?Ee&o6`3Tml@p&7oKaK=Wkt=N56u9C`czwz4+7$v| zhBCorfF0227UBdu%;b0kd}IEJQe~~^)!ZXIauI43^$y}i-^VPCvuAPD`Bny7w58Q* z?=OI!#1e5l*^%)Df+LEl4n8ia{D8O|`2q!5~Bnt4T#8weT<> zE#rH^Jj}e(vm%2{W9L*eBjX>wDBK=;C{d+742xeW zc+3sm_h!X8*0(+Ol&=b8AJ-HFZB+qOQiG0&ij0nghLWC;l9ZO1nyjIys!UEPfC&^( z>?1);2weo^4Ou)TfdowUhhYSQ9x>O!vyn*y~t`xnoM3mpTR2(3jHJ6eGM)bN>mqqDhqVZ%8I>_X> z?vpVMxrVRMcX`M%jHkp4lCXHP>*Zd`#=_q#=hEI$qmhQ67g3Q>k|aeRnxZUKTU1q6 zX`W?MSgNj_osp$woq4RTX_dNs9#8m22m}OX2&5{teQO}g+3pDh=m$jI-#s9aim}j^ z7gtk6B-K=8#nX}2DFb9HzLVGc`WJwLsmnW=HuwKe_Yh*|8a*~9>~ghKNGvPIws zQ4b_vl>}VRAr$h!i=5RE7bC-Twq{An1VhGPGOw@ zbW&mAp$P##mVBv26*;x(A}6qL@+Myi&)|Ja-dqOu&Fvq@|6)&#W9{HIz8GEa4#8@y z=j~?xaKwfLbz>mvEV}N1obn+kifB?hTXU>Wu^$7AYI-pdzcpJUDkwV4Bfc70=6ndId$?apIA%ef)u}PGd?9#pmy>44KfQ`00hW zz4$!V9C{sNnQR{j6BM|K7Cwaz?^nsQ|_8mLg& zd_nJin(lC^7u$er)2)G-BTD{23txI`J?^2XRRcx z@|Uo||Wki2pTveym4{3AS&SRQvb)Nxe5tZ|Z2kere0vZREw97q-?ddi&|9N%2 zZ4;a=PK^ky13!(eN&aNkJW!Z%QY5Nb1A>M5MB?fbcJO7+<{_)X8U*+PD8)F*X7=}o!lKXNUy;^^2=UgkB*E`Eyl@z_I;ftXPGcGx$y}GBnVNd)J zUfTtWDgeiMJ!8|l9d<;~UF0<>UVL_MnN`jM3Y1omx@s2)5BmCFW4vMXLTDo)+J2b^ zqj3nO5JY38NHT^&j!1Gg<=UMo4_{u1M7!y&1~Z1qSf1I5t=xLf#V?ZJtGefwer+f`M8#C zxK4^vHz?KL+kldKBGI`J^yYma*darrK#?;+4DY#cVBCJhI3q9$#xPWJN9fl*e%^p^ z!gCjqPH4gqK-OFkJ8nQACM{{-{jckqyO4AbYl<#7qHxJk{Z_Sz5530FKkVEY4jd22 z4ZiKg!H+PuZQ5umlJe_G^-aGndW~v|D_>)W46}8gU!H%Qlj!RpmpJNofcx!8mmvg- zJYqj?Cb2K)1FQpVraY(tTM{*a5ro55?DCPg zd!3bcx^4Vi94vw;LU87~O~Zu?;>xpPU*<>-E4KOSGkQ__@ux1S>PR86*Vl2_E~#t) z`BB!}EJr6#7@BXRg87-8wpVGWY zfBpYcarNJa)c-btfiQvU{^8fV%&Y29 F{{iTPgG~Sc literal 0 HcmV?d00001 diff --git a/tests/unit/test_contract/test_contract.wasm b/tests/unit/test_contract/test_contract.wasm deleted file mode 100755 index 36452bcbad674f215584c2b281d20e2577fea042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34346 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 AU;qFB literal 0 HcmV?d00001 diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index 6a78137..7a51a65 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -121,7 +121,7 @@ def test_backend_transfer_transaction_serialization(net): def test_backend_set_wasm_code_transaction_serialization(net): wasm_file = eospyo.types.load_bin_from_path( - "test_contract/test_contract.wasm" + "tests/unit/test_contract/test_contract.wasm" ) data = [ @@ -157,7 +157,7 @@ def test_backend_set_wasm_code_transaction_serialization(net): def test_backend_set_abi_transaction_serialization(net): abi_file = eospyo.types.load_dict_from_path( - "test_contract/test_contract.abi" + "tests/unit/test_contract/test_contract.abi" ) data = [ diff --git a/tests/unit/types_test.py b/tests/unit/types_test.py index 24e98c9..e008cff 100644 --- a/tests/unit/types_test.py +++ b/tests/unit/types_test.py @@ -1,8 +1,6 @@ """type tests.""" import datetime as dt -import json -from pathlib import Path import pydantic import pytest @@ -98,13 +96,13 @@ ), ( types.Wasm, - types.load_bin_from_path("test_contract/test_contract.wasm"), - types.load_bin_from_path("test_contract/bin_files/wasm_pass_bytes.bin"), + types.load_bin_from_path("tests/unit/test_contract/test_contract.zip"), + types.load_bin_from_path("tests/unit/test_contract/bin_files/wasm_pass_bytes.zip", ".bin"), ), ( types.Abi, - types.load_dict_from_path("test_contract/test_contract.abi"), - types.load_bin_from_path("test_contract/bin_files/abi_pass_bytes.bin"), + types.load_dict_from_path("tests/unit/test_contract/test_contract.abi"), + types.load_bin_from_path("tests/unit/test_contract/bin_files/abi_pass_bytes.bin"), ), ] From 328ded4eec12da7d73d61a954c546977a760f509 Mon Sep 17 00:00:00 2001 From: Faisal Bagalagel Date: Fri, 7 Oct 2022 15:11:16 -0400 Subject: [PATCH 14/14] refactor: fix transaction test for wasm --- tests/unit/transaction_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/transaction_test.py b/tests/unit/transaction_test.py index 7a51a65..d035121 100644 --- a/tests/unit/transaction_test.py +++ b/tests/unit/transaction_test.py @@ -121,7 +121,7 @@ def test_backend_transfer_transaction_serialization(net): def test_backend_set_wasm_code_transaction_serialization(net): wasm_file = eospyo.types.load_bin_from_path( - "tests/unit/test_contract/test_contract.wasm" + "tests/unit/test_contract/test_contract.zip" ) data = [