Beispiel #1
0
def test_nft_access(client, provider_account, consumer_account):
    keeper = keeper_instance()
    ddo = get_nft_ddo(provider_account, providers=[provider_account.address])
    asset_id = ddo.asset_id
    nft_amounts = 1

    keeper.nft_upgradeable.transfer_nft(asset_id, consumer_account.address,
                                        nft_amounts, provider_account)

    assert keeper.nft_upgradeable.balance(consumer_account.address,
                                          asset_id) >= nft_amounts

    nft_access_service_agreement = ServiceAgreement.from_ddo(
        ServiceTypes.NFT_ACCESS, ddo)
    agreement_id = ServiceAgreement.create_new_agreement_id()

    (nft_access_cond_id, nft_holder_cond_id
     ) = nft_access_service_agreement.generate_agreement_condition_ids(
         agreement_id, asset_id, consumer_account.address, keeper)

    print('NFT_ACCESS_DID: ' + asset_id)

    keeper.nft_access_template.create_agreement(
        agreement_id, asset_id, [nft_holder_cond_id, nft_access_cond_id],
        nft_access_service_agreement.conditions_timelocks,
        nft_access_service_agreement.conditions_timeouts,
        consumer_account.address, consumer_account)
    event = keeper.nft_access_template.subscribe_agreement_created(
        agreement_id, 15, None, (), wait=True, from_block=0)
    assert event, "Agreement event is not found, check the keeper node's logs"

    # generate the grant token
    grant_token = generate_access_grant_token(consumer_account,
                                              agreement_id,
                                              ddo.did,
                                              uri="/nft-access")

    # request access token
    response = client.post("/api/v1/gateway/services/oauth/token",
                           data={
                               "grant_type":
                               NeverminedJWTBearerGrant.GRANT_TYPE,
                               "assertion": grant_token
                           })
    access_token = response.get_json()["access_token"]
    index = 0
    endpoint = BaseURLs.ASSETS_URL + '/nft-access/%s/%d' % (agreement_id,
                                                            index)
    response = client.get(endpoint,
                          headers={"Authorization": f"Bearer {access_token}"})

    assert response.status == '200 OK'
    assert len(
        keeper.did_registry.get_provenance_method_events(
            'USED', did_bytes=did_to_id_bytes(ddo.did))) >= 1
Beispiel #2
0
def setup_nft_sales_agreements_environment():
    consumer_acc = get_consumer_account()
    publisher_acc = get_publisher_account()
    keeper = Keeper.get_instance()

    ddo = get_ddo_nft_sample()

    did_seed = generate_prefixed_id()
    asset_id = keeper.did_registry.hash_did(did_seed, publisher_acc.address)
    ddo._did = DID.did(asset_id)

    keeper.did_registry.register_mintable_did(
        did_seed,
        checksum=Web3Provider.get_web3().toBytes(hexstr=ddo.asset_id),
        url='http://172.17.0.1:5000',
        cap=10,
        royalties=10,
        account=publisher_acc,
        providers=None)

    keeper.did_registry.mint(ddo.asset_id, 10, account=publisher_acc)

    service_agreement = ServiceAgreement.from_ddo(ServiceTypes.NFT_SALES, ddo)
    agreement_id = ServiceAgreement.create_new_agreement_id()
    price = service_agreement.get_price()
    (access_cond_id, lock_cond_id,
     escrow_cond_id) = service_agreement.generate_agreement_condition_ids(
         agreement_id, asset_id, consumer_acc.address, keeper)

    nft_access_service_agreement = ServiceAgreement.from_ddo(
        ServiceTypes.NFT_ACCESS, ddo)
    nft_access_agreement_id = ServiceAgreement.create_new_agreement_id()

    (nft_access_cond_id, nft_holder_cond_id
     ) = nft_access_service_agreement.generate_agreement_condition_ids(
         nft_access_agreement_id, asset_id, consumer_acc.address, keeper)

    return (keeper, ddo, publisher_acc, consumer_acc, agreement_id,
            nft_access_agreement_id, asset_id, price, service_agreement,
            nft_access_service_agreement, (lock_cond_id, access_cond_id,
                                           escrow_cond_id),
            (nft_access_cond_id, nft_holder_cond_id))
Beispiel #3
0
 def order(self, did, index, consumer_account, account):
     agreement_id = ServiceAgreement.create_new_agreement_id()
     logger.debug(f'about to request create agreement: {agreement_id}')
     self._agreements.create(
         did,
         index,
         agreement_id,
         consumer_account.address,
         account
     )
     return agreement_id
Beispiel #4
0
    def prepare(self, did, consumer_account, service_index):
        """

        :param did: str representation fo the asset DID. Use this to retrieve the asset DDO.
        :param consumer_account: Account instance of the consumer
        :param service_index: int identifies the specific service in
         the ddo to use in this agreement.
        :return: tuple (agreement_id: str, signature: hex str)
        """
        agreement_id = ServiceAgreement.create_new_agreement_id()
        signature = self._sign(agreement_id, did, consumer_account, service_index)
        return agreement_id, signature
Beispiel #5
0
def test_store_and_retrieve_service(metadata_instance, json_service):
    agreement_id = ServiceAgreement.create_new_agreement_id()
    service = Service.from_json(json_service)

    # store the service agreement
    result = metadata_instance.store_service_agreement(agreement_id, service)
    assert result is True

    result = metadata_instance.get_service_agreement(agreement_id)
    assert result.type == service.type
    assert result.index == service.index
    assert result.service_endpoint == service.service_endpoint
    assert result.attributes == service.attributes
Beispiel #6
0
def place_order(provider_account,
                ddo,
                consumer_account,
                service_type=ServiceTypes.ASSET_ACCESS):
    keeper = keeper_instance()
    agreement_id = ServiceAgreement.create_new_agreement_id()

    if service_type == ServiceTypes.ASSET_ACCESS:
        agreement_template = keeper.access_template
    elif service_type == ServiceTypes.ASSET_ACCESS_PROOF:
        agreement_template = keeper.access_proof_template
    elif service_type == ServiceTypes.NFT_SALES:
        agreement_template = keeper.nft_sales_template
    elif service_type == ServiceTypes.CLOUD_COMPUTE:
        agreement_template = keeper.escrow_compute_execution_template
    else:
        raise NotImplementedError(
            "The agreement template could not be created.")

    publisher_address = provider_account.address

    service_agreement = ServiceAgreement.from_ddo(service_type, ddo)

    if service_type == ServiceTypes.ASSET_ACCESS_PROOF:
        consumer_pub = get_buyer_public_key()
        condition_ids = service_agreement.generate_agreement_condition_ids(
            agreement_id, ddo.asset_id, consumer_pub, keeper)
    else:
        condition_ids = service_agreement.generate_agreement_condition_ids(
            agreement_id, ddo.asset_id, consumer_account.address, keeper)

    time_locks = service_agreement.conditions_timelocks
    time_outs = service_agreement.conditions_timeouts
    agreement_template.create_agreement(agreement_id, ddo.asset_id,
                                        condition_ids, time_locks, time_outs,
                                        consumer_account.address,
                                        consumer_account)

    return agreement_id
Beispiel #7
0
def setup_did_sales_agreements_environment():
    consumer_acc = get_consumer_account()
    publisher_acc = get_publisher_account()
    keeper = Keeper.get_instance()

    ddo = get_ddo_did_sales_sample()

    did_seed = generate_prefixed_id()
    asset_id = keeper.did_registry.hash_did(did_seed, publisher_acc.address)
    ddo._did = DID.did(asset_id)

    keeper.did_registry.register(
        did_seed,
        checksum=Web3Provider.get_web3().toBytes(hexstr=ddo.asset_id),
        url='metadata:5000',
        account=publisher_acc,
        providers=None)

    service_agreement = ServiceAgreement.from_ddo(ServiceTypes.DID_SALES, ddo)
    agreement_id = ServiceAgreement.create_new_agreement_id()
    price = service_agreement.get_price()
    (access_cond_id, lock_cond_id,
     escrow_cond_id) = service_agreement.generate_agreement_condition_ids(
         agreement_id, asset_id, consumer_acc.address, keeper)

    return (
        keeper,
        ddo,
        publisher_acc,
        consumer_acc,
        agreement_id,
        asset_id,
        price,
        service_agreement,
        (lock_cond_id, access_cond_id, escrow_cond_id),
    )
Beispiel #8
0
def setup_agreements_environment(ddo_sample):
    consumer_acc = get_consumer_account()
    publisher_acc = get_publisher_account()
    keeper = Keeper.get_instance()

    ddo = ddo_sample
    ddo._did = DID.did({"0": generate_prefixed_id()})

    keeper.did_registry.register(
        ddo.asset_id,
        checksum=Web3Provider.get_web3().toBytes(hexstr=ddo.asset_id),
        url='localhost:5000',
        account=publisher_acc,
        providers=None
    )

    registered_ddo = ddo
    asset_id = registered_ddo.asset_id
    service_agreement = ServiceAgreement.from_ddo(ServiceTypes.ASSET_ACCESS, ddo)
    agreement_id = ServiceAgreement.create_new_agreement_id()
    price = service_agreement.get_price()
    access_cond_id, lock_cond_id, escrow_cond_id = \
        service_agreement.generate_agreement_condition_ids(
            agreement_id, asset_id, consumer_acc.address, publisher_acc.address, keeper
        )

    return (
        keeper,
        publisher_acc,
        consumer_acc,
        agreement_id,
        asset_id,
        price,
        service_agreement,
        (lock_cond_id, access_cond_id, escrow_cond_id),
    )
Beispiel #9
0
def test_nfts_flow(publisher_instance_no_init, consumer_instance_no_init):
    config = ExampleConfig.get_config()
    ConfigProvider.set_config(config)
    keeper = Keeper.get_instance()

    pub_acc = get_publisher_account()

    # Register ddo
    ddo = get_registered_ddo_nft(publisher_instance_no_init, pub_acc)
    asset_id = ddo.asset_id
    nft_amounts = 1
    assert isinstance(ddo, DDO)

    consumer_account = get_consumer_account()

    consumer_instance_no_init.accounts.request_tokens(consumer_account, 100)

    service_sales = ddo.get_service(service_type=ServiceTypes.NFT_SALES)
    sa_sales = ServiceAgreement.from_service_dict(
        service_sales.as_dictionary())

    amounts = sa_sales.get_amounts_int()
    receivers = sa_sales.get_receivers()
    number_nfts = sa_sales.get_number_nfts()
    token_address = keeper.token.address

    sales_agreement_id = consumer_instance_no_init.assets.order(
        ddo.did, sa_sales.index, consumer_account, consumer_account)

    sales_agreement = keeper.agreement_manager.get_agreement(
        sales_agreement_id)
    assert sales_agreement.did == asset_id, ''

    lock_cond_id = sales_agreement.condition_ids[0]
    access_cond_id = sales_agreement.condition_ids[1]
    escrow_cond_id = sales_agreement.condition_ids[2]

    # transfer the nft
    keeper.transfer_nft_condition.fulfill(sales_agreement_id, asset_id,
                                          consumer_account.address,
                                          nft_amounts, lock_cond_id, pub_acc)

    # escrow payment
    keeper.escrow_payment_condition.fulfill(
        sales_agreement_id, asset_id, amounts, receivers,
        keeper.escrow_payment_condition.address, token_address, lock_cond_id,
        access_cond_id, pub_acc)

    assert keeper.condition_manager.get_condition_state(lock_cond_id) == 2, ''
    assert keeper.condition_manager.get_condition_state(
        access_cond_id) == 2, ''
    assert keeper.condition_manager.get_condition_state(
        escrow_cond_id) == 2, ''

    assert keeper.did_registry.balance(consumer_account.address,
                                       asset_id) >= number_nfts

    # CHECK ACCESS CREATING THE AGREEMENT
    nft_access_service_agreement = ServiceAgreement.from_ddo(
        ServiceTypes.NFT_ACCESS, ddo)
    sa_access = ddo.get_service(service_type=ServiceTypes.NFT_ACCESS)
    nft_access_agreement_id = consumer_instance_no_init.assets.order(
        ddo.did, sa_access.index, consumer_account, consumer_account)

    event = keeper.nft_access_template.subscribe_agreement_created(
        nft_access_agreement_id,
        10,
        log_event(keeper.nft_access_template.AGREEMENT_CREATED_EVENT), (),
        wait=True)
    assert event, 'no event for AgreementCreated '

    time.sleep(3)
    keeper.nft_holder_condition.fulfill(nft_access_agreement_id, asset_id,
                                        consumer_account.address, number_nfts,
                                        consumer_account)
    time.sleep(3)
    keeper.nft_access_condition.fulfill(nft_access_agreement_id, asset_id,
                                        consumer_account.address, pub_acc)
    time.sleep(3)

    access_agreement = keeper.agreement_manager.get_agreement(
        nft_access_agreement_id)
    assert access_agreement.did == asset_id, ''

    nft_holder_cond_id = access_agreement.condition_ids[0]
    nft_access_cond_id = access_agreement.condition_ids[1]

    assert keeper.condition_manager.get_condition_state(
        nft_access_cond_id) == 2, ''
    assert keeper.condition_manager.get_condition_state(
        nft_holder_cond_id) == 2, ''

    # AND HERE TESTING WITHOUT CREATING THE AGREEMENT
    service_access = ddo.get_service(service_type=ServiceTypes.NFT_ACCESS)

    no_agreement_id = '0x'

    assert consumer_instance_no_init.assets.access(
        no_agreement_id,
        ddo.did,
        service_access.index,
        consumer_account,
        config.downloads_path,
        service_type=ServiceTypes.NFT_ACCESS)

    # AND HERE CHECKING CREATING AN AGREEMENT FIRST
    nft_access_service_agreement = ServiceAgreement.from_ddo(
        ServiceTypes.NFT_ACCESS, ddo)
    nft_access_agreement_id = ServiceAgreement.create_new_agreement_id()
    (nft_access_cond_id, nft_holder_cond_id
     ) = nft_access_service_agreement.generate_agreement_condition_ids(
         nft_access_agreement_id, asset_id, consumer_account.address, keeper)

    keeper.nft_access_template.create_agreement(
        nft_access_agreement_id, asset_id,
        [nft_holder_cond_id, nft_access_cond_id],
        nft_access_service_agreement.conditions_timelocks,
        nft_access_service_agreement.conditions_timeouts,
        consumer_account.address, pub_acc)

    event = keeper.nft_access_template.subscribe_agreement_created(
        nft_access_agreement_id,
        10,
        log_event(keeper.nft_access_template.AGREEMENT_CREATED_EVENT), (),
        wait=True)
    assert event, 'no event for AgreementCreated '

    # This is because in this test the gateway is executed using the same account than the consumer
    keeper.did_registry.add_provider(asset_id, consumer_account.address,
                                     pub_acc)
    time.sleep(3)

    assert consumer_instance_no_init.assets.access(
        nft_access_agreement_id,
        ddo.did,
        service_access.index,
        consumer_account,
        config.downloads_path,
        index=0,
        service_type=ServiceTypes.NFT_ACCESS)
Beispiel #10
0
def test_nft_transfer(client, provider_account, consumer_account,
                      publisher_account):
    print('PROVIDER_ACCOUNT= ' + provider_account.address)
    print('PUBLISHER_ACCOUNT= ' + publisher_account.address)
    print('CONSUMER_ACCOUNT= ' + consumer_account.address)

    keeper = keeper_instance()
    ddo = get_nft_ddo(publisher_account, providers=[provider_account.address])
    asset_id = ddo.asset_id
    nft_amounts = 1
    agreement_id = ServiceAgreement.create_new_agreement_id()

    print('NFT_SALES_DID: ' + asset_id)

    nft_sales_service_agreement = ServiceAgreement.from_ddo(
        ServiceTypes.NFT_SALES, ddo)
    (transfer_nft_condition_id, lock_payment_condition_id,
     escrow_payment_condition_id
     ) = nft_sales_service_agreement.generate_agreement_condition_ids(
         agreement_id, asset_id, consumer_account.address, keeper)

    keeper.nft_sales_template.create_agreement(
        agreement_id, asset_id, [
            lock_payment_condition_id, transfer_nft_condition_id,
            escrow_payment_condition_id
        ], nft_sales_service_agreement.conditions_timelocks,
        nft_sales_service_agreement.conditions_timeouts,
        consumer_account.address, consumer_account)
    event = keeper.nft_sales_template.subscribe_agreement_created(agreement_id,
                                                                  15,
                                                                  None, (),
                                                                  wait=True,
                                                                  from_block=0)
    assert event, "Agreement event is not found, check the keeper node's logs"

    agreement = keeper.agreement_manager.get_agreement(agreement_id)
    cond_ids = agreement.condition_ids

    keeper.token.token_approve(keeper.lock_payment_condition.address,
                               nft_sales_service_agreement.get_price(),
                               consumer_account)

    keeper.dispenser.request_tokens(50, consumer_account)

    lock_payment(agreement_id, ddo.asset_id, nft_sales_service_agreement,
                 nft_sales_service_agreement.get_amounts_int(),
                 nft_sales_service_agreement.get_receivers(), consumer_account)
    event = keeper.lock_payment_condition.subscribe_condition_fulfilled(
        agreement_id, 15, None, (), wait=True, from_block=0)
    assert event, "Lock reward condition fulfilled event is not found, check the keeper " \
                  "node's logs"

    keeper.nft_upgradeable.set_approval_for_all(get_provider_account().address,
                                                True, publisher_account)

    time.sleep(10)

    is_approved = keeper.nft_upgradeable.is_approved_for_all(
        publisher_account.address, provider_account.address)
    assert is_approved is True

    response = client.post(BaseURLs.ASSETS_URL + '/nft-transfer',
                           json={
                               'agreementId': agreement_id,
                               'nftHolder': publisher_account.address,
                               'nftReceiver': consumer_account.address,
                               'nftAmount': nft_amounts
                           })
    assert response.status_code == 200

    assert keeper.condition_manager.get_condition_state(
        cond_ids[0]) == ConditionState.Fulfilled.value
    assert keeper.condition_manager.get_condition_state(
        cond_ids[1]) == ConditionState.Fulfilled.value
    assert keeper.condition_manager.get_condition_state(
        cond_ids[2]) == ConditionState.Fulfilled.value