Skip to content
/ solecslib Public

ERC1155 and ERC721 Systems that use components to store data

Notifications You must be signed in to change notification settings

dk1a/solecslib

Repository files navigation

solecslib

ERC1155 and ERC721 Subsystems that use components to store data

Experimental additions to @latticexyz/solecs

See mud.dev first for context on solecs and what a System is.

A Subsystem is a System that inherits OwnableWritable instead of Ownable. Call Subsystem.authorizeWriter(systemAddress) to allow a System to execute a Subsystem.

Development

Install dependencies via node

yarn install

Run tests via both forge and hardhat

yarn test

Forge is used for tests internally. Except ERC tests are entirely taken from @solidstate/spec, which is why hardhat is also used.


Tokens

ERC1155, ERC721

They have similar contracts with shared suffixes:

  • VData - Virtual data abstraction, like an internal interface
  • Internal - ERC internals, inherits VData
  • Logic - ERC public+internal methods, inherits Internal. This is a full ERC implementation, lacking only a data provider.
  • DataComponents - data provider (only simple setters/getters), inherits VData.
  • ERC__Subsystem - Logic + DataComponents + Subsystem + constructor + default execute implementation.

ERC1155BaseSubsystem, ERC721BaseSubsystem

Full ERC1155/721 and Subsystem implementation, with a default execute and sub-executes (mint,burn,transfer all share 1 contract). Its components may be read by anyone without even awareness of ERC1155/721, but writes must always go through ERC__BaseSubsystem (this is mostly because of events, only 1 contract should emit them).

Notes on VData and Logic

Data and Logic separation isn't really necessary, but this was an interesting use case for it. For example by having Logic + DataStorage + constructor you could get an ordinary ERC1155/721 implementation (where DataStorage implements VData but just uses normal contract storage). And imo keeping components away from Logic makes it easier to compare to @solidstate/contracts (I tried to keep it very similar, and even reuse tests via @solidstate/spec).

Forwarder systems, like OperatorApprovalSystem

These exist as an optional addition to ERC__BaseSubsystem. They are pure-ECS wrappers for transfers and approvals. I'm not sure they're useful.


FromPrototype

Instantiates prototypes, ensures a reverse mapping.

instanceContext is encoded with protoEntity to get instanced entity in newInstance and other methods.

ScopedValueFromPrototype has an example.


ScopedValue, ScopedValueFromPrototype

FromPrototype-wrapped version is likely more useful.

Interact with batches (identified by scope) of entity values, or individual entity values.

Scope is for doing batched read/increase/decrease without looping through everything.

Value is any kind of entity to counter mapping.

ScopedValueFromPrototypeTest has an example.


About

ERC1155 and ERC721 Systems that use components to store data

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published