code: def new_transfer_from_transaction(self, asset: str, b58_send_address: str, b58_from_address: str,
                                        b58_recv_address: str, amount: int, b58_payer_address: str, gas_limit: int,
                                        gas_price: int) -> Transaction:
          
          raw_sender = Address.b58decode(b58_send_address).to_bytes()
          raw_from = Address.b58decode(b58_from_address).to_bytes()
          raw_to = Address.b58decode(b58_recv_address).to_bytes()
          raw_payer = Address.b58decode(b58_payer_address).to_bytes()
          contract_address = self.get_asset_address(asset)
          args = {"sender": raw_sender, "from": raw_from, "to": raw_to, "amount": amount}
          invoke_code = build_native_invoke_code(contract_address, b'\x00', "transferFrom", args)
          return Transaction(0, 0xd1, int(time()), gas_price, gas_limit, raw_payer, invoke_code, bytearray(), list())
docs: This interface is used to generate a Transaction object that allow one account to transfer
          a amount of ONT or ONG Asset to another account, in the condition of the first account had been approved.
  
          :param asset: a string which is used to indicate which asset we want to transfer.
          :param b58_send_address: a base58 encode address which indicate where the asset from.
          :param b58_from_address: a base58 encode address which indicate where the asset from.
          :param b58_recv_address: a base58 encode address which indicate where the asset to.
          :param amount: the amount of asset that will be transferred.
          :param b58_payer_address: a base58 encode address which indicate who will 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: a Transaction object which allow one account to transfer a amount of asset to another account.