예제 #1
0
    def create(wallet,
               channel_name,
               asset_type,
               founder,
               founder_deposit,
               partner,
               partner_deposit,
               founder_commitment,
               comments=None):
        """

        :param wallet:
        :param channel_name:
        :param asset_type:
        :param founder:
        :param founder_deposit:
        :param partner:
        :param partner_deposit:
        :param founder_commitment:
        :param comments:
        :return:
        """
        # check the deposit
        founder_deposit = int(founder_deposit)
        partner_deposit = int(partner_deposit)
        FounderResponsesMessage.check_deposit(founder_deposit, partner_deposit)

        nonce = FounderResponsesMessage._FOUNDER_NONCE
        # start to sign content
        founder_address, _, _ = uri_parser(founder)
        partner_address, _, _ = uri_parser(partner)
        # Sign this data to the
        commitment = FounderResponsesMessage.sign_content(
            wallet, FounderResponsesMessage._sign_type_list, [
                channel_name, nonce, founder_address, founder_deposit,
                partner_address, partner_deposit
            ])

        # start add channel
        deposit = {
            founder_address: {
                asset_type: str(founder_deposit)
            },
            partner_address: {
                asset_type: str(partner_deposit)
            }
        }
        hlock = {
            founder_address: {
                asset_type: '0'
            },
            partner_address: {
                asset_type: '0'
            }
        }
        Channel.add_channel(channel=channel_name,
                            src_addr=founder,
                            dest_addr=partner,
                            state=EnumChannelState.INIT.name,
                            deposit=deposit,
                            hlock=hlock,
                            magic=get_magic())

        APIStatistics.update_statistics(wallet.address,
                                        state=EnumChannelState.INIT.name)

        # add trade to database
        founder_trade = Channel.founder_trade(
            type=EnumTradeType.TRADE_TYPE_FOUNDER,
            role=EnumTradeRole.TRADE_ROLE_PARTNER,
            asset_type=asset_type,
            balance=partner_deposit,
            peer_balance=founder_deposit,
            commitment=commitment,
            peer_commitment=founder_commitment,
            state=EnumTradeState.confirming)
        Channel.add_trade(channel_name, nonce=nonce, **founder_trade)

        # create messages
        asset_type = asset_type.upper()
        message = FounderResponsesMessage.create_message_header(
            partner, founder, FounderResponsesMessage._message_name,
            channel_name, asset_type, nonce)
        message_body = {"Commitment": commitment}
        message.update({"MessageBody": message_body})

        # Add comments in the messages
        if comments:
            message.update({"Comments": comments})

        # fill message status
        message.update({'Status': EnumResponseStatus.RESPONSE_OK.name})
        # send message to peer
        FounderResponsesMessage.send(message)

        return
예제 #2
0
    def create(wallet,
               channel_name,
               asset_type,
               founder,
               founder_deposit,
               partner,
               partner_deposit=None,
               comments=None):
        """

        :param wallet:
        :param channel_name:
        :param asset_type:
        :param founder:
        :param founder_deposit:
        :param partner:
        :param partner_deposit:
        :param comments:
        :return:
        """
        founder_deposit = int(founder_deposit)
        if partner_deposit is None:
            partner_deposit = founder_deposit
        partner_deposit = int(partner_deposit)

        # check the deposit
        FounderMessage.check_deposit(founder_deposit, partner_deposit)

        # get addresses of peers
        nonce = FounderMessage._FOUNDER_NONCE
        founder_address, _, _ = uri_parser(founder)
        partner_address, _, _ = uri_parser(partner)

        # Sign this data to hash value
        commitment = FounderMessage.sign_content(
            wallet, FounderMessage._sign_type_list, [
                channel_name, nonce, founder_address, founder_deposit,
                partner_address, partner_deposit
            ])

        # add channel
        asset_type = asset_type.upper()
        deposit = {
            founder_address: {
                asset_type: str(founder_deposit)
            },
            partner_address: {
                asset_type: str(partner_deposit)
            }
        }
        hlock = {
            founder_address: {
                asset_type: '0'
            },
            partner_address: {
                asset_type: '0'
            }
        }
        Channel.add_channel(channel=channel_name,
                            src_addr=founder,
                            dest_addr=partner,
                            state=EnumChannelState.INIT.name,
                            deposit=deposit,
                            magic=get_magic(),
                            hlock=hlock)

        APIStatistics.update_statistics(wallet.address,
                                        state=EnumChannelState.INIT.name)

        # record the transaction
        founder_trade = Channel.founder_trade(
            type=EnumTradeType.TRADE_TYPE_FOUNDER,
            role=EnumTradeRole.TRADE_ROLE_FOUNDER,
            asset_type=asset_type,
            balance=founder_deposit,
            peer_balance=partner_deposit,
            commitment=commitment)
        Channel.add_trade(channel_name, nonce=nonce, **founder_trade)

        # create founder request message
        message = FounderMessage.create_message_header(
            founder, partner, FounderMessage._message_name, channel_name,
            asset_type, nonce)
        message_body = {
            "FounderDeposit": str(founder_deposit),
            "PartnerDeposit": str(partner_deposit),
            "Commitment": commitment,
        }
        message.update({'MessageBody': message_body})

        # Add comments in the messages
        if comments:
            message.update({"Comments": comments})

        FounderMessage.send(message)
        return