Skip to content

Commit

Permalink
Datatoken names (#1332)
Browse files Browse the repository at this point in the history
* Change datatoken names.
* Adds explanatory table.
  • Loading branch information
calina-c committed Feb 16, 2023
1 parent 2936447 commit 1903492
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 70 deletions.
25 changes: 16 additions & 9 deletions READMEs/main-flow.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,15 +174,22 @@ Ocean's architecture allows for >1 implementations of ERC20, each with its own "

Template 1:
- Solidity: [ERC20Template.sol](https://github.com/oceanprotocol/contracts/blob/main/contracts/templates/ERC20Template.sol)
- Python wrapper: [Datatoken](https://github.com/oceanprotocol/ocean.py/blob/main/ocean_lib/models/datatoken.py). It has a Python method for every Solidity method, via Brownie.
- Python wrapper: [Datatoken1](https://github.com/oceanprotocol/ocean.py/blob/main/ocean_lib/models/datatoken.py). It has a Python method for every Solidity method, via Brownie.
- Implements methods like `start_order()`, `create_exchange()`, and `create_dispenser()` to enhance developer experience.

Template 2:
- Inherits from template 1 in both Solidity and Python.
- Solidity: [ERC20TemplateEnterprise.sol](https://github.com/oceanprotocol/contracts/blob/main/contracts/templates/ERC20TemplateEnterprise.sol)
- Python wrapper: [DatatokenEnterprise](https://github.com/oceanprotocol/ocean.py/blob/main/ocean_lib/models/datatoken_enterprise.py)
- New method: [`buy_DT_and_order()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken_enterprise.py#L20). This uses just 1 tx to do both actions at once (versus 2 txs for template 1).
- New method: [`dispense_and_order()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken_enterprise.py#L70). Similarly, uses just 1 tx.
- Python wrapper: [Datatoken2](https://github.com/oceanprotocol/ocean.py/blob/main/ocean_lib/models/datatoken2.py)
- New method: [`buy_DT_and_order()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken2.py#L20). This uses just 1 tx to do both actions at once (versus 2 txs for template 1).
- New method: [`dispense_and_order()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken2.py#L70). Similarly, uses just 1 tx.

Below you can find an explanatory table describing the template attributes:

Template # | Class Label | Allows dispense by default? | Allows non-custody of datatokens? | Combines txs? | Allows non-custody of url?
:----: | :----: | :----: | :----: | :----: | :----:
1 | Datatoken1 | Y | N | N | N
2 | Datatoken2 | N | Y | Y | N


### DIDs and DDOs
Expand Down Expand Up @@ -260,7 +267,7 @@ Calling `create()` like above generates a data NFT, a datatoken for that NFT, an
datatoken = data_nft.create_datatoken({"from": alice}, "Datatoken 1", "DT1")
```

If you call `create()` after this, you can pass in an argument `deployed_datatokens:List[Datatoken]` and it will use those datatokens during creation.
If you call `create()` after this, you can pass in an argument `deployed_datatokens:List[Datatoken1]` and it will use those datatokens during creation.

<h2 id="appendix-faucet-details">Appendix: Dispenser / Faucet Details</h4>

Expand All @@ -272,9 +279,9 @@ We access dispenser (faucet) functionality from two complementary places: datato
A given datatoken can create exactly one dispenser for that datatoken.

**Interface via datatokens:**
- [`datatoken.create_dispenser()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L337) - implemented in Datatoken, inherited by DatatokenEnterprise
- [`datatoken.create_dispenser()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L337) - implemented in DatatokenBase, inherited by Datatoken2
- [`datatoken.dispense()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L380) - ""
- [`datatoken.dispense_and_order()` - implemented in Datatoken](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L439) and [in DatatokenEnterprise](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken_enterprise.py#L70). The latter only needs one tx to dispense and order.
- [`datatoken.dispense_and_order()` - implemented in Datatoken1](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L439) and [in Datatoken2](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken_enterprise.py#L70). The latter only needs one tx to dispense and order.
- [`datatoken.dispenser_status()`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/datatoken.py#L403) - returns a [`DispenserStatus`](https://github.com/oceanprotocol/ocean.py/blob/4aa12afd8a933d64bc2ed68d1e5359d0b9ae62f9/ocean_lib/models/dispenser.py#L16) object

**Interface via [`Dispenser`](https://github.com/oceanprotocol/ocean.py/blob/main/ocean_lib/models/dispenser.py) Python class:**
Expand Down Expand Up @@ -319,10 +326,10 @@ DispenserStatus:

### Who can request tokens from a faucet

Template 1 (`Datatoken`):
Template 1 (`Datatoken1`):
- Anyone can call `datatoken.dispense()` to request tokens.

Template 2 (`DatatokenEnterprise`):
Template 2 (`Datatoken2`):
- Option A. Anyone can `datatoken.dispense_and_order()` to request tokens, and order.
- Option B. Not anyone can call `datatoken.dispense()` by default. To allow anyone, the publisher does: `ocean.dispenser.setAllowedSwapper(datatoken_address, ZERO_ADDRESS, {"from" : publisher_wallet})`, where `ZERO_ADDRESS` is `0x00..00`.

Expand Down
12 changes: 6 additions & 6 deletions conftest_ganache.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from ocean_lib.example_config import get_config_dict
from ocean_lib.models.data_nft import DataNFT
from ocean_lib.models.data_nft_factory import DataNFTFactoryContract
from ocean_lib.models.datatoken import Datatoken
from ocean_lib.models.datatoken1 import Datatoken1
from ocean_lib.models.factory_router import FactoryRouter
from ocean_lib.models.fixed_rate_exchange import FixedRateExchange
from ocean_lib.ocean.util import get_address_of_type, to_wei
Expand Down Expand Up @@ -110,9 +110,9 @@ def ocean_address(config) -> str:


@pytest.fixture
def ocean_token(config, ocean_address) -> Datatoken:
def ocean_token(config, ocean_address) -> Datatoken1:
connect_to_network("development")
return Datatoken(config, ocean_address)
return Datatoken1(config, ocean_address)


@pytest.fixture
Expand Down Expand Up @@ -156,19 +156,19 @@ def data_nft(config, publisher_wallet) -> DataNFT:


@pytest.fixture
def data_NFT_and_DT(config, publisher_wallet) -> Tuple[DataNFT, Datatoken]:
def data_NFT_and_DT(config, publisher_wallet) -> Tuple[DataNFT, Datatoken1]:
return deploy_erc721_erc20(config, publisher_wallet, publisher_wallet)


@pytest.fixture
def DT(data_NFT_and_DT) -> Datatoken:
def DT(data_NFT_and_DT) -> Datatoken1:
(_, DT) = data_NFT_and_DT
return DT


# aliases
@pytest.fixture
def OCEAN(ocean_token) -> Datatoken:
def OCEAN(ocean_token) -> Datatoken1:
return ocean_token


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ def withdrawETH() -> None:
"""


class Datatoken(DatatokenBase):
class Datatoken1(DatatokenBase):
CONTRACT_NAME = "ERC20Template"

BASE = 10**18
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,23 @@

from enforce_typing import enforce_types

from ocean_lib.models.datatoken import Datatoken, TokenFeeInfo
from ocean_lib.models.datatoken_base import DatatokenBase, TokenFeeInfo
from ocean_lib.ocean.util import get_address_of_type, get_from_address, to_wei
from ocean_lib.web3_internal.constants import ZERO_ADDRESS
from ocean_lib.web3_internal.contract_base import ContractBase

checksum_addr = ContractBase.to_checksum_address

"""
DatatokenEnterprise retains all the functions from Datatoken model.
Datatoken2 retains all the functions from Datatoken model.
The different functions are redundant (wrapped by ocean.py in helpers):
buyFromDispenserAndOrder
buyFromFreAndOrder
"""


class DatatokenEnterprise(Datatoken):
class Datatoken2(DatatokenBase):
CONTRACT_NAME = "ERC20TemplateEnterprise"

@enforce_types
Expand Down
10 changes: 5 additions & 5 deletions ocean_lib/models/datatoken_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def __init__(
cap: Optional[int] = None,
):
if template_index == 2 and not cap:
raise Exception("Cap is needed for Datatoken Enterprise token deployment.")
raise Exception("Cap is needed for Datatoken Template 2 token deployment.")

self.cap = cap if template_index == 2 else MAX_UINT256

Expand Down Expand Up @@ -165,17 +165,17 @@ class DatatokenBase(ABC, ContractBase):

@staticmethod
def get_typed(config, address):
from ocean_lib.models.datatoken import Datatoken
from ocean_lib.models.datatoken_enterprise import DatatokenEnterprise
from ocean_lib.models.datatoken1 import Datatoken1
from ocean_lib.models.datatoken2 import Datatoken2

datatoken = Datatoken(config, address)
datatoken = Datatoken1(config, address)

try:
template_id = datatoken.getId()
except Exception:
template_id = 1

return datatoken if template_id == 1 else DatatokenEnterprise(config, address)
return datatoken if template_id == 1 else Datatoken2(config, address)

@enforce_types
def start_order(
Expand Down
14 changes: 7 additions & 7 deletions ocean_lib/models/test/test_data_nft.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,23 +343,23 @@ def test_create_datatoken(
{"from": publisher_wallet},
datatoken_args=DatatokenArguments(
template_index=2,
name="DatatokenEnterpriseDT1",
symbol="DatatokenEnterpriseDT1Symbol",
name="Datatoken2DT1",
symbol="Datatoken2DT1Symbol",
minter=publisher_wallet.address,
fee_manager=consumer_wallet.address,
bytess=[b""],
cap=to_wei(0.1),
),
)
assert dt_ent, "Could not create datatoken Enterprise with explicit parameters"
assert dt_ent, "Could not create datatoken template 2 with explicit parameters"

dt_ent = data_nft.create_datatoken(
{"from": publisher_wallet},
name="DatatokenEnterpriseDT1",
symbol="DatatokenEnterpriseDT1Symbol",
name="Datatoken2DT1",
symbol="Datatoken2DT1Symbol",
cap=to_wei(0.1),
)
assert dt_ent, "Could not create datatoken Enterprise with implicit parameters."
assert dt_ent, "Could not create datatoken template 2 with implicit parameters."


def test_create_datatoken_with_usdc_order_fee(
Expand Down Expand Up @@ -736,7 +736,7 @@ def test_fail_create_datatoken(
@pytest.mark.unit
def test_datatoken_cap(publisher_wallet, consumer_wallet, data_nft_factory):
# create NFT with ERC20
with pytest.raises(Exception, match="Cap is needed for Datatoken Enterprise"):
with pytest.raises(Exception, match="Cap is needed for Datatoken Template 2"):
DatatokenArguments(template_index=2, name="DTB1", symbol="EntDT1Symbol")


Expand Down
6 changes: 3 additions & 3 deletions ocean_lib/models/test/test_data_nft_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from web3.main import Web3

from ocean_lib.models.data_nft import DataNFT, DataNFTArguments
from ocean_lib.models.datatoken import Datatoken
from ocean_lib.models.datatoken1 import Datatoken1
from ocean_lib.models.datatoken_base import (
DatatokenArguments,
DatatokenBase,
Expand Down Expand Up @@ -62,7 +62,7 @@ def test_nft_creation(

# Tests datatoken template list
datatoken_template_address = get_address_of_type(
config, Datatoken.CONTRACT_NAME, "1"
config, Datatoken1.CONTRACT_NAME, "1"
)
template = data_nft_factory.getTokenTemplate(1)
assert template[0] == datatoken_template_address
Expand Down Expand Up @@ -223,7 +223,7 @@ def test_start_multiple_order(

# Tests datatoken template list
datatoken_template_address = get_address_of_type(
config, Datatoken.CONTRACT_NAME, "1"
config, Datatoken1.CONTRACT_NAME, "1"
)
template = data_nft_factory.getTokenTemplate(1)
assert template[0] == datatoken_template_address
Expand Down
6 changes: 3 additions & 3 deletions ocean_lib/models/test/test_datatoken_order_both_templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def test_dispense_and_order_with_non_defaults(
consumer_wallet,
factory_deployer_wallet,
):
"""Tests dispense_and_order function of the Datatoken Enterprise"""
"""Tests dispense_and_order function of the Datatoken Template 2"""
_, DT = deploy_erc721_erc20(config, publisher_wallet, publisher_wallet, 2)

USDC = DatatokenBase.get_typed(config, get_address_of_type(config, "MockUSDC"))
Expand Down Expand Up @@ -115,7 +115,7 @@ def test_dispense_and_order_with_non_defaults(
def test_dispense_and_order_with_defaults(
config, publisher_wallet, consumer_wallet, factory_deployer_wallet, template_index
):
"""Tests dispense_and_order function of the Datatoken and DatatokenEnterprise"""
"""Tests dispense_and_order function of the Datatoken1 and Datatoken2"""
_, DT = deploy_erc721_erc20(
config, publisher_wallet, publisher_wallet, template_index
)
Expand Down Expand Up @@ -150,7 +150,7 @@ def test_buy_DT_and_order(
another_consumer_wallet,
template_index,
):
"""Tests buy_DT_and_order function of the Datatoken and DatatokenEnterprise"""
"""Tests buy_DT_and_order function of the Datatoken1 and Datatoken2"""
_, DT = deploy_erc721_erc20(
config, publisher_wallet, publisher_wallet, template_index
)
Expand Down
14 changes: 7 additions & 7 deletions ocean_lib/models/test/test_exchange_fees.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
import pytest

from ocean_lib.models.datatoken import Datatoken
from ocean_lib.models.datatoken1 import Datatoken1
from ocean_lib.models.factory_router import FactoryRouter
from ocean_lib.models.fixed_rate_exchange import FixedRateExchange, OneExchange
from ocean_lib.models.test.test_factory_router import (
Expand Down Expand Up @@ -71,7 +71,7 @@ def test_exchange_swap_fees(
router = FactoryRouter(config, get_address_of_type(config, "Router"))
FRE = FixedRateExchange(config, get_address_of_type(config, "FixedPrice"))

bt = Datatoken(config, get_address_of_type(config, bt_name))
bt = Datatoken1(config, get_address_of_type(config, bt_name))
dt = DT

transfer_bt_if_balance_lte(
Expand Down Expand Up @@ -241,8 +241,8 @@ def buy_or_sell_dt_and_verify_balances_swap_fees(
bob,
):
details = exchange.details
bt = Datatoken(config, details.base_token)
dt = Datatoken(config, details.datatoken)
bt = Datatoken1(config, details.base_token)
dt = Datatoken1(config, details.datatoken)

# Get balances before swap
BT_bob1 = bt.balanceOf(bob)
Expand Down Expand Up @@ -351,8 +351,8 @@ def collect_bt_or_dt_and_verify_balances(
):
"""Collet BT or Collect DT and verify balances"""
details = exchange.details
dt = Datatoken(config, details.datatoken)
bt = Datatoken(config, details.base_token)
dt = Datatoken1(config, details.datatoken)
bt = Datatoken1(config, details.base_token)
publish_market = dt.getPaymentCollector()

if token_address == dt.address:
Expand Down Expand Up @@ -390,7 +390,7 @@ def collect_fee_and_verify_balances(
):
"""Collect publish_market or opc fees, and verify balances"""
FRE = FixedRateExchange(config, get_address_of_type(config, "FixedPrice"))
bt = Datatoken(config, exchange.details.base_token)
bt = Datatoken1(config, exchange.details.base_token)

if fee_type == "publish_market_fee":
BT_exchange_fee_avail1 = (
Expand Down
4 changes: 1 addition & 3 deletions ocean_lib/models/test/test_fake_ocean.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
import pytest
from brownie.network import accounts


from ocean_lib.models.datatoken import Datatoken
from ocean_lib.ocean.util import get_ocean_token_address, to_wei
from ocean_lib.ocean.mint_fake_ocean import mint_fake_OCEAN
from ocean_lib.ocean.util import to_wei


@pytest.mark.unit
Expand Down
2 changes: 1 addition & 1 deletion ocean_lib/ocean/ocean.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ def get_nft_token(self, token_address: str) -> DataNFT:
def get_datatoken(self, token_address: str) -> DatatokenBase:
"""
:param token_address: Token contract address, str
:return: `Datatoken` or `DatatokenEnterprise` instance
:return: `Datatoken1` or `Datatoken2` instance
"""
return DatatokenBase.get_typed(self.config, token_address)

Expand Down
Loading

0 comments on commit 1903492

Please sign in to comment.