rmrk-ink icon indicating copy to clipboard operation
rmrk-ink copied to clipboard

Over-guarded minting methods

Open boyswan opened this issue 2 years ago • 1 comments

Currently we set access control on minting trait methods by default, protecting methods from unauthorized access.

#[modifiers(only_role(CONTRIBUTOR))]
default fn mint(&mut self, to: AccountId, token_id: Id) -> Result<()> {
    self._check_amount(1)?;
    self._mint_to(to, token_id)?;
    Ok(())
}

However this means the guarded methods cannot be used from within a user-facing method of the contract, for example:

// ...Rmrk contract

#[ink(message, payable)]
pub fn public_mint_example(&mut self) -> Result<()> {
    // minting logic
    Minting::mint(self, Self::env().caller());
}

In this case, mint can only be called by a contributor. The only way around this is to call it from another contract which has been granted the contributor role.

Some possible solutions are:

  • Guards are not provided, and is up to the user to implement by overriding methods
  • Move all logic from the minting traits into Internal and making Internal trait public. Allows user flexibility but feels like a bit of a leak.

boyswan avatar Apr 19 '23 21:04 boyswan

This issue is also exacerbated by the removal of mint_many in the core implementation in https://github.com/rmrk-team/rmrk-ink/pull/65.

In order to mint multiple tokens in a single transaction, a user will need to call mint in a for-loop, which would be multiple cross-contract calls and very expensive.

boyswan avatar Apr 20 '23 10:04 boyswan