Exemplo n.º 1
0
    def test_wallet_funds(self):
        hub_mba = MinimumAvailableBalanceMarker(wallet=self.hub_wallet,
                                                amount=1,
                                                eon_number=3)

        mba_checksum = hub_mba.checksum()

        sign = Signature(wallet=self.hub_wallet,
                         checksum=crypto.hex_value(mba_checksum),
                         value=crypto.encode_signature(
                             crypto.sign_message(
                                 mba_checksum, self.hub_private.to_string())))

        sign.save()
        hub_mba.signature = sign
        hub_mba.save()

        hub_state = ActiveState(wallet=self.hub_wallet,
                                eon_number=3,
                                updated_spendings=4,
                                updated_gains=76,
                                tx_set_hash=uuid.uuid4().hex,
                                tx_set_index=2)

        state_checksum = hub_state.checksum()
        sign = Signature(
            wallet=self.hub_wallet,
            checksum=crypto.hex_value(state_checksum),
            value=crypto.encode_signature(
                crypto.sign_message(state_checksum,
                                    self.hub_private.to_string())))
        sign.save()
        hub_state.wallet_signature = sign
        hub_state.save()

        transfer = Transfer(
            wallet=self.hub_wallet,
            sender_balance_marker=hub_mba,
            amount=100000,
            eon_number=NOCUSTContractInterface().get_current_eon_number(),
            recipient=self.wallet,
            nonce=random.randint(1, 1000),
            sender_active_state=hub_state,
            passive=True)
        transfer.save()

        response = self.client.post(self.url, data=self.payload).json()
        self.assertEqual(response, "Ok")
Exemplo n.º 2
0
    def update(self, swap, validated_data):
        with transaction.atomic():
            current_eon = LocalViewInterface.latest().eon_number()
            swap_set = Transfer.objects.select_for_update().filter(
                tx_id=swap.tx_id, eon_number__gte=current_eon,
                swap=True).order_by('eon_number')

            current_swap = swap_set[0]

            if current_swap.complete:
                raise serializers.ValidationError(
                    detail='', code=ErrorCode.SWAP_ALREADY_FULFILLED)
            elif current_swap.cancelled:
                raise serializers.ValidationError(
                    detail='', code=ErrorCode.SWAP_ALREADY_FROZEN)
            elif current_swap.voided:
                raise serializers.ValidationError(
                    detail='', code=ErrorCode.SWAP_ALREADY_VOIDED)
            elif current_swap.processed:
                raise serializers.ValidationError(
                    detail='', code=ErrorCode.SWAP_ALREADY_CLOSED)

            freezing_signature_data = validated_data.pop('freezing_signature')
            freezing_checksum = crypto.hex_value(
                current_swap.swap_cancellation_message_checksum())
            freezing_signature = Signature(
                wallet=current_swap.wallet,
                checksum=freezing_checksum,
                value=freezing_signature_data.get('value'))

            if not freezing_signature.is_valid():
                raise serializers.ValidationError(
                    detail='', code=ErrorCode.INVALID_FREEZING_SIGNATURE)
            freezing_signature.save()

            # only current swap should be locked, future swaps are not matched
            with current_swap.lock(
                    auto_renewal=False), current_swap.wallet.lock(
                        auto_renewal=False), current_swap.recipient.lock(
                            auto_renewal=False):
                swap_set.update(cancelled=True,
                                swap_freezing_signature=freezing_signature)
        return current_swap