diff --git a/SUMMARY.md b/SUMMARY.md index c779dc3a..5f18210d 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -36,6 +36,12 @@ * [Deploying Aquarius](building-with-ocean/deploying-components/deploying-aquarius.md) * [Deploying Provider](building-with-ocean/deploying-components/deploying-provider.md) * [Deploying Ocean subgraph](building-with-ocean/deploying-components/deploying-ocean-subgraph.md) + * [Using Ocean Subgraph](building-with-ocean/using-ocean-subgraph/README.md) + * [List data NFTs](building-with-ocean/using-ocean-subgraph/list-data-nfts.md) + * [List all tokens](building-with-ocean/using-ocean-subgraph/list-datatokens.md) + * [Get data NFT information](building-with-ocean/using-ocean-subgraph/get-data-nft-information.md) + * [Get datatoken information](building-with-ocean/using-ocean-subgraph/get-datatoken-information.md) + * [List Fixed Rate Exchanges](building-with-ocean/using-ocean-subgraph/list-fixed-rate-exchanges.md) * [Contributing](core-concepts/contributing.md) * [Contributor Code of Conduct](core-concepts/code-of-conduct.md) * [Legal Requirements](core-concepts/legal-reqs.md) diff --git a/building-with-ocean/using-ocean-subgraph/README.md b/building-with-ocean/using-ocean-subgraph/README.md new file mode 100644 index 00000000..10409898 --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/README.md @@ -0,0 +1,10 @@ +--- +description: >- + Ocean subgraph is an off-chain service which provides information about + datatokens, users, balances using the GraphQL. Ocean subgraph provides a + faster way to fetch data rather than on-chain query. +--- + +# Using Ocean Subgraph + +For each supported network, an individual Ocean subgraph is deployed. The information about supported networks and the subgraph URL is available on [this page](../../core-concepts/networks.md). diff --git a/building-with-ocean/using-ocean-subgraph/get-data-nft-information.md b/building-with-ocean/using-ocean-subgraph/get-data-nft-information.md new file mode 100644 index 00000000..f1f1ff2c --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/get-data-nft-information.md @@ -0,0 +1,130 @@ +# Get data NFT information + +The result of following GraphQL query returns the information about a particular datatoken. Here, `0x1c161d721e6d99f58d47f709cdc77025056c544c` is the address of the dataNFT. + +{% hint style="info" %} +Copy the query in the [graphiQL interface](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql) to fetch the results from the mainnet. For other networks, change the domain name with appropriate subgraph domain as mentioned in [this page](../../core-concepts/networks.md). +{% endhint %} + +```graphql +{ + nft (id:"0x1c161d721e6d99f58d47f709cdc77025056c544c", subgraphError:deny){ + id + name + symbol + owner + address + assetState + tx + block + transferable + creator + createdTimestamp + providerUrl + managerRole + erc20DeployerRole + storeUpdateRole + metadataRole + tokenUri + template + orderCount + } +}b +``` + +The python script below can be used to run the the query. If you wish to change the network, then replace the value of variable `base_url` as needed. Change the value of the variable dataNFT\_address with the address of the datatoken of your choice. + +{% tabs %} +{% tab title="Python" %} +{% code title="dataNFT_information.py" %} +```python +import requests +import json + +dataNFT_address = "0x1c161d721e6d99f58d47f709cdc77025056c544c" +query = """ +{{ + nft (id:"{0}", subgraphError:deny){{ + id + name + symbol + owner + address + assetState + tx + block + transferable + creator + createdTimestamp + providerUrl + managerRole + erc20DeployerRole + storeUpdateRole + metadataRole + tokenUri + template + orderCount + }} +}}""".format( + dataNFT_address +) + +base_url = "https://v4.subgraph.mainnet.oceanprotocol.com" +route = "/subgraphs/name/oceanprotocol/ocean-subgraph" + +url = base_url + route + +headers = {"Content-Type": "application/json"} +payload = json.dumps({"query": query}) +response = requests.request("POST", url, headers=headers, data=payload) +result = json.loads(response.text) + +print(json.dumps(result, indent=4, sort_keys=True)) +``` +{% endcode %} + +#### Execute script + +``` +python dataNFT_information.py +``` +{% endtab %} +{% endtabs %} + +
+ +Sample response + +```json +{ + "data": { + "nft": { + "address": "0x1c161d721e6d99f58d47f709cdc77025056c544c", + "assetState": 0, + "block": 15185270, + "createdTimestamp": 1658397870, + "creator": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "erc20DeployerRole": [ + "0x1706df1f2d93558d1d77bed49ccdb8b88fafc306" + ], + "id": "0x1c161d721e6d99f58d47f709cdc77025056c544c", + "managerRole": [ + "0xd30dd83132f2227f114db8b90f565bca2832afbd" + ], + "metadataRole": null, + "name": "Ocean Data NFT", + "orderCount": "1", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "providerUrl": "https://v4.provider.mainnet.oceanprotocol.com", + "storeUpdateRole": null, + "symbol": "OCEAN-NFT", + "template": "", + "tokenUri": "", + "transferable": true, + "tx": "0x327a9da0d2e9df945fd2f8e10b1caa77acf98e803c5a2f588597172a0bcbb93a" + } + } +} +``` + +
diff --git a/building-with-ocean/using-ocean-subgraph/get-datatoken-information.md b/building-with-ocean/using-ocean-subgraph/get-datatoken-information.md new file mode 100644 index 00000000..9e8262e2 --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/get-datatoken-information.md @@ -0,0 +1,166 @@ +# Get datatoken information + + + +The result of following GraphQL query returns the information about a particular datatoken. Here, `0x122d10d543bc600967b4db0f45f80cb1ddee43eb` is the address of the datatoken. + +{% hint style="info" %} +Copy the query in the [graphiQL interface](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql) to fetch the results from the mainnet. For other networks, change the domain name with appropriate subgraph domain as mentioned in [this page](../../core-concepts/networks.md). +{% endhint %} + +```graphql +{ + token(id:"0x122d10d543bc600967b4db0f45f80cb1ddee43eb", subgraphError: deny){ + id + symbol + nft { + name + symbol + address + } + name + symbol + cap + isDatatoken + holderCount + orderCount + orders(skip:0,first:1){ + amount + serviceIndex + payer { + id + } + consumer{ + id + } + estimatedUSDValue + lastPriceToken + lastPriceValue + } + } + fixedRateExchanges(subgraphError:deny){ + id + price + active + } +} +``` + +The python script below can be used to run the the query. If you wish to change the network, then replace the value of variable `base_url` as needed. Change the value of the variable `datatoken_address` with the address of the datatoken of your choice. + +{% tabs %} +{% tab title="Python" %} +#### Create script + +{% code title="datatoken_information.py" %} +```python +import requests +import json + +datatoken_address = "0x122d10d543bc600967b4db0f45f80cb1ddee43eb" +query = """ +{{ + token(id:"{0}", subgraphError: deny){{ + id + symbol + nft {{ + name + symbol + address + }} + name + symbol + cap + isDatatoken + holderCount + orderCount + orders(skip:0,first:1){{ + amount + serviceIndex + payer {{ + id + }} + consumer{{ + id + }} + estimatedUSDValue + lastPriceToken + lastPriceValue + }} + }} + fixedRateExchanges(subgraphError:deny){{ + id + price + active + }} +}}""".format( + datatoken_address +) + +base_url = "https://v4.subgraph.mainnet.oceanprotocol.com/" +route = "/subgraphs/name/oceanprotocol/ocean-subgraph" + +url = base_url + route + +headers = {"Content-Type": "application/json"} +payload = json.dumps({"query": query}) +response = requests.request("POST", url, headers=headers, data=payload) +result = json.loads(response.text) + +print(json.dumps(result, indent=4, sort_keys=True)) + +``` +{% endcode %} + +#### Execute script + +``` +python datatoken_information.py +``` +{% endtab %} +{% endtabs %} + +
+ +Sample response + +```json +{ + "data": { + "fixedRateExchanges": [ + { + "active": true, + "id": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02-0x06284c39b48afe5f01a04d56f1aae45dbb29793b190ee11e93a4a77215383d44", + "price": "33" + }, + { + "active": true, + "id": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02-0x2719862ebc4ed253f09088c878e00ef8ee2a792e1c5c765fac35dc18d7ef4deb", + "price": "35" + }, + { + "active": true, + "id": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02-0x2dccaa373e4b65d5ec153c150270e989d1bda1efd3794c851e45314c40809f9c", + "price": "33" + } + ], + "token": { + "cap": "115792089237316195423570985008687900000000000000000000000000", + "holderCount": "0", + "id": "0x122d10d543bc600967b4db0f45f80cb1ddee43eb", + "isDatatoken": true, + "name": "Brave Lobster Token", + "nft": { + "address": "0xea615374949a2405c3ee555053eca4d74ec4c2f0", + "name": "Ocean Data NFT", + "symbol": "OCEAN-NFT" + }, + "orderCount": "0", + "orders": [], + "symbol": "BRALOB-11" + } + } +} +``` + +
diff --git a/building-with-ocean/using-ocean-subgraph/list-data-nfts.md b/building-with-ocean/using-ocean-subgraph/list-data-nfts.md new file mode 100644 index 00000000..152b2029 --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/list-data-nfts.md @@ -0,0 +1,196 @@ +# List data NFTs + +The result of following GraphQL query returns the information about data nfts. + +{% hint style="info" %} +Copy the query in the [graphiQL interface](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql) to fetch the results from the mainnet. For other networks, change the domain name with appropriate subgraph domain as mentioned in [this page](../../core-concepts/networks.md). +{% endhint %} + +```graphql +{ + nfts (skip:0, first: 10, subgraphError:deny){ + id + name + symbol + owner + address + assetState + tx + block + transferable + } +} +``` + +The python script below can be used to run the the query. If you wish to change the network, then replace the value of variable `base_url` as needed. + +{% tabs %} +{% tab title="Python" %} +{% code title="list_dataNFTs.py" %} +```python +import requests +import json + + +query = """ +{ + nfts (skip:0, first: 10, subgraphError:deny){ + id + name + symbol + owner + address + assetState + tx + block + transferable + } +}""" + + +base_url = "https://v4.subgraph.mainnet.oceanprotocol.com" +route = "/subgraphs/name/oceanprotocol/ocean-subgraph" + +url = base_url + route + +headers = {"Content-Type": "application/json"} +payload = json.dumps({"query": query}) +response = requests.request("POST", url, headers=headers, data=payload) +result = json.loads(response.text) + +print(json.dumps(result, indent=4, sort_keys=True)) +``` +{% endcode %} + +#### Execute script + +``` +python list_dataNFTs.py +``` +{% endtab %} +{% endtabs %} + +
+ +Sample response + +```json +{ + "data": { + "nfts": [ + { + "address": "0x1c161d721e6d99f58d47f709cdc77025056c544c", + "assetState": 0, + "block": 15185270, + "id": "0x1c161d721e6d99f58d47f709cdc77025056c544c", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x327a9da0d2e9df945fd2f8e10b1caa77acf98e803c5a2f588597172a0bcbb93a" + }, + { + "address": "0x1e06501660623aa973474e3c59efb8ba542cb083", + "assetState": 0, + "block": 15185119, + "id": "0x1e06501660623aa973474e3c59efb8ba542cb083", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0xd351ccee22b505d811c29fa524db920815936672b20b8f3a09485e389902fd27" + }, + { + "address": "0x2eaa55236f799c6ebec72e77a1a6296ea2e704b1", + "assetState": 0, + "block": 15185009, + "id": "0x2eaa55236f799c6ebec72e77a1a6296ea2e704b1", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0xf6d55306ab4dc339dc1655a2d119af468a79a70fa62ea11de78879da61e89e7b" + }, + { + "address": "0x2fbe924f6c92825929dc7785fe05d15e35f2612b", + "assetState": 0, + "block": 15185235, + "id": "0x2fbe924f6c92825929dc7785fe05d15e35f2612b", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0xa9ff9d461b4b7344ea181de32fa6412c7ea8e21f485ab4d8a7b9cfcdb68d9d51" + }, + { + "address": "0x4c04433bb1760a66be7713884bb6370e9c567cef", + "assetState": 0, + "block": 15185169, + "id": "0x4c04433bb1760a66be7713884bb6370e9c567cef", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x54c5463e8988b5fa4e4cfe71ee391505801931abe9e94bf1588dd538ec3aa4c9" + }, + { + "address": "0x619c500dcb0251b31cd480030db2dcc19866c0c3", + "assetState": 0, + "block": 15236619, + "id": "0x619c500dcb0251b31cd480030db2dcc19866c0c3", + "name": "abc", + "owner": "0x12fe650c86cd4346933ef1bcab21a1979d4c6786", + "symbol": "GOAL-9956", + "transferable": true, + "tx": "0x6178b03589cda98573ff52a1afbcc07b14a2fddacc0132595949e9d8a0ed1b32" + }, + { + "address": "0x6d45a5b38a122a6dbc042601236d6ecc5c8e343e", + "assetState": 0, + "block": 15109853, + "id": "0x6d45a5b38a122a6dbc042601236d6ecc5c8e343e", + "name": "Ocean Data NFT", + "owner": "0xbbd33afa85539fa65cc08a2e61a001876d2f13fe", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x27aa77a0bf3f7878910dc7bfe2116d9271138c222b3d898381a5c72eefefe624" + }, + { + "address": "0x7400078c5d4fd7704afca45a928d9fc97cbea744", + "assetState": 0, + "block": 15185056, + "id": "0x7400078c5d4fd7704afca45a928d9fc97cbea744", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x2025374cd347e25e2651feec2f2faa2feb26664698eaea42b5dad1a31eda57f8" + }, + { + "address": "0x81decdb59dce5b4323e683a76f8fa8dd0eabc560", + "assetState": 0, + "block": 15185003, + "id": "0x81decdb59dce5b4323e683a76f8fa8dd0eabc560", + "name": "Ocean Data NFT", + "owner": "0xd30dd83132f2227f114db8b90f565bca2832afbd", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x6ad6ec2ce86bb70e077590a64c886d72975374bd2e993f143d9da8edcaace82b" + }, + { + "address": "0x8684119ecf77c5be41f01760ad466725ffd9b960", + "assetState": 0, + "block": 14933034, + "id": "0x8684119ecf77c5be41f01760ad466725ffd9b960", + "name": "Ocean Data NFT", + "owner": "0x87b5606fba13529e1812319d25c6c2cd5c3f3cbc", + "symbol": "OCEAN-NFT", + "transferable": true, + "tx": "0x55ba746cd8e8fb4c739b8544a9034848082b627500b854cb8db0802dd7beb172" + } + ] + } +} +``` + +
diff --git a/building-with-ocean/using-ocean-subgraph/list-datatokens.md b/building-with-ocean/using-ocean-subgraph/list-datatokens.md new file mode 100644 index 00000000..7ab4ee61 --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/list-datatokens.md @@ -0,0 +1,150 @@ +# List all tokens + +The result of following GraphQL query returns the information about datatokens. + +{% hint style="info" %} +Copy the query in the [graphiQL interface](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql) to fetch the results from the mainnet. For other networks, change the domain name with appropriate subgraph domain as mentioned in [this page](../../core-concepts/networks.md). +{% endhint %} + +```graphql +{ + tokens(skip:0, first: 2, subgraphError: deny){ + id + symbol + nft { + name + symbol + address + } + name + symbol + cap + isDatatoken + holderCount + orderCount + orders(skip:0,first:1){ + amount + serviceIndex + payer { + id + } + consumer{ + id + } + estimatedUSDValue + lastPriceToken + lastPriceValue + } + } +} +``` + +The python script below can be used to run the the query. If you wish to change the network, then replace the value of variable `base_url` as needed. + +{% tabs %} +{% tab title="Python" %} +#### Create script + +{% code title="list_all_tokens.py" %} +```python +import requests +import json + +query = """ +{{ + tokens(skip:0, first: 2, subgraphError: deny){{ + id + symbol + nft {{ + name + symbol + address + }} + name + symbol + cap + isDatatoken + holderCount + orderCount + orders(skip:0,first:1){{ + amount + serviceIndex + payer {{ + id + }} + consumer{{ + id + }} + estimatedUSDValue + lastPriceToken + lastPriceValue + }} + + + }} +}}""" + +base_url = "https://v4.subgraph.mainnet.oceanprotocol.com" +route = "/subgraphs/name/oceanprotocol/ocean-subgraph" + +url = base_url + route + +headers = {"Content-Type": "application/json"} +payload = json.dumps({"query": query}) +response = requests.request("POST", url, headers=headers, data=payload) +result = json.loads(response.text) + +print(json.dumps(result, indent=4, sort_keys=True)) + +``` +{% endcode %} + +#### Execute script + +``` +python list_all_tokens.py +``` +{% endtab %} +{% endtabs %} + +
+ +Sample Response + +```json +{ + "data": { + "tokens": [ + { + "cap": null, + "holderCount": "0", + "id": "0x0642026e7f0b6ccac5925b4e7fa61384250e1701", + "isDatatoken": false, + "name": "H2O", + "nft": null, + "orderCount": "0", + "orders": [], + "symbol": "H2O" + }, + { + "cap": "115792089237316195423570985008687900000000000000000000000000", + "holderCount": "0", + "id": "0x122d10d543bc600967b4db0f45f80cb1ddee43eb", + "isDatatoken": true, + "name": "Brave Lobster Token", + "nft": { + "address": "0xea615374949a2405c3ee555053eca4d74ec4c2f0", + "name": "Ocean Data NFT", + "symbol": "OCEAN-NFT" + }, + "orderCount": "0", + "orders": [], + "symbol": "BRALOB-11" + } + ] + } +} +``` + +
+ diff --git a/building-with-ocean/using-ocean-subgraph/list-fixed-rate-exchanges.md b/building-with-ocean/using-ocean-subgraph/list-fixed-rate-exchanges.md new file mode 100644 index 00000000..c42cd8a7 --- /dev/null +++ b/building-with-ocean/using-ocean-subgraph/list-fixed-rate-exchanges.md @@ -0,0 +1,176 @@ +# List Fixed Rate Exchanges + +The result of following GraphQL query returns the information about the Fixed Rate Exchanges. + +{% hint style="info" %} +Copy the query in the [graphiQL interface](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql) to fetch the results from the mainnet. For other networks, change the domain name with appropriate subgraph domain as mentioned in [this page](../../core-concepts/networks.md). +{% endhint %} + +```graphql +{ + fixedRateExchanges(skip:0, first:2, subgraphError:deny){ + id + contract + exchangeId + owner{id} + datatoken{ + id + name + symbol + } + price + datatokenBalance + active + totalSwapValue + swaps(skip:0, first:1){ + tx + by { + id + } + baseTokenAmount + dataTokenAmount + createdTimestamp + } + updates(skip:0, first:1){ + oldPrice + newPrice + newActive + createdTimestamp + tx + } + } +} +``` + +The python script below can be used to run the the query. If you wish to change the network, then replace the value of variable `base_url` as needed. + +{% tabs %} +{% tab title="Python" %} +#### Create script + +{% code title="list_fixed_rate_exchanges.py" %} +```python +import requests +import json + + +query = """ +{ + fixedRateExchanges(skip:0, first:2, subgraphError:deny){ + id + contract + exchangeId + owner{id} + datatoken{ + id + name + symbol + } + price + datatokenBalance + active + totalSwapValue + swaps(skip:0, first:1){ + tx + by { + id + } + baseTokenAmount + dataTokenAmount + createdTimestamp + } + updates(skip:0, first:1){ + oldPrice + newPrice + newActive + createdTimestamp + tx + } + } +}""" + + +base_url = "https://v4.subgraph.mainnet.oceanprotocol.com" +route = "/subgraphs/name/oceanprotocol/ocean-subgraph" + +url = base_url + route + +headers = {"Content-Type": "application/json"} +payload = json.dumps({"query": query}) +response = requests.request("POST", url, headers=headers, data=payload) +result = json.loads(response.text) + +print(json.dumps(result, indent=4, sort_keys=True)) +``` +{% endcode %} + +#### Execute script + +``` +python list_fixed_rate_exchanges.py +``` +{% endtab %} +{% endtabs %} + +
+ +Sample response + +```json +{ + "data": { + "fixedRateExchanges": [ + { + "active": true, + "contract": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02", + "datatoken": { + "id": "0x9b39a17cc72c8be4813d890172eff746470994ac", + "name": "Delightful Pelican Token", + "symbol": "DELPEL-79" + }, + "datatokenBalance": "0", + "exchangeId": "0x06284c39b48afe5f01a04d56f1aae45dbb29793b190ee11e93a4a77215383d44", + "id": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02-0x06284c39b48afe5f01a04d56f1aae45dbb29793b190ee11e93a4a77215383d44", + "owner": { + "id": "0x03ef3f422d429bcbd4ee5f77da2917a699f237ed" + }, + "price": "33", + "swaps": [ + { + "baseTokenAmount": "33.033", + "by": { + "id": "0x9b39a17cc72c8be4813d890172eff746470994ac" + }, + "createdTimestamp": 1656563684, + "dataTokenAmount": "1", + "tx": "0x0b55482f69169c103563062e109f9d71afa01d18f201c425b24b1c74d3c282a3" + } + ], + "totalSwapValue": "0", + "updates": [] + }, + { + "active": true, + "contract": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02", + "datatoken": { + "id": "0x2cf074e36a802241f2f8ddb35f4a4557b8f1179b", + "name": "Arcadian Eel Token", + "symbol": "ARCEEL-17" + }, + "datatokenBalance": "0", + "exchangeId": "0x2719862ebc4ed253f09088c878e00ef8ee2a792e1c5c765fac35dc18d7ef4deb", + "id": "0xfa48673a7c36a2a768f89ac1ee8c355d5c367b02-0x2719862ebc4ed253f09088c878e00ef8ee2a792e1c5c765fac35dc18d7ef4deb", + "owner": { + "id": "0x87b5606fba13529e1812319d25c6c2cd5c3f3cbc" + }, + "price": "35", + "swaps": [], + "totalSwapValue": "0", + "updates": [] + } + ] + } +} +``` + +