Пример #1
0
    def test_native_invoke(self):
        """
        测试向合约打钱和从合约打钱给账户,使用以及功能
        :return:
        """
        code = '5dc56b6a00527ac46a51527ac46a00c305746f5f73639c6424006a51c300c36a52527ac46a51c351c36a53527ac46a52c36a53c37c6594016c7566616a00c30766726f6d5f73639c6424006a51c300c36a54527ac46a51c351c36a53527ac46a54c36a53c37c653c006c756661006c756656c56b6a00527ac46a51527ac46a52527ac46a00c36a51c36a52c353c66b6a52527ac46a51527ac46a00527ac46c6c75665cc56b6a00527ac46a51527ac41400000000000000000000000000000000000000016a52527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a53527ac46a53c36a00c36a51c352726568ff6a54527ac4516a52c3087472616e736665726a54c351c176c9537951795572755172755279527954727552727568164f6e746f6c6f67792e4e61746976652e496e766f6b65616a55527ac46a55c3681553797374656d2e52756e74696d652e4e6f74696679616a55c3642f006a55c301019c6426000773756363656564681553797374656d2e52756e74696d652e4e6f746966796162230061066661696c6564681553797374656d2e52756e74696d652e4e6f746966796161006c75665dc56b6a00527ac46a51527ac41400000000000000000000000000000000000000016a52527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a53527ac46a00c3681b53797374656d2e52756e74696d652e436865636b5769746e6573736164c9006a00c36a53c36a51c35272651dfe6a54527ac4516a52c3087472616e736665726a54c351c176c9537951795572755172755279527954727552727568164f6e746f6c6f67792e4e61746976652e496e766f6b65616a55527ac46a55c3681553797374656d2e52756e74696d652e4e6f74696679616a55c3642f006a55c301019c6426000773756363656564681553797374656d2e52756e74696d652e4e6f746966796162230061066661696c6564681553797374656d2e52756e74696d652e4e6f746966796161006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566'
        addr = Address.address_from_vm_code(code)

        abi = '{"functions":[{"name":"Main","parameters":[{"name":"operation","type":""},{"name":"args","type":""}],"returntype":""},{"name":"to_sc","parameters":[{"name":"from_acct","type":""},{"name":"amount","type":""}],"returntype":""},{"name":"from_sc","parameters":[{"name":"to_acc","type":""},{"name":"amount","type":""}],"returntype":""},{"name":"makeState","parameters":[{"name":"fromacct","type":""},{"name":"toacct","type":""},{"name":"amount","type":""}],"returntype":""}]}'
        abi = json.loads(abi,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main',
                           abi.functions, [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
        acc1 = sdk.get_wallet_manager().get_account(
            'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve', '060708')

        print('acc: %s' % sdk.get_rpc().get_balance(acc.get_address_base58()))

        func = abi_info.get_function('to_sc')
        func.set_params_value(acc.get_address().to_byte_array(), 10)

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc, acc,
                                            20000000000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
        print('acc: %s' % sdk.get_rpc().get_balance(acc.get_address_base58()))

        print()

        func = abi_info.get_function('from_sc')
        func.set_params_value(acc.get_address().to_byte_array(), 10)

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc, acc,
                                            20000000000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
        print('acc: %s' % sdk.get_rpc().get_balance(acc.get_address_base58()))
Пример #2
0
    def test_checkwitness(self):
        """
        测试CheckWitness功能以及使用方法
        :return:
        """
        code = '59c56b6a00527ac46a51527ac46a00c304746573749c6409006a51c3652700616a00c30574657374319c640900650b006c756661006c756653c56b04746573746c75660113c56b6a00527ac401610162016353c176c96a51527ac4681653797374656d2e52756e74696d652e47657454696d65616a52527ac46a52c3681553797374656d2e52756e74696d652e4e6f74696679616a52c3a76a53527ac46a53c3539753976a53527ac46a53c300876426006a51c36a53c3c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a53c351876426006a51c36a53c3c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a53c352a26424006a51c352c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a53c3681553797374656d2e52756e74696d652e4e6f746966796151681553797374656d2e52756e74696d652e4e6f7469667961006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566'
        addr = Address.address_from_vm_code(code)

        abi = '{"functions":[{"name":"Main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"check","parameters":[{"name":"acc","type":""}],"returntype":""}]}'
        abi = json.loads(abi,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main',
                           abi.functions, [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
        acc1 = sdk.get_wallet_manager().get_account(
            'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve', '060708')
        func = abi_info.get_function('check')
        func.set_params_value(acc1.get_address().to_byte_array())

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc, acc,
                                            200000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
Пример #3
0
    def test_invoke_a_b(self):
        code_b = "59c56b6a00527ac46a51527ac46a00c308696e766f6b655f619c640b006a51c300c3656e00616a00c309696e766f6b655f61319c640e006a51c300c3650b006c756661006c756656c56b6a00527ac46a00c3026f700461726773527268174e656f2e4170702e526567697374657241707043616c6c616a51527ac46a51c3057465737431006a52527ac46a52c36c756656c56b6a00527ac46a00c3026f700461726773527268174e656f2e4170702e526567697374657241707043616c6c616a51527ac46a51c30474657374037374686a52527ac46a52c3681553797374656d2e52756e74696d652e4e6f7469667961006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566"
        code_a = "59c56b6a00527ac46a51527ac46a00c304746573749c6409006a51c3652700616a00c30574657374319c640900650b006c756661006c756653c56b04746573746c756654c56b6a00527ac46a00c3681553797374656d2e52756e74696d652e4e6f7469667961006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566"
        abi_b = '{"functions":[{"name":"main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"invoke_a","parameters":[{"name":"addr","type":""}],"returntype":""},{"name":"invoke_a1","parameters":[{"name":"addr","type":""}],"returntype":""},{"name":"makeState","parameters":[{"name":"fromacct","type":""},{"name":"toacct","type":""},{"name":"amount","type":""}],"returntype":""}]}'
        abi_a = '{"functions":[{"name":"main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"test","parameters":[{"name":"args","type":""}],"returntype":""},{"name":"test1","parameters":[{"name":"","type":""}],"returntype":""}]}'

        addr_b = Address.address_from_vm_code(code_b)
        addr_a = Address.address_from_vm_code(code_a)

        abi_b = json.loads(abi_b)
        abi_info_b = AbiInfo('0x' + addr_b.to_reverse_hex_str(), 'main',
                             abi_b['functions'], [])

        abi_a = json.loads(abi_a)
        abi_info_a = AbiInfo('0x' + addr_a.to_reverse_hex_str(), 'main',
                             abi_a['functions'], [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')

        func = abi_info_b.get_function('invoke_a')
        func.set_params_value((addr_a.to_reverse_hex_str(), ))

        res = sdk.neo_vm().send_transaction(addr_b.to_array(), acc, acc,
                                            200000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
Пример #4
0
    def test_input_list(self):
        code = '59c56b6a00527ac46a51527ac451681553797374656d2e52756e74696d652e4e6f74696679616a00c305746f5f73639c64270052681553797374656d2e52756e74696d652e4e6f74696679616a51c300c3650b006c756661006c756660c56b6a00527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a51527ac41400000000000000000000000000000000000000016a52527ac46a00c3681b53797374656d2e52756e74696d652e436865636b5769746e6573736163200000681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a00c36a51c35a53c176c96a53527ac4516a52c3087472616e736665726a53c351c176c9537951795572755172755279527954727552727568164f6e746f6c6f67792e4e61746976652e496e766f6b65616a54527ac46a54c3681553797374656d2e52756e74696d652e4e6f74696679616a54c36439006a54c301019c643000107472616e736665722073756363656564681553797374656d2e52756e74696d652e4e6f7469667961516c7566610f7472616e73666572206661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c7566006c7566'
        addr = Address.address_from_vm_code(code)

        abi = '{"functions":[{"name":"Main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"test","parameters":[{"name":"arr","type":""}],"returntype":""}]}'
        abi = json.loads(abi,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main',
                           abi.functions, [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
        acc1 = sdk.get_wallet_manager().get_account(
            'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve', '060708')
        func = abi_info.get_function('test')
        func.set_params_value([[
            acc.get_address().to_byte_array(),
            acc.get_address().to_byte_array(), 3
        ],
                               [
                                   acc.get_address().to_byte_array(),
                                   acc.get_address().to_byte_array(), 1
                               ]])

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc1, acc1,
                                            200000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
Пример #5
0
    def test_domain(self):
        """

        :return:
        """
        code = '012cc56b6a00527ac46a51527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a52527ac46a00c30872656769737465729c647a006a51c300c36a53527ac46a51c351c36a54527ac46a53c3681b53797374656d2e52756e74696d652e436865636b5769746e657373616410006a53c36a54c37c65ac0b6c75666114436865636b5769746e657373206661696c656421681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a00c30473656c6c9c6488006a51c300c36a53527ac46a51c351c36a54527ac46a51c352c36a55527ac46a53c3681b53797374656d2e52756e74696d652e436865636b5769746e657373616414006a53c36a54c36a55c3527265bb096c75666114436865636b5769746e657373206661696c656421681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a00c30571756572799c6416006a51c300c36a54527ac46a54c365f2086c7566616a00c3036275799c6488006a51c300c36a53527ac46a51c351c36a54527ac46a51c352c36a55527ac46a53c3681b53797374656d2e52756e74696d652e436865636b5769746e657373616414006a53c36a54c36a55c352726571056c75666114436865636b5769746e657373206661696c656421681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a00c304646f6e659c647a006a51c300c36a53527ac46a51c351c36a54527ac46a53c3681b53797374656d2e52756e74696d652e436865636b5769746e657373616410006a53c36a54c37c65a6006c75666114436865636b5769746e657373206661696c656421681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a00c3087472616e736665729c6428006a51c300c36a56527ac46a51c351c36a57527ac46a56c36a52c36a57c35272651f036c7566611a4e6f74206120737570706f72746564206f7065726174696f6e21681553797374656d2e52756e74696d652e4e6f7469667961516c7566011cc56b6a00527ac46a51527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a52527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a53527ac41400000000000000000000000000000000000000016a54527ac46a52c36a51c37c681253797374656d2e53746f726167652e476574616a55527ac46a55c36a53c39e642b000b6e6f7420696e2073656c6c681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a52c30f4f726967696e616c5f4f776e65725f6a51c37e7c681253797374656d2e53746f726167652e476574616a56527ac46a56c36a00c39e642900096e6f74206f776e6572681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a52c30650726963655f6a51c37e7c681253797374656d2e53746f726167652e476574616a57527ac46a53c36a00c36a57c353c176c96a58527ac4516a54c3087472616e736665726a58c351c176c9537951795572755172755279527954727552727568164f6e746f6c6f67792e4e61746976652e496e766f6b65616a59527ac46a59c364f7006a59c301019c64ee006a52c30354505f6a51c37e7c681253797374656d2e53746f726167652e476574616a5a527ac46a52c36a51c36a5ac35272681253797374656d2e53746f726167652e507574616a52c30354505f6a51c37e7c681553797374656d2e53746f726167652e44656c657465616a52c30650726963655f6a51c37e7c681553797374656d2e53746f726167652e44656c657465616a52c30f4f726967696e616c5f4f776e65725f6a51c37e7c681553797374656d2e53746f726167652e44656c657465610d646f6e65207375636365656421681553797374656d2e52756e74696d652e4e6f7469667961516c7566610f7472616e73666572206661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c7566006c75660111c56b6a00527ac46a51527ac46a52527ac41400000000000000000000000000000000000000016a53527ac46a00c3681b53797374656d2e52756e74696d652e436865636b5769746e6573736164e2006a00c36a51c36a52c353c176c96a54527ac4516a53c3087472616e736665726a54c351c176c9537951795572755172755279527954727552727568164f6e746f6c6f67792e4e61746976652e496e766f6b65616a55527ac46a55c3681553797374656d2e52756e74696d652e4e6f74696679616a55c36439006a55c301019c643000107472616e736665722073756363656564681553797374656d2e52756e74696d652e4e6f7469667961516c7566610f7472616e73666572206661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c75666234006113636865636b5769746e657373206661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c756661006c75660123c56b6a00527ac46a51527ac46a52527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a53527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a54527ac46a53c36a51c37c681253797374656d2e53746f726167652e476574616a55527ac46a55c36a54c39e6430001075726c206e6f7420696e2073616c6521681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a53c30354505f6a51c37e7c681253797374656d2e53746f726167652e476574616a56527ac46a53c30650726963655f6a51c37e7c681253797374656d2e53746f726167652e476574616a57527ac46a56c3630b016a52c36a57c3a264c2006a00c36a54c36a52c35272656efd6484006a53c30354505f6a51c37e6a00c35272681253797374656d2e53746f726167652e507574616a52c36a57c3a0642b006a53c30650726963655f6a51c37e6a52c35272681253797374656d2e53746f726167652e50757461610c627579207375636365656421681553797374656d2e52756e74696d652e4e6f7469667961516c7566610f5472616e73666572204661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c756661215072696365206973206c6f776572207468616e2063757272656e74207072696365681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a52c36a57c3a1644100215072696365206973206c6f776572207468616e2063757272656e74207072696365681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a54c36a00c36a57c352726526fc647c006a53c30354505f6a51c37e6a00c35272681253797374656d2e53746f726167652e507574616a53c30650726963655f6a51c37e6a52c35272681253797374656d2e53746f726167652e507574610f726566756e64207375636365656421681553797374656d2e52756e74696d652e4e6f7469667961516c7566610d726566756e64206661696c6564681553797374656d2e52756e74696d652e4e6f7469667961006c7566006c756657c56b6a00527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a51527ac46a51c36a00c37c681253797374656d2e53746f726167652e476574616a52527ac4096f776e6572206973206a52c37e681553797374656d2e52756e74696d652e4e6f74696679616a52c36c756660c56b6a00527ac46a51527ac46a52527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a53527ac4682d53797374656d2e457865637574696f6e456e67696e652e476574457865637574696e6753637269707448617368616a54527ac46a53c36a51c37c681253797374656d2e53746f726167652e476574616a55527ac46a55c36a00c39c64a6006a53c30f4f726967696e616c5f4f776e65725f6a51c37e6a00c35272681253797374656d2e53746f726167652e507574616a53c30650726963655f6a51c37e6a52c35272681253797374656d2e53746f726167652e507574616a53c36a51c36a54c35272681253797374656d2e53746f726167652e507574610d73656c6c207375636365656421681553797374656d2e52756e74696d652e4e6f7469667961516c7566610b4e6f742061206f776e6572681553797374656d2e52756e74696d652e4e6f7469667961006c75665bc56b6a00527ac46a51527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a52527ac46a52c36a51c37c681253797374656d2e53746f726167652e476574616351006a52c36a51c36a00c35272681253797374656d2e53746f726167652e50757461117265676973746572207375636365656421681553797374656d2e52756e74696d652e4e6f7469667961516c75666113616c7265616479207265676973746572656421681553797374656d2e52756e74696d652e4e6f7469667961006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566'
        addr = Address.address_from_vm_code(code)

        abi = '{"functions":[{"name":"main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"to_sc","parameters":[{"name":"acc","type":""},{"name":"acc1","type":""}],"returntype":""}]}'
        abi = json.loads(abi,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main',
                           abi.functions, [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
        acc1 = sdk.get_wallet_manager().get_account(
            'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve', '060708')
        func = abi_info.get_function('buy')
        func.set_params_value(acc1.get_address().to_byte_array(), 'zou', 2)

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc1, acc1,
                                            200000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
 def __send_init(self,
                 acct: Account,
                 payer_acct: Account,
                 gas_limit: int,
                 gas_price: int,
                 pre_exec=False):
     if self.contract_addr is None or self.contract_addr == "":
         raise Exception("null code_address")
     abi = json.loads(self.nep5_abi,
                      object_hook=lambda d: namedtuple('X', d.keys())
                      (*d.values()))
     abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events)
     func = abi_info.get_function("init")
     if pre_exec:
         params = BuildParams.serialize_abi_function(func)
         unix_time_now = int(time())
         tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit,
                          bytearray(), params, bytearray(), [], bytearray())
         if acct is not None:
             self.__sdk.sign_transaction(tx, acct)
         obj = self.__sdk.rpc.send_raw_transaction_pre_exec(tx)
         if int(obj["Result"]) is not 1:
             raise Exception("send_raw_transaction PreExec error:", obj)
         return obj["Gas"]
     if acct is None or payer_acct is None:
         raise Exception("acct or payer_acct should not be None")
     return self.__sdk.neo_vm().send_transaction(
         bytearray(self.contract_addr), acct, payer_acct, gas_limit,
         gas_price, func, pre_exec)
 def test_init(self):
     abi = json.loads(abi_str)
     abi_info = AbiInfo(abi['hash'], abi['entrypoint'], abi['functions'], abi['events'])
     func = abi_info.get_function("init")
     contract_address = bytearray.fromhex("bc9795db0abe9d2d9ea565286a237dbf6b407165")
     contract_address.reverse()
     res = sdk.neo_vm().send_transaction(contract_address, acc, acc, 20000, 0, func, False)
     time.sleep(6)
     print(sdk.rpc.get_smart_contract_event_by_tx_hash(res))
Пример #8
0
 def test_get_function(self):
     str_abi = '{"hash":"0x362cb5608b3eca61d4846591ebb49688900fedd0","entrypoint":"Main","functions":' \
               '[{"name":"Main","parameters":[{"name":"operation","type":"String"},{"name":"args",' \
               '"type":"Array"}],"returntype":"Any"},{"name":"Hello","parameters":[{"name":"msg",' \
               '"type":"String"}],"returntype":"Void"}],"events":[]}'
     dict_abi = json.loads(str_abi)
     abi_info = AbiInfo(dict_abi['hash'], dict_abi['entrypoint'], dict_abi['functions'], dict_abi['events'])
     func_name = 'Hello'
     func = abi_info.get_function(func_name)
     self.assertEqual(func_name, func.name)
 def test_invoke_transaction(self):
     sdk.set_rpc(rpc_address)
     code = '54c56b6c766b00527ac46c766b51527ac4616c766b00c36c766b52527ac46c766b52c30548656c6c6f87630600621a' \
            '006c766b51c300c36165230061516c766b53527ac4620e00006c766b53527ac46203006c766b53c3616c756651c56b' \
            '6c766b00527ac46151c576006c766b00c3c461681553797374656d2e52756e74696d652e4e6f7469667961616c7566'
     abi_str = '{"hash":"0x362cb5608b3eca61d4846591ebb49688900fedd0","entrypoint":"Main","functions":[{' \
               '"name":"Main","parameters":[{"name":"operation","type":"String"},{"name":"args","type":"Array"}],' \
               '"returntype":"Any"},{"name":"Hello","parameters":[{"name":"msg","type":"String"}],' \
               '"returntype":"Void"}],"events":[]} '
     abi = json.loads(abi_str)
     abi_info = AbiInfo(abi['hash'], abi['entrypoint'], abi['functions'], abi['events'])
     func = abi_info.get_function("Main")
     func.set_params_value(("Hello", "args"))
     contract_address = Address.address_from_vm_code(code).to_array()
     res = sdk.neo_vm().send_transaction(contract_address, None, None, 0, 0, func, True)
     self.assertEqual(res, '00')
     func = abi_info.get_function("Hello")
     func.set_params_value(("value",))
     res = sdk.neo_vm().send_transaction(contract_address, None, None, 0, 0, func, True)
     self.assertEqual(res, '01')
Пример #10
0
 def make_commit(self, issuerOntid: str, subjectOntid: str, claimId: str, payer: str,
                 gas_limit: int, gas_price: int):
     # TODO
     abi = json.loads(self.abi, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
     abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events)
     func = abi_info.get_function("Commit")
     func.set_params_value(bytes(claimId.encode()), bytes(issuerOntid.encode()), bytes(subjectOntid.encode()))
     params = BuildParams.serialize_abi_function(func)
     unix_time_now = int(time())
     return Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, Address.b58decode(payer), params, bytearray(),
                        [], bytearray())
Пример #11
0
 def get_function(params: dict, function_name: str, abi_info: AbiInfo):
     if function_name == '':
         raise PunicaException(PunicaError.other_error('function_name should not be nil'))
     params = Invoke.params_normalize(params)
     abi_function = abi_info.get_function(function_name)
     if len(abi_function.parameters) == 0:
         pass
     elif len(abi_function.parameters) == 1:
         abi_function.set_params_value((params,))
     elif len(abi_function.parameters) == len(params):
         abi_function.set_params_value(tuple(params))
     return abi_function
Пример #12
0
def build_params():
    abi = AbiInfo(nep5abi['hash'], nep5abi['entrypoint'], nep5abi["functions"])
    # func = abi.get_function("Transfer")
    # func = abi.get_function("BalanceOf")
    func = abi.get_function("balanceOf")
    # func = abi.get_function("deploy")
    # func.set_params_value((acct1.get_address().to_array(), acct2.get_address().to_array(), 19 * 10000000))
    # add = acct1.get_address().to_reverse_hex_str()
    func.set_params_value(
        (Address.b58decode('AHX1wzvdw9Yipk7E9MuLY4GGX4Ym9tHeDe').to_array(), ))
    params = BuildParams.serialize_abi_function(func)
    params += bytearray([0x67])
    return params
Пример #13
0
    def test_no_param(self):
        code = '57c56b6a00527ac46a51527ac46a00c304746573749c640900650b006c756661006c756653c56b06726573756c746c7566'
        addr = Address.address_from_vm_code(code)

        abi = '{"functions":[{"name":"Main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"test","parameters":[{"name":"","type":""}],"returntype":""}]}'
        abi = json.loads(abi,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main',
                           abi.functions, [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
        func = abi_info.get_function('test')
        func.set_params_value()

        res = sdk.neo_vm().send_transaction(addr.to_byte_array(), acc, acc,
                                            200000000, 500, func, True)
        print(bytes.fromhex(res).decode())
Пример #14
0
    def test_use_hash(self):
        code = '59c56b6a00527ac46a51527ac46a00c304746573749c6409006a51c3652700616a00c30574657374319c640900650b006c756661006c756653c56b04746573746c75660116c56b6a00527ac401610162016353c176c96a51527ac4681653797374656d2e52756e74696d652e47657454696d65616a52527ac4526a53527ac4556a54527ac46a53c36a54c3966a55527ac46a55c3681553797374656d2e52756e74696d652e4e6f74696679616a52c36a56527ac46a56c353976a56527ac46a56c300876426006a51c36a56c3c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a56c351876426006a51c36a56c3c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a56c3529c6424006a51c352c3681553797374656d2e52756e74696d652e4e6f7469667961006c7566616a56c3681553797374656d2e52756e74696d652e4e6f746966796151681553797374656d2e52756e74696d652e4e6f7469667961006c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566'
        abi = '{"functions":[{"name":"main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"test","parameters":[{"name":"args","type":""}],"returntype":""},{"name":"test1","parameters":[{"name":"","type":""}],"returntype":""}]}'

        addr = Address.address_from_vm_code(code)
        abi = json.loads(abi)
        abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'main',
                           abi['functions'], [])

        acc = sdk.get_wallet_manager().get_account(
            'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')

        func = abi_info.get_function('test')
        func.set_params_value((addr.to_reverse_hex_str(), ))

        res = sdk.neo_vm().send_transaction(addr.to_array(), acc, acc,
                                            200000000, 500, func, False)

        json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
        while json_res is None:
            json_res = sdk.get_rpc().get_smart_contract_event_by_tx_hash(res)
            time.sleep(1)
        print(json_res)
        print(res)
Пример #15
0
def invoke(sdk, m, function_name=None):
    func_maps = {}
    for i in dict(m["function"]).values():
        if function_name is not None:
            if i["function_name"] not in function_name:
                continue
        func_map = {}
        param_list = []
        func_map["function_name"] = i["function_name"]
        func_map["pre_exec"] = i["pre_exec"]
        try:
            if type(i["function_param"]) is dict:
                for value in dict(i["function_param"]).values():
                    if type(value) is list:
                        p_temp = []
                        for v in list(value):
                            p_temp.append(v)
                        param_list.append(p_temp)
                    else:
                        param_list.append(value)
            elif type(i["function_param"]) is list:
                temp_list = []
                for para in list(i["function_param"]):
                    if type(para) is dict:
                        temp_list2 = []
                        for para2 in dict(para).values():
                            temp_list2.append(para2)
                        temp_list.append(temp_list2)
                    else:
                        temp_list.append(para)
                param_list.append(temp_list)
            func_map["param_list"] = param_list
        except Exception as e:
            pass
        if not i["pre_exec"]:
            try:
                func_map["signers"] = i["signers"]
            except AttributeError as e:
                func_map["signers"] = None
        func_maps[i["function_name"]] = func_map
    with open(str(m["abi_path"]), "r") as f:
        abi = json.loads(f.read())
        abi_info = AbiInfo(abi['hash'], abi['entrypoint'], abi['functions'],
                           abi['events'])
        code_address = str(abi['hash'])
        if code_address.startswith('0x'):
            code_address = code_address.replace('0x', '')
        contract_address = bytearray.fromhex(code_address)
        m["contract_address"] = contract_address.hex()
        contract_address.reverse()
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        payer = sdk.wallet_manager.get_account(m["payer_address"],
                                               m["payer_password"])
        func_l = []
        no = 0
        for func_map in func_maps.values():
            if function_name is not None:
                if func_map["function_name"] not in function_name:
                    continue
            func = abi_info.get_function(func_map["function_name"])
            func_map["return_type"] = func.return_type
            l = []
            l.append(no)
            no = no + 1
            l.append(func_map["function_name"])
            l.append(func_map["pre_exec"])
            # 用来放参数
            temp_l, params = convert_params(func, func_map)
            l.append(temp_l[:len(temp_l) - 1])
            if params is None:
                l.append("failed")
                func_l.append(l)
                continue
            try:
                print("")
                print("invoking, please waiting ...")
                print("method: " + func_map["function_name"])
                if func_map["pre_exec"]:
                    res = send_transaction(sdk, contract_address, None, None,
                                           0, 0, params, True)
                    if res["error"] != 0:
                        print(res["desc"])
                        l.append(res["desc"])
                    else:
                        if res["result"]["Result"] is None or res["result"][
                                "Result"] == "":
                            print("res:", res["result"]["Result"])
                            l.append("")
                        else:
                            if func_map["return_type"] == "Integer":
                                value = bytearray.fromhex(
                                    res["result"]["Result"])
                                value.reverse()
                                print("res:", int(value.hex(), 16))
                                l.append(int(value.hex(), 16))
                            elif func_map["return_type"] == "ByteArray":
                                print("res:", (bytearray.fromhex(
                                    res["result"]["Result"])))
                                l.append(res["result"]["Result"])
                            else:
                                print("res:", (bytearray.fromhex(
                                    res["result"]["Result"])).decode('utf-8'))
                                l.append((bytearray.fromhex(
                                    res["result"]["Result"])).decode('utf-8'))
                else:
                    txhash, err = handle_tx(contract_address, func_map, params,
                                            payer, m, sdk)
                    if txhash == "":
                        l.append(err)
                    else:
                        for i in range(10):
                            time2.sleep(1)
                            event = sdk.rpc.get_smart_contract_event_by_tx_hash(
                                txhash)
                            if event is not None:
                                print("txhash:", txhash)
                                print("event:", event)
                                break
                        l.append(txhash)
            except Exception as e:
                print("Error:", e)
                l.append(e)
            func_l.append(l)
        save_file(m, "", func_l)
Пример #16
0
def execute(m:[], function_name=None):
    sdk = OntologySdk()
    sdk.set_rpc(m["rpc_address"])
    if m["func"] is "migrate":
        # 判断是否已经部署
        code = sdk.rpc.get_smart_contract(m["contract_address"])
        if code != "unknow contract":
            print("contract have been deployed")
            print("contract_address:", m["contract_address"])
            return
        need_storage = False
        if m["need_storage"] is 'true':
            need_storage = True
        tx = sdk.neo_vm().make_deploy_transaction(m["code"], need_storage, m["name"], m["code_version"], m["author"]
                                                  , m["email"], m["desp"], m["payer_address"], m["gas_limit"],
                                                  m["gas_price"])
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        acct = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"])
        sdk.sign_transaction(tx, acct)
        sdk.set_rpc(m["rpc_address"])
        try:
            print("deploying,please waiting ...")
            res = sdk.rpc.send_raw_transaction(tx)
            print("txhash:", res)
            for i in range(10):
                time.sleep(1)
                res = sdk.rpc.get_smart_contract(m["contract_address"])
                if res == "unknow contract" or res == "":
                    continue
                else:
                    print("deploy success")
                    save_file(m, "success")
                    return
            print("deployed failed")
            save_file(m, "deployed failed")
        except Exception as e:
            print(e)
            save_file(m, e)

    elif m["func"] is "invoke":
        func_maps = {}
        for i in list(m["function"]):
            func_map = {}
            param_list = []
            func_map["function_name"] = i.function_name
            func_map["pre_exec"] = i.pre_exec
            try:
                for j in list(i.function_param):
                    param_list.append(j)
                func_map["param_list"] = param_list
            except Exception as e:
                pass
            if not i.pre_exec:
                try:
                    func_map["signers"] = i.signers
                except AttributeError as e:
                    func_map["signers"] = None
            func_maps[i.function_name] = func_map
        with open(str(m["abi_path"]), "r") as f:
            abi = json.loads(f.read(), object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
            abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events)
            contract_address = bytearray.fromhex(str(abi.hash)[2:])
            m["contract_address"] = contract_address.hex()
            contract_address.reverse()
            sdk.wallet_manager.open_wallet(m["wallet_file_path"])
            payer = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"])
            func_l = []
            no = 0
            for func_map in func_maps.values():
                if function_name is not None:
                    if function_name != func_map["function_name"]:
                        continue
                func = abi_info.get_function(func_map["function_name"])
                func_map["return_type"] = func.return_type
                params = []
                l = []
                l.append(no)
                no = no + 1
                l.append(func_map["function_name"])
                l.append(func_map["pre_exec"])
                temp_l = ""  # 用来放参数
                for i in range(len(func_map["param_list"])):
                    temp_l = ""
                    if type(func_map["param_list"][i]) is int:
                        temp_l += str(func_map["param_list"][i]) + ":"
                    else:
                        temp_l += func_map["param_list"][i] + ":"
                    if func.parameters[i].type == "String":
                        params.append(str(func_map["param_list"][i]))
                    if func.parameters[i].type == "ByteArray":
                        if func_map["param_list"][i].startswith("A"):
                            params.append(Address.b58decode(func_map["param_list"][i], False).to_array())
                        else:
                            params.append(bytearray(func_map["param_list"][i].encode()))
                    if func.parameters[i].type == "Integer":
                        params.append(func_map["param_list"][i])
                l.append(temp_l[:len(temp_l) - 1])
                if len(params) == 1:
                    func.set_params_value(params[0])
                elif len(params) == 2:
                    func.set_params_value(params[0], params[1])
                elif len(params) == 3:
                    func.set_params_value(params[0], params[1], params[2])
                elif len(params) == 4:
                    func.set_params_value(params[0], params[1], params[2], params[3])
                elif len(params) == 5:
                    func.set_params_value(params[0], params[1], params[2], params[3], params[4])
                elif len(params) == 6:
                    func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5])
                elif len(params) == 7:
                    func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5], params[6])

                try:
                    print("")
                    print("invoking, please waiting ...")
                    print("method: " + func_map["function_name"])
                    if func_map["pre_exec"]:
                        res = sdk.neo_vm().send_transaction(contract_address, None, None, 0,
                                                            0, func, True)
                        if res["error"] != 0:
                            print(res["desc"])
                            l.append(res["desc"])
                        else:
                            if res["result"]["Result"] == None or res["result"]["Result"] == "":
                                print("res:", res["result"]["Result"])
                                l.append("")
                            else:
                                if func_map["return_type"] == "Integer":
                                    value = bytearray.fromhex(res["result"]["Result"])
                                    value.reverse()
                                    print("res:", int(value.hex(), 16))
                                    l.append(int(value.hex(), 16))
                                else:
                                    print("res:", (bytearray.fromhex(res["result"]["Result"])).decode('utf-8'))
                                    l.append((bytearray.fromhex(res["result"]["Result"])).decode('utf-8'))
                    else:
                        res = ""
                        if func_map["signers"] != None:
                            wm = WalletManager()
                            wm.open_wallet(func_map["signers"].signer.walletpath)
                            signer = wm.get_account(func_map["signers"].signer.address,
                                                                    func_map["signers"].signer.password)
                            print(wm.wallet_in_mem.accounts[0].address)
                            print(signer)
                            res = sdk.neo_vm().send_transaction(contract_address, signer, payer, m["gas_limit"],
                                                                m["gas_price"], func, False)
                        else:
                            res = sdk.neo_vm().send_transaction(contract_address, payer, payer, m["gas_limit"],
                                                                m["gas_price"], func, False)
                        for i in range(10):
                            time.sleep(1)
                            event = sdk.rpc.get_smart_contract_event_by_tx_hash(res)
                            if event != None:
                                print("txhash:", res)
                                print("event:", event)
                                break
                        l.append(res)
                except Exception as e:
                    print("Error:", e)
                    l.append(e)
                func_l.append(l)
            save_file(m, "", func_l)
    else:
        print("only support migrate and invoke")
Пример #17
0
class Oep4(object):
    def __init__(self, sdk):
        self.__sdk = sdk
        self.__contract_address = bytearray()
        self.__oep4_abi = {
            "contractHash": "85848b5ec3b15617e396bdd62cb49575738dd413",
            "abi": {
                "functions": [{
                    "name":
                    "Main",
                    "parameters": [{
                        "name": "operation",
                        "type": ""
                    }, {
                        "name": "args",
                        "type": ""
                    }],
                    "returntype":
                    ""
                }, {
                    "name": "init",
                    "parameters": [{
                        "name": "",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name": "name",
                    "parameters": [{
                        "name": "",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name": "symbol",
                    "parameters": [{
                        "name": "",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name": "decimals",
                    "parameters": [{
                        "name": "",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name": "totalSupply",
                    "parameters": [{
                        "name": "",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name": "balanceOf",
                    "parameters": [{
                        "name": "account",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name":
                    "transfer",
                    "parameters": [{
                        "name": "from_acct",
                        "type": ""
                    }, {
                        "name": "to_acct",
                        "type": ""
                    }, {
                        "name": "amount",
                        "type": ""
                    }],
                    "returntype":
                    ""
                }, {
                    "name": "transferMulti",
                    "parameters": [{
                        "name": "args",
                        "type": ""
                    }],
                    "returntype": ""
                }, {
                    "name":
                    "approve",
                    "parameters": [{
                        "name": "owner",
                        "type": ""
                    }, {
                        "name": "spender",
                        "type": ""
                    }, {
                        "name": "amount",
                        "type": ""
                    }],
                    "returntype":
                    ""
                }, {
                    "name":
                    "transferFrom",
                    "parameters": [{
                        "name": "spender",
                        "type": ""
                    }, {
                        "name": "from_acct",
                        "type": ""
                    }, {
                        "name": "to_acct",
                        "type": ""
                    }, {
                        "name": "amount",
                        "type": ""
                    }],
                    "returntype":
                    ""
                }, {
                    "name":
                    "allowance",
                    "parameters": [{
                        "name": "owner",
                        "type": ""
                    }, {
                        "name": "spender",
                        "type": ""
                    }],
                    "returntype":
                    ""
                }]
            }
        }

        self.__update_abi_info()

    def set_contract_address(self, contract_address: str or bytearray
                             or bytes):
        if len(contract_address) == 20:
            if isinstance(contract_address, bytes):
                self.__contract_address = bytearray(contract_address)
                self.__update_abi_info()
            elif isinstance(contract_address, bytearray):
                self.__contract_address = contract_address
                self.__update_abi_info()
            else:
                raise SDKException(
                    ErrorCode.param_err(
                        'the data type of the contract address unsupported.'))
        elif isinstance(contract_address, str) and len(contract_address) == 40:
            self.__contract_address = bytearray(
                binascii.a2b_hex(contract_address))
            self.__contract_address.reverse()
            self.__update_abi_info()
        else:
            raise SDKException(
                ErrorCode.param_err(
                    'the length of contract address should be 20 bytes.'))

    def __update_abi_info(self):
        entry_point = self.__oep4_abi.get('entrypoint', '')
        functions = self.__oep4_abi['abi']['functions']
        events = self.__oep4_abi.get('events', list())
        self.__abi_info = AbiInfo(self.get_contract_address(is_hex=True),
                                  entry_point, functions, events)

    def __get_token_setting(self, func_name: str) -> str:
        func = self.__abi_info.get_function(func_name)
        res = self.__sdk.neo_vm().send_transaction(self.__contract_address,
                                                   None, None, 0, 0, func,
                                                   True)
        return res

    @staticmethod
    def __b58_address_check(b58_address):
        if not isinstance(b58_address, str):
            raise SDKException(
                ErrorCode.param_err(
                    'the data type of base58 encode address should be the string.'
                ))
        if len(b58_address) != 34:
            raise SDKException(
                ErrorCode.param_err(
                    'the length of base58 encode address should be 34 bytes.'))

    def get_contract_address(self, is_hex: bool = True) -> str or bytearray:
        if is_hex:
            array_address = self.__contract_address.copy()
            array_address.reverse()
            return binascii.b2a_hex(array_address).decode('ascii')
        else:
            return self.__contract_address

    def get_abi(self) -> dict:
        return self.__oep4_abi

    def get_name(self) -> str:
        """
        This interface is used to call the Name method in ope4
        that return the name of an oep4 token.

        :return: the string name of the oep4 token.
        """
        name = self.__get_token_setting('name')
        return bytes.fromhex(name).decode()

    def get_symbol(self) -> str:
        """
        This interface is used to call the Symbol method in ope4
        that return the symbol of an oep4 token.

        :return: a short string symbol of the oep4 token
        """
        get_symbol = self.__get_token_setting('symbol')
        return bytes.fromhex(get_symbol).decode()

    def get_decimal(self) -> int:
        """
        This interface is used to call the Decimal method in ope4
        that return the number of decimals used by the oep4 token.

        :return: the number of decimals used by the oep4 token.
        """
        decimals = self.__get_token_setting('decimals')
        return int(decimals[:2], 16)

    def init(self, acct: Account, payer_acct: Account, gas_limit: int,
             gas_price: int) -> str:
        """
        This interface is used to call the TotalSupply method in ope4
        that initialize smart contract parameter.

        :param acct: an Account class that used to sign the transaction.
        :param payer_acct: an Account class that used to pay for the transaction.
        :param gas_limit: an int value that indicate the gas limit.
        :param gas_price: an int value that indicate the gas price.
        :return: the hexadecimal transaction hash value.
        """
        func = self.__abi_info.get_function('init')
        tx_hash = self.__sdk.neo_vm().send_transaction(self.__contract_address,
                                                       acct, payer_acct,
                                                       gas_limit, gas_price,
                                                       func, False)
        return tx_hash

    def get_total_supply(self) -> int:
        """
        This interface is used to call the TotalSupply method in ope4
        that return the total supply of the oep4 token.

        :return: the total supply of the oep4 token.
        """
        total_supply = self.__get_token_setting('totalSupply')
        array = bytearray(binascii.a2b_hex(total_supply.encode('ascii')))
        array.reverse()
        try:
            supply = int(binascii.b2a_hex(array).decode('ascii'), 16)
        except ValueError:
            supply = 0
        return supply

    def balance_of(self, b58_address: str) -> int:
        """
        This interface is used to call the BalanceOf method in ope4
        that query the ope4 token balance of the given base58 encode address.

        :param b58_address: the base58 encode address.
        :return: the oep4 token balance of the base58 encode address.
        """
        func = self.__abi_info.get_function('balanceOf')
        Oep4.__b58_address_check(b58_address)
        address = Address.b58decode(b58_address).to_array()
        func.set_params_value((address, ))
        balance = self.__sdk.neo_vm().send_transaction(self.__contract_address,
                                                       None, None, 0, 0, func,
                                                       True)
        array = bytearray(binascii.a2b_hex(balance.encode('ascii')))
        array.reverse()
        try:
            balance = int(binascii.b2a_hex(array).decode('ascii'), 16)
        except ValueError:
            balance = 0
        return balance

    def transfer(self, from_acct: Account, b58_to_address: str, value: int,
                 payer_acct: Account, gas_limit: int, gas_price: int) -> str:
        """
        This interface is used to call the Transfer method in ope4
        that transfer an amount of tokens from one account to another account.

        :param from_acct: an Account class that send the oep4 token.
        :param b58_to_address: a base58 encode address that receive the oep4 token.
        :param value: an int value that indicate the amount oep4 token that will be transferred in this transaction.
        :param payer_acct: an Account class that used to pay for the transaction.
        :param gas_limit: an int value that indicate the gas limit.
        :param gas_price: an int value that indicate the gas price.
        :return: the hexadecimal transaction hash value.
        """
        func = self.__abi_info.get_function('transfer')
        if not isinstance(value, int):
            raise SDKException(
                ErrorCode.param_err('the data type of value should be int.'))
        if value < 0:
            raise SDKException(
                ErrorCode.param_err(
                    'the value should be equal or great than 0.'))
        if not isinstance(from_acct, Account):
            raise SDKException(
                ErrorCode.param_err(
                    'the data type of from_acct should be Account.'))
        Oep4.__b58_address_check(b58_to_address)
        from_address = from_acct.get_address().to_array()
        to_address = Address.b58decode(b58_to_address).to_array()
        params = (from_address, to_address, value)
        func.set_params_value(params)
        tx_hash = self.__sdk.neo_vm().send_transaction(self.__contract_address,
                                                       from_acct, payer_acct,
                                                       gas_limit, gas_price,
                                                       func, False)
        return tx_hash

    def transfer_multi(self, args: list, payer_acct: Account, signers: list,
                       gas_limit: int, gas_price: int):
        """
        This interface is used to call the TransferMulti method in ope4
        that allow transfer amount of token from multiple from-account to multiple to-account multiple times.

        :param args: a parameter list with each item contains three sub-items:
                base58 encode transaction sender address,
                base58 encode transaction receiver address,
                amount of token in transaction.
        :param payer_acct: an Account class that used to pay for the transaction.
        :param signers: a signer list used to sign this transaction which should contained all sender in args.
        :param gas_limit: an int value that indicate the gas limit.
        :param gas_price: an int value that indicate the gas price.
        :return: the hexadecimal transaction hash value.
        """
        func = self.__abi_info.get_function('transferMulti')
        for index in range(len(args)):
            item = args[index]
            Oep4.__b58_address_check(item[0])
            Oep4.__b58_address_check(item[1])
            if not isinstance(item[2], int):
                raise SDKException(
                    ErrorCode.param_err(
                        'the data type of value should be int.'))
            if item[2] < 0:
                raise SDKException(
                    ErrorCode.param_err(
                        'the value should be equal or great than 0.'))
            from_address_array = Address.b58decode(item[0]).to_array()
            to_address_array = Address.b58decode(item[1]).to_array()
            args[index] = [from_address_array, to_address_array, item[2]]
        func.set_params_value((args, ))
        params = BuildParams.serialize_abi_function(func)
        unix_time_now = int(time.time())
        params.append(0x67)
        for i in self.__contract_address:
            params.append(i)
        signers_len = len(signers)
        if signers_len == 0:
            raise SDKException(ErrorCode.param_err('payer account is None.'))
        payer_address = payer_acct.get_address().to_array()
        tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit,
                         payer_address, params, bytearray(), [], bytearray())
        for index in range(signers_len):
            self.__sdk.add_sign_transaction(tx, signers[index])
        tx_hash = self.__sdk.rpc.send_raw_transaction(tx)
        return tx_hash

    def approve(self, owner_acct: Account, b58_spender_address: str,
                amount: int, payer_acct: Account, gas_limit: int,
                gas_price: int):
        """
        This interface is used to call the Approve method in ope4
        that allows spender to withdraw a certain amount of oep4 token from owner account multiple times.

        If this function is called again, it will overwrite the current allowance with new value.

        :param owner_acct: an Account class that indicate the owner.
        :param b58_spender_address: a base58 encode address that be allowed to spend the oep4 token in owner's account.
        :param amount: an int value that indicate the amount oep4 token that will be transferred in this transaction.
        :param payer_acct: an Account class that used to pay for the transaction.
        :param gas_limit: an int value that indicate the gas limit.
        :param gas_price: an int value that indicate the gas price.
        :return: the hexadecimal transaction hash value.
        """
        func = self.__abi_info.get_function('approve')
        if not isinstance(amount, int):
            raise SDKException(
                ErrorCode.param_err('the data type of amount should be int.'))
        if amount < 0:
            raise SDKException(
                ErrorCode.param_err(
                    'the amount should be equal or great than 0.'))
        owner_address = owner_acct.get_address().to_array()
        Oep4.__b58_address_check(b58_spender_address)
        spender_address = Address.b58decode(b58_spender_address).to_array()
        params = (owner_address, spender_address, amount)
        func.set_params_value(params)
        tx_hash = self.__sdk.neo_vm().send_transaction(self.__contract_address,
                                                       owner_acct, payer_acct,
                                                       gas_limit, gas_price,
                                                       func, False)
        return tx_hash

    def allowance(self, b58_owner_address: str, b58_spender_address: str):
        """
        This interface is used to call the Allowance method in ope4
        that query the amount of spender still allowed to withdraw from owner account.

        :param b58_owner_address: a base58 encode address that represent owner's account.
        :param b58_spender_address: a base58 encode address that represent spender's account.
        :return: the amount of oep4 token that owner allow spender to transfer from the owner account.
        """
        func = self.__abi_info.get_function('allowance')
        Oep4.__b58_address_check(b58_owner_address)
        owner = Address.b58decode(b58_owner_address).to_array()
        Oep4.__b58_address_check(b58_spender_address)
        spender = Address.b58decode(b58_spender_address).to_array()
        func.set_params_value((owner, spender))
        allowance = self.__sdk.neo_vm().send_transaction(
            self.__contract_address, None, None, 0, 0, func, True)
        array = bytearray(binascii.a2b_hex(allowance.encode('ascii')))
        array.reverse()
        try:
            allowance = int(binascii.b2a_hex(array).decode('ascii'), 16)
        except ValueError:
            allowance = 0
        return allowance

    def transfer_from(self, spender_acct: Account, b58_from_address: str,
                      b58_to_address: str, value: int, payer_acct: Account,
                      gas_limit: int, gas_price: int):
        """
        This interface is used to call the Allowance method in ope4
        that allow spender to withdraw amount of oep4 token from from-account to to-account.

        :param spender_acct: an Account class that actually spend oep4 token.
        :param b58_from_address: an base58 encode address that actually pay oep4 token for the spender's spending.
        :param b58_to_address: a base58 encode address that receive the oep4 token.
        :param value: the amount of ope4 token in this transaction.
        :param payer_acct: an Account class that used to pay for the transaction.
        :param gas_limit: an int value that indicate the gas limit.
        :param gas_price: an int value that indicate the gas price.
        :return: the hexadecimal transaction hash value.
        """
        func = self.__abi_info.get_function('transferFrom')
        Oep4.__b58_address_check(b58_from_address)
        Oep4.__b58_address_check(b58_to_address)
        if not isinstance(spender_acct, Account):
            raise SDKException(
                ErrorCode.param_err(
                    'the data type of spender_acct should be Account.'))
        spender_address_array = spender_acct.get_address().to_array()
        from_address_array = Address.b58decode(b58_from_address).to_array()
        to_address_array = Address.b58decode(b58_to_address).to_array()
        if not isinstance(value, int):
            raise SDKException(
                ErrorCode.param_err('the data type of value should be int.'))
        params = (spender_address_array, from_address_array, to_address_array,
                  value)
        func.set_params_value(params)
        params = BuildParams.serialize_abi_function(func)
        unix_time_now = int(time.time())
        params.append(0x67)
        for i in self.__contract_address:
            params.append(i)
        if payer_acct is None:
            raise SDKException(ErrorCode.param_err('payer account is None.'))
        payer_address_array = payer_acct.get_address().to_array()
        tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit,
                         payer_address_array, params, bytearray(), [],
                         bytearray())
        self.__sdk.sign_transaction(tx, spender_acct)
        if spender_acct.get_address_base58() != payer_acct.get_address_base58(
        ):
            self.__sdk.add_sign_transaction(tx, payer_acct)
        tx_hash = self.__sdk.rpc.send_raw_transaction(tx)
        return tx_hash
Пример #18
0
def main(argv):
    try:
        opts, args = getopt.getopt(argv, "hm:i:", ["migrate=", "invoke="])
    except getopt.GetoptError:
        print('test.py [-m|--migrate] [-i|--invoke] ')
        sys.exit(2)
    m = {}
    for opt, arg in opts:
        if opt == '-h':
            print('test.py [-m|--migrate] [-i|--invoke] ')
            sys.exit()
        elif opt in ("-m", "--migrate"):
            m["func"] = "migrate"
            if "json" in str(arg):
                with open(arg, "r") as f:
                    r = json.load(
                        f,
                        object_hook=lambda d: namedtuple('X', d.keys())
                        (*d.values()))
                    m["rpc_address"] = r.rpc_address
                    m["need_storage"] = r.need_storage
                    m["name"] = r.name
                    m["code_version"] = r.code_version
                    m["author"] = r.author
                    m["email"] = r.email
                    m["desp"] = r.desp
                    m["payer_address"] = r.payer_address
                    m["payer_password"] = r.payer_password
                    m["wallet_file_path"] = r.wallet_file_path
                    m["gas_limit"] = r.gas_limit
                    m["gas_price"] = r.gas_price
                    m["save_file"] = r.save_file
                    if ".avm" in r.code:
                        with open(r.code, "r") as f2:
                            m["code"] = f2.read()
                    else:
                        m["code"] = r.code
                    m["contract_address"] = Address.address_from_vm_code(
                        m["code"]).to_hex_str()
            else:
                temp = str(arg).split(",")
                for i in temp:
                    t = str(i).split("=")
                    m[t[0]] = t[1]
        elif opt in ("-i", "--invoke"):
            m["func"] = "invoke"
            if "json" in str(arg):
                with open(arg, "r") as f:
                    r = json.load(
                        f,
                        object_hook=lambda d: namedtuple('X', d.keys())
                        (*d.values()))
                    m["rpc_address"] = r.rpc_address
                    m["acct_address"] = r.acct_address
                    m["acct_password"] = r.acct_password
                    m["payer_address"] = r.payer_address
                    m["payer_password"] = r.payer_password
                    m["wallet_file_path"] = r.wallet_file_path
                    m["gas_limit"] = r.gas_limit
                    m["gas_price"] = r.gas_price
                    m["abi_path"] = r.abi_path
                    m["save_file"] = r.save_file
                    m["function"] = r.function
            else:
                temp = str(arg).split(",")
                for i in temp:
                    t = str(i).split("=")
                    m[t[0]] = t[1]
        else:
            print('test.py [-m|--migrate] [-i|--invoke] ')
            sys.exit()

    sdk = OntologySdk()
    sdk.set_rpc(m["rpc_address"])
    if m["func"] is "migrate":
        need_storage = False
        if m["need_storage"] is 'true':
            need_storage = True
        tx = sdk.neo_vm().make_deploy_transaction(
            m["code"], need_storage, m["name"], m["code_version"], m["author"],
            m["email"], m["desp"], m["payer_address"], m["gas_limit"],
            m["gas_price"])
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        acct = sdk.wallet_manager.get_account(m["payer_address"],
                                              m["payer_password"])
        sdk.sign_transaction(tx, acct)
        sdk.set_rpc(m["rpc_address"])
        try:
            print("deploying,please waiting ...")
            res = sdk.rpc.send_raw_transaction(tx)
            print("txhash:", res)
            for i in range(10):
                time.sleep(1)
                res = sdk.rpc.get_smart_contract(m["contract_address"])
                if res == "":
                    continue
                else:
                    print("deploy success")
                    break
            save_file(m, "success")
        except Exception as e:
            print(e)
            save_file(m, e)
    elif m["func"] is "invoke":
        func_map = {}
        t = 0
        for i in list(m["function"]):
            func_list = []
            func_list.append(i.function_name)
            func_list.append(i.pre_exec)
            for j in list(i.function_param):
                func_list.append(j)
            func_map["function" + str(t)] = func_list
            t = t + 1
        with open(str(m["abi_path"]), "r") as f:
            abi = json.loads(f.read(),
                             object_hook=lambda d: namedtuple('X', d.keys())
                             (*d.values()))
            abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions,
                               abi.events)
            contract_address = bytearray.fromhex(str(abi.hash)[2:])
            m["contract_address"] = contract_address.hex()
            contract_address.reverse()
            sdk.wallet_manager.open_wallet(m["wallet_file_path"])
            acct = sdk.wallet_manager.get_account(m["acct_address"],
                                                  m["acct_password"])
            payer = sdk.wallet_manager.get_account(m["payer_address"],
                                                   m["payer_password"])
            func_l = []
            for func_info in func_map.values():
                func = abi_info.get_function(func_info[0])
                params = []
                l = []
                l.append(func_info[0])
                l.append(func_info[1])
                temp_l = ""
                for i in range(len(func_info)):
                    if i == 0 or i == 1:
                        continue
                    temp_l += func_info[i] + ":"
                    if func.parameters[i - 2].type == "String":
                        params.append(str(func_info[i]))
                    if func.parameters[i - 2].type == "ByteArray":
                        params.append(bytearray(func_info[i].encode()))
                    if func.parameters[i - 2].type == "Integer":
                        params.append(func_info[i])
                l.append(temp_l[:len(temp_l) - 1])
                if len(params) == 1:
                    func.set_params_value(params[0])
                elif len(params) == 2:
                    func.set_params_value(params[0], params[1])
                elif len(params) == 3:
                    func.set_params_value(params[0], params[1], params[2])
                elif len(params) == 4:
                    func.set_params_value(params[0], params[1], params[2],
                                          params[3])
                elif len(params) == 5:
                    func.set_params_value(params[0], params[1], params[2],
                                          params[3], params[4])
                elif len(params) == 6:
                    func.set_params_value(params[0], params[1], params[2],
                                          params[3], params[4], params[5])
                elif len(params) == 7:
                    func.set_params_value(params[0], params[1], params[2],
                                          params[3], params[4], params[5],
                                          params[6])
                pre_exec = False
                if func_info[1] == "true":
                    pre_exec = True
                try:
                    print("")
                    print("invoking, please waiting ...")
                    print("method: " + func_info[0])
                    res = sdk.neo_vm().send_transaction(
                        contract_address, acct, payer, m["gas_limit"],
                        m["gas_price"], func, pre_exec)
                    if not pre_exec:
                        time.sleep(6)
                        print("txhash:", res)
                        print("Event:",
                              sdk.rpc.get_smart_contract_event_by_tx_hash(res))
                        l.append(res)
                    else:
                        print(res)
                        print("res:", (bytearray.fromhex(res)).decode('utf-8'))
                        l.append((bytearray.fromhex(res)).decode('utf-8'))
                except Exception as e:
                    print("Error:", e)
                    l.append(e)
                func_l.append(l)
            save_file(m, "", func_l)
    else:
        print("only support migrate and invoke")
Пример #19
0
def main(argv):
    try:
        opts, args = getopt.getopt(argv, "-h-m:-i:-p", [
            "migrate=",
            "invoke=",
        ])
    except getopt.GetoptError:
        print('test.py [-m|--migrate] [-i|--invoke] ')
        sys.exit(2)
    m = {}
    invoke_func_name = ""
    pre_exec = False
    for opt, arg in opts:
        if opt == '-h':
            print('test.py [-m|--migrate] [-i|--invoke] ')
            sys.exit()
        elif opt in ("-m", "--migrate"):
            m["func"] = "migrate"
            if "json" in str(arg):
                with open(arg, "r") as f:
                    r = json.load(
                        f,
                        object_hook=lambda d: namedtuple('X', d.keys())
                        (*d.values()))
                    #print("r_json_content is ", r)
                    m["rpc_address"] = r.rpc_address
                    m["need_storage"] = r.need_storage
                    m["name"] = r.name
                    m["code_version"] = r.code_version
                    m["author"] = r.author
                    m["email"] = r.email
                    m["desp"] = r.desp
                    m["payer_address"] = r.payer_address
                    m["payer_password"] = r.payer_password
                    m["wallet_file_path"] = r.wallet_file_path
                    m["gas_limit"] = r.gas_limit
                    m["gas_price"] = r.gas_price
                    m["save_file"] = r.save_file
                    if ".avm" in r.code:
                        with open(r.code, "r") as f2:
                            m["code"] = f2.read()
                    else:
                        m["code"] = r.code
                    m["contract_address"] = Address.address_from_vm_code(
                        m["code"]).to_hex_str()
            else:
                temp = str(arg).split(",")
                for i in temp:
                    t = str(i).split("=")
                    m[t[0]] = t[1]
        elif opt in ("-i", "--invoke"):
            invoke_func_name = arg
            print('invoke_function is ', invoke_func_name)
            m["func"] = "invoke"
            invoke_json_path = './invoke.json'
            if "json" in str(invoke_json_path):
                with open(invoke_json_path, "r") as f:
                    r = json.load(
                        f,
                        object_hook=lambda d: namedtuple('X', d.keys())
                        (*d.values()))
                    m["rpc_address"] = r.rpc_address
                    m["acct_address"] = r.acct_address
                    m["acct_password"] = r.acct_password
                    m["payer_address"] = r.payer_address
                    m["payer_password"] = r.payer_password
                    m["wallet_file_path"] = r.wallet_file_path
                    m["gas_limit"] = r.gas_limit
                    m["gas_price"] = r.gas_price
                    #m["abi_path"] = r.abi_path
                    m["save_file"] = r.save_file
                    print('m_save_file is ', m["save_file"])
                    #m["function"] = r.function
                    if "abi.json" in r.abi:
                        with open(r.abi, "r") as f:
                            m["abi"] = f.read()
                    else:
                        m["abi"] = r.abi
            else:
                temp = str(invoke_json_path).split(",")
                for i in temp:
                    t = str(i).split("=")
                    m[t[0]] = t[1]
        elif opt in ("-p", "--pre"):
            pre_exec = True
            print('pre_exec is True')
        else:
            print('test.py [-m|--migrate] [-i|--invoke] ')
            sys.exit()
    sdk = OntologySdk()
    sdk.set_rpc(m["rpc_address"])
    if m["func"] is "migrate":
        need_storage = False
        if m["need_storage"] is 'true':
            need_storage = True
        tx = sdk.neo_vm().make_deploy_transaction(
            m["code"], need_storage, m["name"], m["code_version"], m["author"],
            m["email"], m["desp"], m["payer_address"], m["gas_limit"],
            m["gas_price"])
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        acct = sdk.wallet_manager.get_account(m["payer_address"],
                                              m["payer_password"])

        print('acct.address', acct.get_address_base58())

        sdk.sign_transaction(tx, acct)
        sdk.set_rpc(m["rpc_address"])
        try:
            print("deploying,please waiting ...")
            r = sdk.rpc.send_raw_transaction(tx)
            print("txhash:", r)
            for i in range(10):
                time.sleep(1)
                r = sdk.rpc.get_smart_contract(m["contract_address"])
                if r == "":
                    continue
                else:
                    print("deploy success")
                    break
            save_file(m, "success")
        except Exception as e:
            print(e)
            save_file(m, e)
    elif m["func"] is "invoke":
        res_abi = json.loads(m["abi"],
                             object_hook=lambda d: namedtuple('X', d.keys())
                             (*d.values()))
        abi_info = AbiInfo(res_abi.hash, res_abi.entrypoint, res_abi.functions,
                           res_abi.events)
        contract_address = bytearray.fromhex(str(res_abi.hash)[2:])
        contract_address.reverse()
        #print("contract_address is ", contract_address)
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        acct = sdk.wallet_manager.get_account(m["acct_address"],
                                              m["acct_password"])
        payer = sdk.wallet_manager.get_account(m["payer_address"],
                                               m["payer_password"])
        print('res_abi.hash is ', res_abi.hash)
        #print('res_abi.entrypoint is ', res_abi.entrypoint)
        #print('res_abi.function is ', res_abi.functions, type(res_abi.functions), len(res_abi.functions))
        invoke_func = abi_info.get_function(invoke_func_name)
        func_params = {}

        for function in res_abi.functions:
            if function.name == invoke_func_name:
                func_params = function.parameters
        func_params_map = {}
        for param in func_params:
            hinter = 'Pls input ' + param.name + ' (' + param.type + ')' + ': '
            raw_input = input(hinter)
            if param.type == 'String':
                invoke_func.parameters.append(str(raw_input))
            if param.type == 'ByteArray':
                invoke_func.parameters.append(bytearray(raw_input))
            if param.type == 'Integer':
                invoke_func.parameters.append(int(raw_input))
        try:
            print("")
            print("invoking '" + invoke_func_name + "', please waiting ...")
            #print("method: " + invoke_func_name)
            res = sdk.neo_vm().send_transaction(contract_address, acct, payer,
                                                m["gas_limit"], m["gas_price"],
                                                invoke_func, pre_exec)
            if not pre_exec:
                time.sleep(6)
                print("txhash:", res)
                print("Event:",
                      sdk.rpc.get_smart_contract_event_by_tx_hash(res))
            else:
                print(res)
                print("res:", (bytearray.fromhex(res)).decode('utf-8'))
                #l.append((bytearray.fromhex(res)).decode('utf-8'))
        except Exception as e:
            print("Error:", e)
            #l.append(e)
        #func_l.append(l)
    else:
        print('only support migrate and invoke')
Пример #20
0
class InvokeSavingPot(object):
    def __init__(self, sdk: OntologySdk, abi: dict, hex_contract_address: str):
        if not isinstance(sdk, OntologySdk):
            raise PotException(PotError.invalid_sdk)
        if not isinstance(abi, dict):
            raise PotException(PotError.invalid_abi_type)
        if not isinstance(hex_contract_address, str):
            raise PotException(PotError.invalid_contract_address_hex_type)
        if len(hex_contract_address) != 40:
            raise PotException(PotError.invalid_contract_address_hex_len)
        self.__sdk = sdk
        self.__contract_address_hex = hex_contract_address
        self.__contract_address_bytearray = bytearray(
            binascii.a2b_hex(hex_contract_address))
        self.__contract_address_bytearray.reverse()
        self.__abi = abi
        entry_point = self.__abi.get('entrypoint', '')
        functions = self.__abi['abi']['functions']
        events = self.__abi.get('events', list())
        self.__abi_info = AbiInfo(hex_contract_address, entry_point, functions,
                                  events)

    def get_contract_address_hex(self):
        return self.__contract_address_hex

    def create_ont_pot(self,
                       from_acct: Account,
                       time_limit: int,
                       gas_limit: int = 20000000,
                       gas_price: int = 500):
        create_function = self.__abi_info.get_function('create_ont_pot')
        create_function.set_params_value(
            (from_acct.get_address().to_array(), time_limit))
        try:
            tx_hash = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, create_function, False)
            return tx_hash
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ont_pot_failed)

    def create_ong_pot(self, from_acct: Account, time_limit: int,
                       gas_limit: int, gas_price: int):
        create_function = self.__abi_info.get_function('create_ong_pot')
        create_function.set_params_value(
            (from_acct.get_address().to_array(), time_limit))
        try:
            tx_hash = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, create_function, False)
            return tx_hash
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def put_ont_pot_tx_hash(self, from_acct: Account, tx_hash: str,
                            gas_limit: int, gas_price: int):
        put_ont_pot_tx_hash = self.__abi_info.get_function(
            'put_ont_pot_tx_hash')
        put_ont_pot_tx_hash.set_params_value(
            (from_acct.get_address().to_array(), tx_hash))
        try:
            tx_hash = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, put_ont_pot_tx_hash, False)
            return tx_hash
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def get_ont_pot_tx_hash(self, bytearray_address: bytearray):
        get_ont_pot_tx_hash = self.__abi_info.get_function(
            'get_ont_pot_tx_hash')
        get_ont_pot_tx_hash.set_params_value((bytearray_address, ))
        try:
            data = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, None, None, 0, 0,
                get_ont_pot_tx_hash, True)
            data = binascii.a2b_hex(data).decode('ascii')
            return data
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def put_ong_pot_tx_hash(self, from_acct: Account, tx_hash: str,
                            gas_limit: int, gas_price: int):
        put_ont_pot_tx_hash = self.__abi_info.get_function(
            'put_ong_pot_tx_hash')
        put_ont_pot_tx_hash.set_params_value(
            (from_acct.get_address().to_array(), tx_hash))
        try:
            return self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, put_ont_pot_tx_hash, False)
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def get_ong_pot_tx_hash(self, bytearray_address: bytearray):
        get_ont_pot_tx_hash = self.__abi_info.get_function(
            'get_ong_pot_tx_hash')
        get_ont_pot_tx_hash.set_params_value((bytearray_address, ))
        try:
            data = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, None, None, 0, 0,
                get_ont_pot_tx_hash, True)
            data = binascii.a2b_hex(data).decode('ascii')
            return data
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def saving_ont(self, from_acct: Account, amount: int, gas_limit: int,
                   gas_price: int):
        saving_ont = self.__abi_info.get_function('saving_ont')
        saving_ont.set_params_value(
            (from_acct.get_address().to_array(), amount))
        try:
            return self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, saving_ont, False)
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def saving_ong(self, from_acct: Account, amount: int, gas_limit: int,
                   gas_price: int):
        saving_ong = self.__abi_info.get_function('saving_ong')
        saving_ong.set_params_value(
            (from_acct.get_address().to_array(), amount))
        try:
            return self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, saving_ong, False)
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def take_ong_out(self, from_acct: Account, gas_limit: int, gas_price: int):
        take_ong_out = self.__abi_info.get_function('take_ong_out')
        take_ong_out.set_params_value((from_acct.get_address().to_array(), ))
        try:
            tx_hash = self.__sdk.neo_vm().send_transaction(
                self.__contract_address_bytearray, from_acct, from_acct,
                gas_limit, gas_price, take_ong_out, False)
            return tx_hash
        except SDKException as e:
            if 'vm execute state fault' in e.args[1]:
                return False
            else:
                raise PotException(PotError.create_ong_pot_failed)

    def query_ont_pot_saving_time(self, address_bytes: bytes) -> int:
        query_function = self.__abi_info.get_function(
            'query_ont_pot_saving_time')
        query_function.set_params_value((address_bytes, ))
        saving_time = self.__sdk.neo_vm().send_transaction(
            self.__contract_address_bytearray, None, None, 0, 0,
            query_function, True)
        saving_time = int(
            ''.join(
                reversed([
                    saving_time[i:i + 2]
                    for i in range(0, len(saving_time), 2)
                ])), 16)
        return saving_time

    def query_ong_pot_saving_time(self, address_bytes: bytes) -> int:
        query_function = self.__abi_info.get_function(
            'query_ong_pot_saving_time')
        query_function.set_params_value((address_bytes, ))
        saving_time = self.__sdk.neo_vm().send_transaction(
            self.__contract_address_bytearray, None, None, 0, 0,
            query_function, True)
        saving_time = int(
            ''.join(
                reversed([
                    saving_time[i:i + 2]
                    for i in range(0, len(saving_time), 2)
                ])), 16)
        return saving_time

    def query_create_pot_event(self, tx_hash: str):
        event = self.__sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
        if event == '':
            return list()
        event = event.get('Notify', list())
        if len(event) == 0:
            return event
        event = event[0].get('States', list())
        if len(event) == 0:
            return event
        event[0] = binascii.a2b_hex(event[0]).decode('ascii')
        event[1] = time.strftime(
            "%Y-%m-%d %H:%M:%S",
            time.localtime(
                int(
                    ''.join(
                        reversed([
                            event[1][i:i + 2]
                            for i in range(0, len(event[1]), 2)
                        ])), 16)))
        return event
Пример #21
0
class DemoClient(object):
    """

    """

    def __init__(self, rpc_addr: str, wallet_file: str, is_maker: bool, pwd, avm_file, abi_file):
        self.sdk = OntologySdk()
        self.sdk.rpc.set_address(rpc_addr)
        self.sdk.open_wallet(wallet_file)
        self.is_maker = is_maker # 可以查询一个合约存不存在,存在就可以让maker是True,而不必自己指定了
        self.__pwd = pwd

        self.__get_code_from_avm(avm_file)
        self.__get_abi_from_file(abi_file)

    @staticmethod
    def is_transaction_success(txid):
        if len(txid) != 64:
            return False
        return True

    def start_game(self, acc_index):
        if not self.is_maker:
            return
        acc = self.get_account_by_index(acc_index)
        txid = self.deploy_contract(need_storage=True, name="sixsixsix", code_ver="1.0", author="tomzou",
                                    email="*****@*****.**", desp="demo", acc=acc, gas_limit=20200000, gas_price=500)
        if not self.is_transaction_success(txid):
            raise Exception(txid)
        return txid

    def get_account_by_index(self, acc_index):
        wm = self.sdk.get_wallet_manager()
        return wm.get_account(wm.get_wallet().get_account_by_index(acc_index).get_address(), self.__pwd[acc_index])

    def deploy_contract(self, need_storage, name, code_ver, author, email, desp, acc, gas_limit, gas_price):
        tx = self.sdk.neo_vm().make_deploy_transaction(self.code, need_storage=need_storage, name=name,
                                                       code_version=code_ver, author=author, email=email, desp=desp,
                                                       payer=acc.get_address_base58(), gas_limit=gas_limit, gas_price=gas_price)
        self.sdk.sign_transaction(tx, acc)
        return self.sdk.get_rpc().send_raw_transaction(tx)

    def __get_code_from_avm(self, avm_file):
        f = open(avm_file)
        self.code = f.readline()
        code_addr_obj = Address.address_from_vm_code(self.code)
        self.code_addr = code_addr_obj.to_reverse_hex_str()
        self.contract_acc = code_addr_obj.to_base58()
        self.contract_addr = code_addr_obj.to_byte_array() # 应该是这个地址
        f.close()

    def __get_abi_from_file(self, abi_file):
        f = open(abi_file)
        abi_str = f.readline()
        abi = json.loads(abi_str, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
        self.abi_info = AbiInfo("0x" + self.code_addr, "main", abi.functions, [])

    def luck_roll(self, amount, acc_index):
        """
        玩家通过本方法参与游戏
        :param amount:
        :param acc_index:
        :return:
        """
        self.join_game(amount, acc_index)

    def join_game(self, amount, acc_index):
        acc = self.get_account_by_index(acc_index)

        func_join = self.abi_info.get_function("join")
        func_join.set_params_value(acc.get_address().to_byte_array(), amount)

        txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_join, False)

        if not self.is_transaction_success(txid):
            raise Exception(txid)

        before = time.time()
        tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid)
        while tx_info == 'unknown transaction' or tx_info is None:
            tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid)
        print('cost %f seconds to confirm tx' %(time.time() - before))

        try:
            notify_info = tx_info['Notify'][0]['States']
        except Exception:
            raise Exception(tx_info)

        if notify_info == '626574207472616e666572206661696c6564':
            raise Exception('bet tranfer failed')
        elif notify_info == '736574746c65207472616e73666572206661696c6564':
            raise Exception('settle transfer failed')
        else:
            print(bytes.fromhex(notify_info).decode())
Пример #22
0
class DemoClient(object):
    """

    """
    def __init__(self, rpc_addr: str, wallet_file: str, is_maker: bool, pwd,
                 avm_file, abi_file):
        self.sdk = OntologySdk()
        self.sdk.rpc.set_address(rpc_addr)
        self.sdk.open_wallet(wallet_file)
        self.is_maker = is_maker  # 可以查询一个合约存不存在,存在就可以让maker是True,而不必自己指定了
        self.__pwd = pwd

        self.__get_code_from_avm(avm_file)
        self.__get_abi_from_file(abi_file)

    @staticmethod
    def is_transaction_success(txid):
        if len(txid) != 64:
            return False
        return True

    def start_game(self, acc_index):
        if not self.is_maker:
            return
        acc = self.get_account_by_index(acc_index)
        txid = self.deploy_contract(need_storage=True,
                                    name="sixsixsix",
                                    code_ver="1.0",
                                    author="tomzou",
                                    email="*****@*****.**",
                                    desp="demo",
                                    acc=acc,
                                    gas_limit=20200000,
                                    gas_price=500)
        if not self.is_transaction_success(txid):
            raise Exception(txid)
        return txid

    def get_account_by_index(self, acc_index):
        wm = self.sdk.get_wallet_manager()
        return wm.get_account(
            wm.get_wallet().get_account_by_index(acc_index).get_address(),
            self.__pwd[acc_index])

    def deploy_contract(self, need_storage, name, code_ver, author, email,
                        desp, acc, gas_limit, gas_price):
        tx = self.sdk.neo_vm().make_deploy_transaction(
            self.code,
            need_storage=need_storage,
            name=name,
            code_version=code_ver,
            author=author,
            email=email,
            desp=desp,
            payer=acc.get_address_base58(),
            gas_limit=gas_limit,
            gas_price=gas_price)
        self.sdk.sign_transaction(tx, acc)
        return self.sdk.get_rpc().send_raw_transaction(tx)

    def __get_code_from_avm(self, avm_file):
        f = open(avm_file)
        self.code = f.readline()
        code_addr_obj = Address.address_from_vm_code(self.code)
        self.code_addr = code_addr_obj.to_reverse_hex_str()
        self.contract_acc = code_addr_obj.to_base58()
        self.contract_addr = code_addr_obj.to_byte_array()
        f.close()

    def __get_abi_from_file(self, abi_file):
        f = open(abi_file)
        abi_str = f.readline()
        abi = json.loads(abi_str,
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        self.abi_info = AbiInfo("0x" + self.code_addr, "main", abi.functions,
                                [])

    def luck_roll(self, amount, acc_index):
        """
        玩家通过本方法参与游戏
        :param amount:
        :param acc_index:
        :return:
        """
        self.join_game(amount, acc_index)
        if self.bet(amount, acc_index) is True:
            print('I win, you bitch')
        else:
            print('Go back and work, FOOL')

    def join_game(self, amount, acc_index):
        acc = self.get_account_by_index(acc_index)

        # 调用相应的函数,需写完合约再回头搞
        func_join = self.abi_info.get_function("join")
        func_join.set_params_value(acc.get_address_base58(), amount)
        func_read_res = self.abi_info.get_function("is_game_ready")

        txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc,
                                                  2000000, 500, func_join,
                                                  False)

        print(txid)
        if not self.is_transaction_success(txid):
            raise Exception(txid)

        before = time.time()
        tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid)
        while tx_info == 'unknown transaction' or tx_info is None:
            tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(
                txid)
        print('cost %f seconds to confirm tx' % (time.time() - before))

        try:
            notify_info = tx_info['Notify'][0]['States']
        except Exception:
            raise Exception(tx_info)

        print(notify_info)
        if notify_info == '4e6f206d6f72652073656174':
            raise Exception("No more seat")
        elif notify_info == '6a6f696e207375636365737366756c6c79':
            # 等待游戏结束,不停滴向合约pull结果
            while True:
                time.sleep(1)
                res = self.sdk.neo_vm().send_transaction(
                    self.contract_addr, acc, acc, 2000000, 500, func_read_res,
                    True)
                if res is True:
                    print(res)
                    break

    def bet(self, amount, acc_index):
        """
        人都坐好了,开赌!
        掷出骰子并等待结果,返回输赢
        :param amount: 需与join相同
        :param acc_index: 使用钱包中第几个账户,需和join方法统一
        :return: True代表胜利,False代表输了。。
        """
        acc = self.get_account_by_index(acc_index)
        tx = self.sdk.native_vm().asset().new_transfer_transaction(
            'ont', acc.get_address_base58(), self.contract_acc, amount,
            acc.get_address_base58(), 2000000, 500)
        self.sdk.sign_transaction(tx, acc)
        txid = self.sdk.get_rpc().send_raw_transaction(tx)

        if not self.is_transaction_success(txid):
            raise Exception('Some thing wrong with tx:%s' % txid)

        func_get_amounts = self.abi_info.get_function('get_amounts')
        sum_amounts = self.sdk.neo_vm().send_transaction(
            self.contract_addr, acc, acc, 2000000, 500, func_get_amounts, True)
        contract_balance = self.sdk.get_rpc().get_balance(self.contract_acc)
        while sum_amounts > contract_balance:
            contract_balance = self.sdk.get_rpc().get_balance(
                self.contract_acc)
            time.sleep(0.5)

        # 直接开始游戏,获取随机数
        func_roll_dice = self.abi_info.get_function('roll_dice')
        func_roll_dice.set_params_value(acc.get_address_base58())
        txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc,
                                                  2000000, 500, func_roll_dice,
                                                  False)

        if not self.is_transaction_success(txid):
            raise Exception('Some thing wrong with tx:%s' % txid)

        before = time.time()
        tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid)
        while tx_info == 'unknown transaction' or tx_info is None:
            tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(
                txid)
        print('cost %f seconds to confirm tx' % (time.time() - before))

        try:
            notify_info = tx_info['Notify'][0]['States']
        except Exception:
            raise Exception(tx_info)

        if type(notify_info) is int:
            print('your game is done and your dice number is %d' % notify_info)
        else:
            raise Exception(bytes.fromhex(notify_info).decode())

        func_get_res = self.abi_info.get_function('get_res')
        res = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc,
                                                 2000000, 500, func_get_res,
                                                 True)
        while res is False:
            res = self.sdk.neo_vm().send_transaction(self.contract_addr, acc,
                                                     acc, 2000000, 500,
                                                     func_get_res, True)
            time.sleep(0.5)

        if res == acc.get_address_base58():
            return True
        else:
            return False
def invoke(sdk, m, function_name=None):
    func_maps = {}
    for i in dict(m["function"]).values():
        if function_name is not None:
            if i["function_name"] not in function_name:
                continue
        func_map = {}
        param_list = []
        func_map["function_name"] = i["function_name"]
        func_map["pre_exec"] = i["pre_exec"]
        try:
            if type(i["function_param"]) is dict:
                for value in dict(i["function_param"]).values():
                    if type(value) is list:
                        p_temp = []
                        for v in list(value):
                            p_temp.append(v)
                        param_list.append(p_temp)
                    else:
                        param_list.append(value)
            elif type(i["function_param"]) is list:
                temp_list = []
                for para in list(i["function_param"]):
                    if type(para) is dict:
                        temp_list2 = []
                        for para2 in dict(para).values():
                            temp_list2.append(para2)
                        temp_list.append(temp_list2)
                    # if type(para) is :
                    else:
                        temp_list.append(para)
                param_list.append(temp_list)
            func_map["param_list"] = param_list
        except Exception as e:
            pass
        if not i["pre_exec"]:
            try:
                func_map["signers"] = i["signers"]
            except AttributeError as e:
                func_map["signers"] = None
        func_maps[i["function_name"]] = func_map
    with open(str(m["abi_path"]), "r") as f:
        abi = json.loads(f.read(),
                         object_hook=lambda d: namedtuple('X', d.keys())
                         (*d.values()))
        abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events)
        # print("abi_info is ", abi_info.hash, abi_info.entrypoint, abi_info.events, abi_info.functions)
        tmp = str(abi.hash)[2:]
        # print("tmp is ", tmp, type(tmp))
        contract_address = bytearray.fromhex(tmp)
        # print("contract_address is ", contract_address, type(contract_address))
        m["contract_address"] = contract_address.hex()
        contract_address.reverse()
        sdk.wallet_manager.open_wallet(m["wallet_file_path"])
        payer = sdk.wallet_manager.get_account(m["payer_address"],
                                               m["payer_password"])
        func_l = []
        no = 0
        for func_map in func_maps.values():
            if function_name is not None:
                if func_map["function_name"] not in function_name:
                    # params = BuildParams.create_code_params_script(function_name)
                    continue

            func = abi_info.get_function(func_map["function_name"])
            # print('func is ', func)
            if func is not None:
                func_map["return_type"] = func.return_type
            else:
                func_map["return_type"] = ""
                func = AbiFunction(func_map["function_name"],
                                   func_map["return_type"],
                                   func_map["param_list"])
                #print("func_map is ", func_map)
                #print("func is ", func)
            # print("func = "+str(func.name)+" -- "+str(func.parameters[0:])+" -- " +str(func.return_type))
            no = no + 1
            l = []
            l.append(no)
            l.append(func_map["function_name"])
            l.append(func_map["pre_exec"])
            # 用来放参数
            # print("func_map is ", func_map)
            # print("func is ", func)
            temp_l, params = convert_params(func, func_map)
            print("********", params)

            l.append(temp_l[:len(temp_l) - 1])

            if params is None:
                l.append("failed")
                func_l.append(l)
                continue
            try:
                print("")
                print("invoking, please waiting ...")
                print("method: " + func_map["function_name"])
                if func_map["pre_exec"]:
                    res = send_transaction(sdk, contract_address, None, None,
                                           0, 0, params, True)
                    # print("res in pre_exec part :", res)
                    if res["error"] != 0:
                        print(res["desc"])
                        l.append(res["desc"])
                    else:
                        # print('**** res **** is ', res)
                        # print("######## res[result][Result] is ",res["result"]["Result"], type(res["result"]["Result"]))
                        if res["result"]["Result"] is None or res["result"][
                                "Result"] == "":
                            # print("res:", res["result"]["Result"])
                            l.append("")
                        else:

                            if func_map["return_type"] == "Integer":
                                value = bytearray.fromhex(
                                    res["result"]["Result"])
                                value.reverse()
                                print("res:", int(value.hex(), 16))
                                l.append(int(value.hex(), 16))
                            elif func_map["return_type"] == "ByteArray":
                                # print("res:", (bytearray.fromhex(res["result"]["Result"])))
                                print("res:", res["result"]["Result"])
                                l.append(res["result"]["Result"])
                            elif func_map["return_type"] == "":
                                print("res:", res["result"]["Result"])
                                l.append(res["result"]["Result"])
                            elif func_map["return_type"] == "IntegerArray":
                                # print(" returntype = IntegerArray ")
                                print("res For IntegerArray is ",
                                      res["result"]["Result"])
                                returnedList = res["result"]["Result"]
                                intReturnList = []
                                for element in returnedList:
                                    if not element:
                                        element = "00"
                                    value = bytearray.fromhex(element)
                                    value.reverse()
                                    intValue = int(value.hex(), 16)
                                    intReturnList.append(intValue)

                                print("res: ", intReturnList)
                                l.append(intReturnList)
                            elif func_map["return_type"] == "ByetArrayArray":
                                print(" returntype = ByteArrayArray ")
                                print("res For ByetArrayArray is ",
                                      res["result"]["Result"])
                                returnedList = res["result"]["Result"]
                                ByteArrayReturnList = []
                                for element in returnedList:
                                    # Address.b58decode(func_map["param_list"][i], False).to_array()
                                    # ByteArrayValue = (bytearray.fromhex(element))
                                    # str1 = "7575526bc066a3acc6abb134119cd6d4a9041969"
                                    # address1=Address(binascii.a2b_hex(str1))
                                    address1 = Address(
                                        binascii.a2b_hex(element))
                                    ByteArrayValue = address1.b58encode()
                                    ByteArrayReturnList.append(ByteArrayValue)
                                print("res: ", ByteArrayReturnList)
                                l.append(ByteArrayReturnList)
                            else:
                                print("res:", (bytearray.fromhex(
                                    res["result"]["Result"])).decode('utf-8'))
                                l.append((bytearray.fromhex(
                                    res["result"]["Result"])).decode('utf-8'))
                else:

                    txhash, err = handle_tx(contract_address, func_map, params,
                                            payer, m, sdk)
                    if txhash == "":
                        l.append(err)
                    else:
                        for i in range(10):
                            time2.sleep(1)
                            event = sdk.rpc.get_smart_contract_event_by_tx_hash(
                                txhash)
                            if event is not None:
                                print("txhash:", txhash)
                                print("event:", event)
                                break
                        l.append(txhash)
            except Exception as e:
                print("Error:", e)
                l.append(e)
            func_l.append(l)
        save_file(m, "", func_l)
Пример #24
0
storage_warehouse = 'Onergy Max. Ltd.'
storage_start_date = '4 Aug 2017'
storage_end_date = '17 Oct 2017'
logistics_ship_company = 'Seagull Shipping Ltd.'
logistics_ship_model = 'KX438'
logistics_ship_date = '17 Oct 2017'
logistics_arrive_date = '28 Dec 2017'
logistics_origin = 'Varoni Harbor, India'
logistics_destination = 'Shen Zhen Harbor, China'
distribution_date = '18 Nov 2018'
distribution_time = '14:23 P.M.'
distribution_company = 'Tai Sin Medicine Ltd.'
distribution_people = 'Chan Tai Fung'
distribution_buyer = 'Mr. Piglet'
distribution_amount = 'RMB $5400.00'
save_manufacture_func = abi_info.get_function('Save_Manufacture_Data')
save_manufacture_func.set_params_value(
    (manufacture_date, manufacture_time, manufacture_origin,
     manufacture_company, manufacture_people, manufacture_medicine_name,
     manufacture_expiry_date, manufacture_ingredient1, manufacture_amount1,
     manufacture_ingredient2, manufacture_amount2, manufacture_ingredient3,
     manufacture_amount3, manufacture_ingredient4, manufacture_amount4,
     manufacture_ingredient5, manufacture_amount5, manufacture_ingredient6,
     manufacture_amount6, manufacture_ingredient7, manufacture_amount7,
     manufacture_ingredient8, manufacture_amount8))
save_storage_func = abi_info.get_function('Save_Storage_Data')
save_storage_func.set_params_value(
    (storage_location, storage_condition, storage_temperature,
     storage_humidity, storage_warehouse, storage_start_date,
     storage_end_date))
save_logistics_func = abi_info.get_function('Save_Logistics_Data')