Exemplo n.º 1
0
 def send_transaction(self, contract_address: bytes or bytearray, acct: Account, payer_acct: Account, gas_limit: int,
                      gas_price: int, func: AbiFunction, pre_exec: bool):
     if func is not None:
         params = BuildParams.serialize_abi_function(func)
     else:
         params = bytearray()
     if pre_exec:
         if isinstance(contract_address, bytes):
             tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 0, 0)
         elif isinstance(contract_address, bytearray):
             tx = NeoVm.make_invoke_transaction(contract_address, bytearray(params), b'', 0, 0)
         else:
             raise SDKException(ErrorCode.param_err('the data type of contract address is incorrect.'))
         if acct is not None:
             self.__sdk.sign_transaction(tx, acct)
         return self.__sdk.rpc.send_raw_transaction_pre_exec(tx)
     else:
         unix_time_now = int(time())
         params.append(0x67)
         for i in contract_address:
             params.append(i)
         if payer_acct is None:
             raise SDKException(ErrorCode.param_err('payer account is None.'))
         tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, payer_acct.get_address().to_array(),
                          params, bytearray(), [], bytearray())
         self.__sdk.sign_transaction(tx, acct)
         if acct.get_address_base58() != payer_acct.get_address_base58():
             self.__sdk.add_sign_transaction(tx, payer_acct)
         return self.__sdk.rpc.send_raw_transaction(tx)
    def test_invokeRead(self, payerAcct, param_list):
        params = BuildParams.create_code_params_script(param_list)

        tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 20000, 500)
        sdk.sign_transaction(tx, payerAcct)
        res, gaslimit = sdk.rpc.send_raw_transaction_pre_exec(tx)
        return res
Exemplo n.º 3
0
    def test_end(self):
        param_list = []
        param_list.append("endCurrentRound".encode())
        param_list1 = []
        param_list1.append(explodePoint)
        param_list1.append(salt)
        param_list2 = []
        param_list3 = []
        param_list3.append(adminAcct.get_address().to_array())
        param_list3.append(escapePoint)
        param_list2.append(param_list3)
        param_list1.append(param_list2)
        param_list.append(param_list1)

        params = BuildParams.create_code_params_script(param_list)
        params.append(0x67)
        for i in contract_address:
            params.append(i)

        unix_time_now = int(time.time())

        tx = Transaction(0, 0xd1, unix_time_now, 500, 20000000,
                         adminAcct.get_address().to_array(), params,
                         bytearray(), [], bytearray())

        sdk.sign_transaction(tx, adminAcct)
        res1 = sdk.rpc.send_raw_transaction(tx)

        print(res1)
        return res1
Exemplo n.º 4
0
 async def send_neo_vm_transaction(self,
                                   contract_address: str or bytes
                                   or bytearray,
                                   signer: Account or None,
                                   payer: Account or None,
                                   gas_limit: int,
                                   gas_price: int,
                                   func: AbiFunction or InvokeFunction,
                                   is_full: bool = False):
     if isinstance(func, AbiFunction):
         params = BuildParams.serialize_abi_function(func)
     elif isinstance(func, InvokeFunction):
         params = func.create_invoke_code()
     else:
         raise SDKException(
             ErrorCode.other_error('the type of func is error.'))
     contract_address = ensure_bytearray_contract_address(contract_address)
     params.append(0x67)
     for i in contract_address:
         params.append(i)
     if payer is None:
         raise SDKException(ErrorCode.param_err('payer account is None.'))
     tx = Transaction(0, 0xd1, int(time()), gas_price, gas_limit,
                      payer.get_address_bytes(), params, bytearray(), [])
     tx.sign_transaction(payer)
     if isinstance(
             signer, Account
     ) and signer.get_address_base58() != payer.get_address_base58():
         tx.add_sign_transaction(signer)
     return await self.send_raw_transaction(tx, is_full)
Exemplo n.º 5
0
 def send_transaction(self, contract_address: bytearray, acct: Account,
                      payer_acct: Account, gas_limit: int, gas_price: int,
                      func: AbiFunction, pre_exec: bool):
     params = bytearray()
     if func is not None:
         params = BuildParams.serialize_abi_function(func)
     if pre_exec:
         tx = NeoVm.make_invoke_transaction(bytearray(contract_address),
                                            bytearray(params), b'', 0, 0)
         if acct is not None:
             self.__sdk.sign_transaction(tx, acct)
         return self.__sdk.rpc.send_raw_transaction_pre_exec(tx)
     unix_time_now = int(time())
     params.append(0x67)
     for i in contract_address:
         params.append(i)
     tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit,
                      payer_acct.get_address().to_array(), params,
                      bytearray(), [], bytearray())
     if acct is not None:
         self.__sdk.sign_transaction(tx, acct)
     if payer_acct is not None and acct is not None and acct.get_address_base58(
     ) != payer_acct.get_address_base58():
         self.__sdk.add_sign_transaction(tx, payer_acct)
     return self.__sdk.rpc.send_raw_transaction(tx)
 def test_create_code_params_script(self):
     m = {}
     m["key"] = "value"
     l = []
     l.append(m)
     aa = BuildParams.create_code_params_script(l)
     print(aa.hex())
 def test_invoke(self, payerAcct, param_list):
     params = BuildParams.create_code_params_script(param_list)
     #
     # tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 20000, 500)
     # sdk.sign_transaction(tx, payerAcct)
     # nil, gaslimit = sdk.rpc.send_raw_transaction_pre_exec(tx)
     #
     params.append(0x67)
     for i in contract_address:
         params.append(i)
     gaslimit = 20000000
     gaslimit = gaslimit * 2
     unix_time_now = int(time.time())
     tx = Transaction(0, 0xd1, unix_time_now, 500, gaslimit, payerAcct.get_address().to_array(), params, bytearray(), [], bytearray())
     sdk.sign_transaction(tx, payerAcct)
     loopFlag = True
     hash = None
     while loopFlag:
         try:
             hash = sdk.rpc.send_raw_transaction(tx)
         except requests.exceptions.ConnectTimeout or requests.exceptions.ConnectionError:
             loopFlag = True
         if hash != None:
             loopFlag = False
     print("hash is", hash)
     return hash
 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)
Exemplo n.º 9
0
 def send_neo_vm_transaction(self, contract_address: str or bytes or bytearray, acct: Account, payer_acct: Account,
                             gas_limit: int, gas_price: int, func: AbiFunction or InvokeFunction, pre_exec: bool,
                             is_full: bool = False):
     if isinstance(func, AbiFunction):
         params = BuildParams.serialize_abi_function(func)
     elif isinstance(func, InvokeFunction):
         params = func.create_invoke_code()
     else:
         raise SDKException(ErrorCode.other_error('the type of func is error.'))
     if isinstance(contract_address, str) and len(contract_address) == 40:
         contract_address = bytearray(binascii.a2b_hex(contract_address))
         contract_address.reverse()
     if pre_exec:
         if isinstance(contract_address, bytes):
             tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 0, 0)
         elif isinstance(contract_address, bytearray):
             tx = NeoVm.make_invoke_transaction(contract_address, bytearray(params), b'', 0, 0)
         else:
             raise SDKException(ErrorCode.param_err('the data type of contract address is incorrect.'))
         if acct is not None:
             tx.sign_transaction(acct)
         return self.send_raw_transaction_pre_exec(tx, is_full)
     else:
         unix_time_now = int(time())
         params.append(0x67)
         for i in contract_address:
             params.append(i)
         if payer_acct is None:
             raise SDKException(ErrorCode.param_err('payer account is None.'))
         tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, payer_acct.get_address().to_bytes(),
                          params, bytearray(), [])
         tx.sign_transaction(payer_acct)
         if isinstance(acct, Account) and acct.get_address_base58() != payer_acct.get_address_base58():
             tx.add_sign_transaction(acct)
         return self.send_raw_transaction(tx, is_full)
Exemplo n.º 10
0
 def generate_unsigned_invoke_transaction(contract_address: bytearray,
                                          params_list: list,
                                          payer_base58: bytearray,
                                          gas_price: int, gas_limit: int):
     # params = BuildParams.serialize_abi_function(abi_func)
     params = BuildParams.create_code_params_script(params_list)
     tx = NeoVm.make_invoke_transaction(contract_address, bytearray(params),
                                        payer_base58, gas_limit, gas_price)
     return tx
Exemplo n.º 11
0
    def transfer_from(self, spender_acct: Account, from_acct: Account,
                      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 spend the oep4 token.
        :param from_acct: an Account class 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_to_address)
        if not isinstance(from_acct, Account):
            raise SDKException(
                ErrorCode.param_err(
                    'the data type of from_acct should be Account.'))
        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 = from_acct.get_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, payer_acct)
        if spender_acct.get_address_base58() != payer_acct.get_address_base58(
        ):
            self.__sdk.add_sign_transaction(tx, spender_acct)
        if from_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
Exemplo n.º 12
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())
Exemplo n.º 13
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
Exemplo n.º 14
0
 def send_neo_vm_transaction_pre_exec(self, contract_address: str or bytes or bytearray, signer: Account or None,
                                      func: AbiFunction or InvokeFunction, is_full: bool = False):
     if isinstance(func, AbiFunction):
         params = BuildParams.serialize_abi_function(func)
     elif isinstance(func, InvokeFunction):
         params = func.create_invoke_code()
     else:
         raise SDKException(ErrorCode.other_error('the type of func is error.'))
     contract_address = ensure_bytearray_contract_address(contract_address)
     tx = NeoVm.make_invoke_transaction(contract_address, params, b'', 0, 0)
     if signer is not None:
         tx.sign_transaction(signer)
     return self.send_raw_transaction_pre_exec(tx, is_full)
Exemplo n.º 15
0
    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], float) or isinstance(item[2], int):
                raise SDKException(
                    ErrorCode.param_err(
                        'the data type of value should be number.'))
            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,
                self.__to_int_according_to_decimal(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 handle_tx(contract_address, func_map, param_list, payer, m, sdk):
    #print("param_list:", param_list)
    #print('param_list is ', param_list)
    params = BuildParams.create_code_params_script(param_list)
    print("Second final params ------ ", param_list)

    unix_time_now = int(time())
    params.append(0x67)
    #print("final params ------ ",params)
    for i in contract_address:
        params.append(i)
    tx = Transaction(0, 0xd1, unix_time_now, m["gas_price"], m["gas_limit"],
                     payer.get_address().to_array(), params, bytearray(), [],
                     bytearray())
    sdk.add_sign_transaction(tx, payer)
    path_addr = []
    if type(func_map["signers"]) is dict:
        signers = func_map["signers"]
        if signers["m"] == 1:
            sdk.wallet_manager.open_wallet(signers["signer"]["walletpath"])
            acc = sdk.wallet_manager.get_account(signers["signer"]["address"],
                                                 signers["signer"]["password"])
            if acc is not None:
                sdk.add_sign_transaction(tx, acc)
        else:
            print("not supported multi signature")
            return "", "not supported multi signature"
    elif type(func_map["signers"]) is list:
        for signer in list(func_map["signers"]):
            if signer["m"] == 1:
                if signer["signer"]["walletpath"] not in path_addr:
                    path_addr.append(signer["signer"]["walletpath"])
                    sdk.wallet_manager.open_wallet(
                        signer["signer"]["walletpath"])
                acc = sdk.wallet_manager.get_account(
                    signer["signer"]["address"], signer["signer"]["password"])
                if acc is not None:
                    sdk.add_sign_transaction(tx, acc)
            else:
                print("not support multi signature")
                return "", "not supported multi signature"
                # TODO
    res = sdk.rpc.send_raw_transaction(tx)
    return res, ""
Exemplo n.º 17
0
def send_transaction(sdk, contract_address: bytearray, acct: Account, payer_acct: Account, gas_limit: int,
                         gas_price: int, param_list:[], pre_exec: bool):
    params = BuildParams.create_code_params_script(param_list)
    if pre_exec:
        tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 0, 0)
        if acct is not None:
            sdk.sign_transaction(tx, acct)
        return sdk.rpc.send_raw_transaction_pre_exec(tx)
    unix_time_now = int(time())
    params.append(0x67)
    for i in contract_address:
        params.append(i)
    tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, payer_acct.get_address().to_array(),
                     params, bytearray(), [], bytearray())
    if acct is not None:
        sdk.sign_transaction(tx, acct)
    if payer_acct is not None and acct is not None and acct.get_address_base58() != payer_acct.get_address_base58():
        sdk.add_sign_transaction(tx, payer_acct)
    return sdk.rpc.send_raw_transaction(tx)
Exemplo n.º 18
0
 def test_Test(self):
     payerAcct = adminAcct
     param_list = []
     param_list.append("test".encode())
     args = []
     param_list1 = []
     param_list2 = []
     param_list2.append(21)
     param_list2.append(22)
     param_list1.append(param_list2)
     param_list3 = []
     param_list3.append(31)
     param_list3.append(32)
     param_list1.append(param_list3)
     args.append(param_list1)
     param_list.append(args)
     print("***** test", param_list)
     params = BuildParams.create_code_params_script(param_list)
     hash = self.test_invoke(payerAcct, param_list)
     print("hash === test", hash)
     return True
Exemplo n.º 19
0
 def generate_unsigned_invoke_transaction(contract_address: bytearray, abi_func: AbiFunction, payer_base58: bytearray, gas_price: int,
                                          gas_limit: int):
     params = BuildParams.serialize_abi_function(abi_func)
     tx = NeoVm.make_invoke_transaction(contract_address, bytearray(params), payer_base58, gas_limit, gas_price)
     return tx
 def create_invoke_code(self):
     param_list = list()
     param_list.append(self.__func_name.encode('utf-8'))
     param_list.append(self.__parameters)
     invoke_code = BuildParams.create_code_params_script(param_list)
     return invoke_code
    def test_open_wallet_account_from_path(self):
        ''' Open wallet and get account'''
        wallet_path = "C:\\Go_WorkSpace\\src\\github.com\\ontio\\ontology\\_Wallet_\\wallet.dat"
        sdk.wallet_manager.open_wallet(wallet_path)
        acct1_addr = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        acct2_addr = "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6"
        acct3_addr = "AWf8NiLzXSDf1JB2Ae6YUKSHke4yLHMVCm"
        acct1_pwd = "xinhao"
        acct1 = sdk.wallet_manager.get_account(acct1_addr, acct1_pwd)
        acct2 = sdk.wallet_manager.get_account(acct2_addr, acct1_pwd)
        acct3 = sdk.wallet_manager.get_account(acct3_addr, acct1_pwd)
        '''export several keys'''
        account = acct3
        wif_key = account.export_wif()
        print("wif_key is ", wif_key)
        private_key_bytes = account.get_privatekey_from_wif(wif_key)
        print("private_key_bytes is ", private_key_bytes,
              type(private_key_bytes))
        private_key_str = private_key_bytes.hex()
        print("private_key_str is ", private_key_str, type(private_key_str))

        pwd = acct1_pwd
        addr = "ANjLDUU9htLKe41yxzVKpiPmFNseA3N9gc"
        salt = "XeK1Nkv8F8qKxXtLEPSbRw=="
        nounce = 16384
        scheme = SignatureScheme.SHA256withECDSA
        private_key_str = private_key_bytes.hex()
        print("private_key_str is ", private_key_str, type(private_key_str))
        ''' send transaction without signer'''
        version = 0
        tx_type = 0xd1
        unix_time_now = int(time.time())
        nonce = unix_time_now
        gas_price = 0
        gas_limit = 20000
        payer = None
        payload = None
        attributes = None
        sigs = None
        hash = None
        '''
        contract_address_str = "749a701ae89c0dbdab9b4b660ba84ee478004219"
        contract_address_bytearray = bytearray.fromhex(contract_address_str)
        contract_address = contract_address_bytearray
        contract_address.reverse()
        print('contract_address is ', contract_address)
        '''
        '''
        contract_address = util.get_asset_address("ont")
        #state = [{"address": "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6", "to": "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p", "amount": 10000}]
        b58_address = "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6"
        raw_address = Address.b58decode(b58_address)
        #sdk.neo_vm().send_transaction(contract_address, acct1,[],20000, 0, )
        invoke_code = build_native_invoke_code(contract_address, bytes([0]), "balanceOf", raw_address)
        payer = raw_address
        tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, payer, invoke_code, bytearray(), [], bytearray())
        #Transaction(0, 0xd1, unix_time_now, 0, 0, payer, invoke_code, bytearray(), [], bytearray())
        res = sdk.rpc.send_raw_transaction_pre_exec(tx)
        print('res is ', res)
        '''

        # Check balanceOf through NeoVm.make_invoke_transaction
        contract_address_str = "f328cb02bb1bd3a25c32f3db9b5f20b6fc4e04ea"
        contract_address_bytearray = bytearray.fromhex(contract_address_str)
        contract_address = contract_address_bytearray
        contract_address.reverse()
        print('contract_address is ', contract_address)
        params_list = []
        params_list.append(str("BalanceOf").encode())
        param = []
        b58_address = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        param.append(Address.b58decode(b58_address).to_array())
        params_list.append(param)
        params = BuildParams.create_code_params_script(params_list)
        # when pre-execute, don't use 0x67
        tx = NeoVm.make_invoke_transaction(bytearray(contract_address),
                                           bytearray(params), b'', 20000, 0)
        res = sdk.rpc.send_raw_transaction_pre_exec(tx)
        print("BalanceOf is ", res)

        # # Check totalsupply
        # params_list = []
        # params_list.append(str("totalSupply").encode())
        # param = [10]
        # params_list.append(param)
        # params = BuildParams.create_code_params_script(params_list)
        # # when pre-execute, don't use 0x67
        # tx = NeoVm.make_invoke_transaction(bytearray(contract_address), bytearray(params), b'', 20000, 0)
        # res = sdk.rpc.send_raw_transaction_pre_exec(tx)
        # print('totalsupply is ', res)
        #
        # # Transfer through Transaction, send_raw_transaction
        # params_list = []
        # params_list.append(str("transfer").encode())
        # from_addr = "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6"
        # to_addr = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        # value = 100
        # param = []
        # param.append(Address.b58decode(from_addr).to_array())
        # param.append(Address.b58decode(to_addr).to_array())
        # param.append(value)
        # params_list.append(param)
        # params = BuildParams.create_code_params_script(params_list)
        # # when execute, use 0x67, then add the contract_address
        # params.append(0x67)
        # for i in contract_address:
        #     params.append(i)
        # payer_raw_address = acct2.get_address().to_array()
        # payer_acct = acc2
        # unix_time_now = int(time.time())
        # tx = Transaction(0, 0xd1, unix_time_now, gas_price, gas_limit, payer_raw_address, params, bytearray(), [], bytearray())
        # sdk.sign_transaction(tx, acct2)
        # #sdk.add_sign_transaction(tx, payer_acct)
        # sdk.rpc.send_raw_transaction(tx)
        # # # Transfer through send_Transaction
        # # balance_Of_Addr = "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6"
        # # func = AbiFunction("balanceOf", "Integer", [])
        # # func.set_params_value((binascii.a2b_hex(balance_Of_Addr)))
        # # balance = sdk.neo_vm().send_transaction(contract_address, None, None, 0, 0, func, True)
        # # Transfer through Transaction, send_raw_transaction

        ### check balance before transferMulti###
        print('### check balance Before transferMulti ###')
        params_list = []
        params_list.append(str("BalanceOf").encode())
        param = []
        b58_address = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        param.append(Address.b58decode(b58_address).to_array())
        params_list.append(param)
        params = BuildParams.create_code_params_script(params_list)
        # when pre-execute, don't use 0x67
        tx = NeoVm.make_invoke_transaction(bytearray(contract_address),
                                           bytearray(params), b'', 20000, 0)
        res = sdk.rpc.send_raw_transaction_pre_exec(tx)
        print("before TransferMulti, the balance is ", res)

        ### transferMulti
        params_list = []
        params_list.append(str("TransferMulti").encode())
        from_addr1 = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        from_addr2 = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        to_addr1 = "ASUwFccvYFrrWR6vsZhhNszLFNvCLA5qS6"
        to_addr2 = "AWf8NiLzXSDf1JB2Ae6YUKSHke4yLHMVCm"
        value1 = 10000
        value2 = 10000
        param1 = []
        param1.append(Address.b58decode(from_addr1).to_array())
        param1.append(Address.b58decode(to_addr1).to_array())
        param1.append(value1)
        param2 = []
        param2.append(Address.b58decode(from_addr2).to_array())
        param2.append(Address.b58decode(to_addr2).to_array())
        param2.append(value2)
        params_list_tmp = []
        params_list_tmp.append(param1)
        params_list_tmp.append(param2)
        params_list.append(params_list_tmp)
        # params_list.append(param1)
        # params_list.append(param2)
        print(" params_list is ", params_list)
        print(" contract_address is ", contract_address)
        params = BuildParams.create_code_params_script(params_list)
        # when execute, use 0x67, then add the contract_address
        params.append(0x67)
        for i in contract_address:
            params.append(i)
        payer_raw_address = acct1.get_address().to_array()
        unix_time_now = int(time.time())
        tx = Transaction(0, 0xd1, unix_time_now, gas_price,
                         gas_limit, payer_raw_address, params, bytearray(), [],
                         bytearray())
        tx = sdk.sign_transaction(tx, acct1)
        # sdk.add_sign_transaction(tx, payer_acct)
        tx_hash = sdk.rpc.send_raw_transaction(tx)
        print('tx_hash is ', tx_hash)
        time.sleep(12)
        event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
        # event = sdk.rpc.get_block_by_hash(tx_hash)
        print("event is ", event)
        # print("tx_hash is ", tx_hash)
        # event = sdk.rpc.get_smart_contract_event_by_tx_hash(tx_hash)
        # print("event is ", event)

        #check balance After transferMulti
        print('### check balance After transferMulti ###')
        params_list = []
        params_list.append(str("BalanceOf").encode())
        param = []
        b58_address = "AQf4Mzu1YJrhz9f3aRkkwSm9n3qhXGSh4p"
        param.append(Address.b58decode(b58_address).to_array())
        params_list.append(param)
        params = BuildParams.create_code_params_script(params_list)
        # when pre-execute, don't use 0x67
        tx = NeoVm.make_invoke_transaction(bytearray(contract_address),
                                           bytearray(params), b'', 20000, 0)

        res = sdk.rpc.send_raw_transaction_pre_exec(tx)
        print("After TransferMulti, the balance is ", res)