unlock-protocol / unlock

Ʉnlock is a protocol for memberships built on a blockchain.
https://unlock-protocol.com
MIT License
828 stars 242 forks source link

Use structs as args for purchase #13457

Open clemsos opened 5 months ago

clemsos commented 5 months ago

The current models for the purchase function args is to pass several arrays of identical length - one for each required param of a purchase.

Current signature

function purchase(
    uint256[] calldata _values,
    address[] calldata _recipients,
    address[] calldata _referrers,
    address[] calldata _keyManagers,
    bytes[] calldata _data
  ) external payable returns (uint256[] memory tokenIds);

This makes unpacking encoding args difficult as array can be of arbitrary length.

Possible improvement

A more elegant solution could be to have a single array of Struct containing each the param for a single purchase.


Struct PurchaseArgs {
  uint price
  address recipient 
  address referrers 
  address keyManager
  bytes memory data
}

function purchase(PurchaseArgs[]) external payable returns (uint256[] memory tokenIds);

Not sure what will be the downsides, but it sure improves readability as well as the ability to loop and decode an encoded array of Structs.

Any thoughts?

julien51 commented 5 months ago

I think this is an interesting idea... BUT also a breaking change and we should be really careful with these changes. Could we just add another signature and show a deprecation warning for the old one?

julien51 commented 3 months ago

If we did this ^^ we could easily emit an event for each "purchase" and use that to construct receipts.