Creates asset of type "dataset", having `UrlFiles`, with good defaults.
It can be called after instantiating Ocean object.
**Parameters**
*`name` - name of the asset, `string`
*`url` - url that is stored in the asset, `string`
*`publisher_wallet` - wallet of the asset publisher/owner, `Brownie account`
*`wait_for_aqua` - boolean value which default is `True`, waiting for aquarius to fetch the asset takes additional time, but if you want to be sure that your asset is indexed, keep the default value.
**Returns**
`tuple`
A tuple which contains the data NFT, datatoken and the data asset.
Create asset of type "algorithm", having `UrlFiles`, with good defaults.
It can be called after instantiating Ocean object.
**Parameters**:
*`name` - name of the asset, `string`
*`url` - url that is stored in the asset, `string`
*`publisher_wallet` - wallet of the asset publisher/owner, `Brownie account`
*`image` - docker image of that algorithm, `string`
*`tag` - docker tag for that algorithm image, `string`
*`checksum` - docker checksum for algorithm's image, `string`
*`wait_for_aqua` - boolean value which default is `True`, waiting for aquarius to fetch the asset takes additional time, but if you want to be sure that your asset is indexed, keep the default value.
**Returns**
`tuple`
A tuple which contains the algorithm NFT, algorithm datatoken and the algorithm asset.
Creates asset of type "data", having `ArweaveFile`, with good defaults.
It can be called after instantiating Ocean object.
**Parameters**
*`name` - name of the asset, `string`
*`transaction_id` - transaction id from the arweave file, `string`
*`publisher_wallet` - wallet of the asset publisher/owner, `Brownie account`
*`wait_for_aqua` - boolean value which default is `True`, waiting for aquarius to fetch the asset takes additional time, but if you want to be sure that your asset is indexed, keep the default value.
**Returns**
`tuple`
A tuple which contains the data NFT, datatoken and the data asset.
Creates asset of type "data", having `GraphqlQuery` files, with good defaults.
It can be called after instantiating Ocean object.
**Parameters**
*`name` - name of the asset, `string`
*`url` - url of subgraph that you are using, `string`
*`query` - GraphQL query, `string`
*`publisher_wallet` - wallet of the asset publisher/owner, `Brownie account`
*`wait_for_aqua` - boolean value which default is `True`, waiting for aquarius to fetch the asset takes additional time, but if you want to be sure that your asset is indexed, keep the default value.
**Returns**
`tuple`
A tuple which contains the data NFT, datatoken and the data asset.
Creates asset of type "data", having `SmartContractCall` files, with good defaults.
It can be called after instantiating Ocean object.
**Parameters**
*`name` - name of the asset, `string`
*`contract_address` - contract address that should be stored in the asset, `string`
*`contract_abi` - ABI of functions presented in the contract, `string`
*`publisher_wallet` - wallet of the asset publisher/owner, `Brownie account`
*`wait_for_aqua` - boolean value which default is `True`, waiting for aquarius to fetch the asset takes additional time, but if you want to be sure that your asset is indexed, keep the default value.
**Returns**
`tuple`
A tuple which contains the data NFT, datatoken and the data asset.
Register an asset on-chain. Asset = {data\_NFT, >=0 datatokens, DDO}
Creating/deploying a DataNFT contract and in the Metadata store (Aquarius).
**Parameters**
*`metadata`: `dictionary` conforming to the Metadata accepted by Ocean Protocol. 
*`publisher_wallet`- `Brownie account` of the publisher registering this asset.
*`credentials` - credentials `dictionary` necessary for the asset, which establish who can consume the asset and who cannot.
*`data_nft_address`- hex string, the address of the data NFT. The new asset will be associated with this data NFT address.
*`data_nft_args`- object of DataNFTArguments type if creating a new one.
*`deployed_datatokens`- list of datatokens which are already deployed.
*`services` - list of `Service` objects if you want to run multiple services for a datatoken or you have multiple datatokens with a single service each.
*`datatoken_args` - list of objects of `DatatokenArguments` type if creating a new datatokens.
*`encrypt_flag`- bool for encryption of the DDO.
*`compress_flag`- bool for compression of the DDO.
*`wait_for_aqua`- bool for spending time waiting for DDO to be updated in Aquarius.
**Returns**
`tuple`
A tuple which contains the data NFT, datatoken and the data asset.
The DDO is stored on-chain. It's encrypted and compressed by default. Therefore it supports GDPR "right-to-be-forgotten" compliance rules by default.
You can control this during `create()`:
* To disable encryption, use `ocean.assets.create(..., encrypt_flag=False)`.
* To disable compression, use `ocean.assets.create(..., compress_flag=False)`.
* To disable both, use `ocean.assetspy.create(..., encrypt_flag=False, compress_flag=False)`.
#### Create _just_ a data NFT
Calling `create()` like above generates a data NFT, a datatoken for that NFT, and a ddo. This is the most common case. However, sometimes you may want _just_ the data NFT, e.g. if using a data NFT as a simple key-value store. Here's how:
If you call `create()` after this, you can pass in an argument `data_nft_address:string` and it will use that NFT rather than creating a new one.
#### Create a datatoken from a data NFT
Calling `create()` like above generates a data NFT, a datatoken for that NFT, and a ddo object. However, we may want a second datatoken. Or, we may have started with _just_ the data NFT, and want to add a datatoken to it. Here's how:
If you call `create()` after this, you can pass in an argument `deployed_datatokens:List[Datatoken1]` and it will use those datatokens during creation.
#### Create an asset & pricing schema simultaneously
Ocean Assets allows you to bundle several common scenarios as a single transaction, thus lowering gas fees.
Any of the `ocean.assets.create_<type>_asset()` functions can also take an optional parameter that describes a bundled pricing schema (Dispenser or Fixed Rate Exchange). 
Here is an example involving an exchange:
{% code overflow="wrap" %}
```python
from ocean_lib.models.fixed_rate_exchange import ExchangeArguments
*`consumer_wallet` - Brownie account for the wallet that "ordered" the asset.
*`destination` - destination path, as string, where the asset will be downloaded.
*`order_tx_id` - transaction ID for the placed order, string and bytes formats are accepted.
**Optional parameters**
*`service` - optionally if you want to provide the `Service` object through you downloaded the asset.
*`index` - optionally if you want to download certain files, not the whole asset, you can specify how many files you want to download as positive `integer` format.
*`userdata` - `dictionary` additional data from user.
Pays for compute service by calling `initializeCompute` endpoint from Provider to retrieve the provider fees and starting the order afterwards.
**Parameters**
*`datasets` - list of `ComputeInput` objects, each of them includes mandatory the DDO and service.
*`algorithm_data` - which can be either a `ComputeInput` object which contains the whole DDO and service, either provide just the algorithm metadata as `AlgorithmMetadata`.
*`compute_environment` - `string` that represents the ID from the chosen C2D environment.
*`valid_until` - `UNIX timestamp` which represents until when the algorithm can be used/run.
*`consume_market_order_fee_address` - string address which denotes the consume market fee address for that order and can be the wallet address itself.
*`wallet` - the `Brownie account` which pays for the compute service
**Optional parameters**
*`consumer_address` - is the string address of the C2D environment consumer.
**Returns**
`tuple`
Return value is a tuple composed of list of datasets and algorithm data (if exists in result), `(datasets, algorithm_data)`.