def test_invalid_fulfillment_initialization(user_ffill, user_pub):
    from bigchaindb_common.transaction import Fulfillment

    with raises(TypeError):
        Fulfillment(user_ffill, user_pub)
    with raises(TypeError):
        Fulfillment(user_ffill, [], tx_input='somethingthatiswrong')
def test_fulfillment_deserialization_with_invalid_fulfillment(user_pub):
    from bigchaindb_common.transaction import Fulfillment

    ffill = {
        'owners_before': [user_pub],
        'fulfillment': None,
        'input': None,
    }
    with raises(TypeError):
        Fulfillment.from_dict(ffill)
def test_fulfillment_deserialization_with_invalid_fulfillment_uri(user_pub):
    from bigchaindb_common.exceptions import InvalidSignature
    from bigchaindb_common.transaction import Fulfillment

    ffill = {
        'owners_before': [user_pub],
        'fulfillment': 'an invalid fulfillment',
        'input': None,
    }
    with raises(InvalidSignature):
        Fulfillment.from_dict(ffill)
def test_fulfillment_serialization(ffill_uri, user_pub):
    from bigchaindb_common.transaction import Fulfillment
    from cryptoconditions import Fulfillment as CCFulfillment

    expected = {
        'owners_before': [user_pub],
        'fulfillment': ffill_uri,
        'input': None,
    }
    ffill = Fulfillment(CCFulfillment.from_uri(ffill_uri), [user_pub])
    assert ffill.to_dict() == expected
def test_fulfillment_deserialization_with_unsigned_fulfillment(ffill_uri,
                                                               user_pub):
    from bigchaindb_common.transaction import Fulfillment
    from cryptoconditions import Fulfillment as CCFulfillment

    expected = Fulfillment(CCFulfillment.from_uri(ffill_uri), [user_pub])
    ffill = {
        'owners_before': [user_pub],
        'fulfillment': CCFulfillment.from_uri(ffill_uri),
        'input': None,
    }
    ffill = Fulfillment.from_dict(ffill)

    assert ffill == expected
def transfer_utx(user_cond, user2_cond, utx):
    from bigchaindb_common.transaction import (Fulfillment, TransactionLink,
                                               Transaction, Asset)
    user_cond = user_cond.to_dict()
    ffill = Fulfillment(utx.conditions[0].fulfillment,
                        user_cond['owners_after'], TransactionLink(utx.id, 0))
    return Transaction('TRANSFER', Asset(), [ffill], [user2_cond])
def test_multiple_fulfillment_validation_of_transfer_tx(user_ffill, user_cond,
                                                        user_priv, user2_pub,
                                                        user2_priv, user3_pub,
                                                        user3_priv):
    from copy import deepcopy
    from bigchaindb_common.transaction import (Transaction, TransactionLink,
                                               Fulfillment, Condition, Asset)
    from cryptoconditions import Ed25519Fulfillment

    tx = Transaction(Transaction.CREATE, Asset(),
                     [user_ffill, deepcopy(user_ffill)],
                     [user_cond, deepcopy(user_cond)])
    tx.sign([user_priv])

    fulfillments = [Fulfillment(cond.fulfillment, cond.owners_after,
                                TransactionLink(tx.id, index))
                    for index, cond in enumerate(tx.conditions)]
    conditions = [Condition(Ed25519Fulfillment(public_key=user3_pub),
                            [user3_pub]),
                  Condition(Ed25519Fulfillment(public_key=user3_pub),
                            [user3_pub])]
    transfer_tx = Transaction('TRANSFER', tx.asset, fulfillments, conditions)
    transfer_tx = transfer_tx.sign([user_priv])

    assert transfer_tx.fulfillments_valid(tx.conditions) is True
def user2_ffill(user2_Ed25519, user2_pub):
    from bigchaindb_common.transaction import Fulfillment
    return Fulfillment(user2_Ed25519, [user2_pub])
def user_user2_threshold_ffill(user_user2_threshold, user_pub, user2_pub):
    from bigchaindb_common.transaction import Fulfillment
    return Fulfillment(user_user2_threshold, [user_pub, user2_pub])