Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Datatoken names #1332

Merged
merged 2 commits into from
Feb 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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