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
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))
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
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
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
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
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), )
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), )
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)
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