docs/building-with-ocean/using-ocean-libraries/configuration.md

7.3 KiB

Configuration

Obtaining API key for Ethereum node provider

Ocean Protocol's smart contracts are deployed on EVM-compatible networks. Using an API key provided by a third-party Ethereum node provider allows you to interact with the Ocean Protocol's smart contracts on the supported networks without requiring you to host a local node.

Choose any API provider of your choice. Some of the commonly used are:

The supported networks are listed here.

Create a directory

Let's start with creating a working directory where we store the environment variable file, configuration files and the scripts.

mkdir my-ocean-project
cd my-ocean-project

Create a .env file

In the working directory create a .env file. The content of this file will store the values for following variables:

Variable name Description Required
OCEAN_NETWORK Name of the network where the Ocean Protocol's smart contracts are deployed. Yes
OCEAN_NETWORK_URL The URL of the Ethereum node (along with API key for non-local networks) Yes
PRIVATE_KEY The private key of the account which you want to use. A private key is made up of 64 hex characters. Make sure you have sufficient balance to pay for the transaction fees. Yes
AQUARIUS_URL The URL of the Aquarius. This value is needed when reading an asset from off-chain store. No
PROVIDER_URL The URL of the Provider. This value is needed when publishing a new asset or update an existing asset. No

{% hint style="info" %} Treat this file as a secret and do not commit this file to git or share the content publicly. If you are using git, then include this file name in .gitignore file. {% endhint %}

The below tabs show partially filled .env file content for some of the supported networks.

{% tabs %} {% tab title="Mainnet" %} {% code title=".env" %}

# Mandatory environment variables

OCEAN_NETWORK=mainnet
OCEAN_NETWORK_URL=<replace this>
PRIVATE_KEY=<secret>

# Optional environment variables

AQUARIUS_URL=https://v4.aquarius.oceanprotocol.com/
PROVIDER_URL=https://v4.provider.mainnet.oceanprotocol.com

{% endcode %} {% endtab %}

{% tab title="Polygon" %} {% code title=".env" %}

# Mandatory environment variables

OCEAN_NETWORK=polygon
OCEAN_NETWORK_URL=<replace this>
PRIVATE_KEY=<secret>

# Optional environment variables

AQUARIUS_URL=https://v4.aquarius.oceanprotocol.com/
PROVIDER_URL=https://v4.provider.polygon.oceanprotocol.com

{% endcode %} {% endtab %}

{% tab title="Local (using Barge)" %} {% code title=".env" %}

# Mandatory environment variables
OCEAN_NETWORK=development
OCEAN_NETWORK_URL=http://172.15.0.3:8545/
AQUARIUS_URL=http://172.15.0.5:5000
PROVIDER_URL=http://172.15.0.4:8030

# Replace PRIVATE_KEY if needed
PRIVATE_KEY=0xc594c6e5def4bab63ac29eed19a134c130388f74f019bc74b8f4389df2837a58

{% endcode %} {% endtab %} {% endtabs %}

NOTE: If using ocean.py, additionally specify ADDRESS_FILE variable in the .env file. Copy the content of this link locally and set the ADDRESS_FILE so that its value is a correct file path.

Setup dependencies

In this step the required dependencies will be installed.

{% tabs %} {% tab title="ocean.js" %}

npm init
npm install @oceanprotocol/lib@latest dotenv web3 @truffle/hdwallet-provider

{% endtab %}

{% tab title="ocean.py" %}

python3 -m venv venv
source venv/bin/activate
pip3 install wheel

# Install Ocean library. Allow pre-releases to get the latest v4 version.
pip3 install ocean-lib python-dotenv web3

{% endtab %} {% endtabs %}

Create a configuration file

A configuration file will read the content of the .env file and initialize the required configuration objects which will be used in the further tutorials. The below scripts creates a Web3 wallet instance and a Ocean's configuration object.

Create the configuration file in the working directory i.e. at the same path where the .env is located.

{% tabs %} {% tab title="ocean.js" %} {% code title="config.js" %}

// Import dependencies
require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const fs = require('fs');
const { homedir } = require('os');
const { ConfigHelper } = require('@oceanprotocol/lib');

// Get configuration for the given network
let oceanConfig = new ConfigHelper().getConfig(process.env.OCEAN_NETWORK);

// If using local development environment, read the addresses from local file.
// The local deployment address file can be generated using barge.
if (process.env.OCEAN_NETWORK === 'development') {
  const addressData = JSON.parse(
    fs.readFileSync(
      process.env.ADDRESS_FILE
        || `${homedir}/.ocean/ocean-contracts/artifacts/address.json`,
      'utf8'
    )
  );
  const addresses = addressData[process.env.OCEAN_NETWORK];

  oceanConfig = {
    ...oceanConfig,
    oceanTokenAddress: addresses.Ocean,
    poolTemplateAddress: addresses.poolTemplate,
    fixedRateExchangeAddress: addresses.FixedPrice,
    dispenserAddress: addresses.Dispenser,
    erc721FactoryAddress: addresses.ERC721Factory,
    sideStakingAddress: addresses.Staking,
    opfCommunityFeeCollector: addresses.OPFCommunityFeeCollector
  };
}

oceanConfig = {
  ...oceanConfig,
  nodeUri: process.env.OCEAN_NETWORK_URL,
  // Set optional properties - Provider URL and Aquarius URL
  metadataCacheUri: process.env.AQUARIUS_URL || oceanConfig.metadataCacheUri,
  providerUri: process.env.PROVIDER_URL || oceanConfig.providerUri
};

const web3Provider = new HDWalletProvider(
  process.env.PRIVATE_KEY,
  oceanConfig.nodeUri
);

module.exports = {
  web3Provider,
  oceanConfig
};

{% endcode %} {% endtab %}

{% tab title="ocean.py" %} {% code title="config.py" %}

import os
from dotenv import load_dotenv
from ocean_lib.ocean.ocean import Ocean
from ocean_lib.web3_internal.wallet import Wallet
from ocean_lib.example_config import ExampleConfig, get_config_dict
from ocean_lib.ocean.ocean import Ocean
from ocean_lib.ocean.util import get_web3

load_dotenv()

config = ExampleConfig.get_config()
ocean = Ocean(config)

user_private_key = os.getenv('PRIVATE_KEY')
web3_wallet = Wallet(ocean.web3, user_private_key, ocean.config.block_confirmations, ocean.config.transaction_timeout)

{% endcode %} {% endtab %} {% endtabs %}

Now, all the dependencies are ready and you can proceed with interacting with Ocean infrastructure using Ocean libraries.