pcaversaccio / snekmate

State-of-the-art, highly opinionated, hyper-optimised, and secure 🐍Vyper smart contract building blocks.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

💥 Make `owner` Explicit in Constructor

pcaversaccio opened this issue · comments

Currently, the owner role is assigned to the msg.sender at construction time in ownable, ownable_2step, and access_control (here specifically the role DEFAULT_ADMIN_ROLE is assigned to msg.sender). If you deploy, for example, via a factory contract, this can become an issue as in this case you make the factory the owner. To improve the overall devex, we should make it possible to make the owner explicit.

As discussed here, we will use the yet-to-be-implemented Vyper @deploy decorator (vyperlang/vyper#3740) to implement this feature:

# access_control.vy

@deploy
def init_with_caller_as_default_admin():
    self._grant_role(DEFAULT_ADMIN_ROLE, msg.sender)


@deploy
def init_with_explicit_default_admin(default_admin: address):
    self._grant_role(DEFAULT_ADMIN_ROLE, default_admin)

...

And after that the user will be able to do:

from snekmate.auth import access_control as ac
initializes: ac

@deploy
def __init__():
    ac.init_with_caller_as_default_admin()

# OR

@deploy
def __init__(default_admin: address):
    ac.init_with_explicit_default_admin(default_admin)