GithubHelp home page GithubHelp logo

slovenia-team / starknet-erc721-storage Goto Github PK

View Code? Open in Web Editor NEW
3.0 1.0 1.0 33 KB

A simple metadata storage for Starknet ERC721 tokens

Python 100.00%
openzeppelin cairo starknet slovenia erc721 blockchain

starknet-erc721-storage's Introduction

Starknet ERC721 metadata storage

Tests and linter

The purpuse of this library is to unify/simplify the storage of the metadata for ERC721 tokens. It is ready to be used as is, by simply importing the Storage.cairo file to your ERC721 token and implementing the view/external caller methods. An example is given in test\ERC721.cairo.

It follows the OpenZeppelin ERC721 token standard for StarkNet non-fungible tokens.

Table of Contents

Prerequisites

Setting up the environment

A deteiled guide on how to set up the Starknet environment is accessible at cairo lang docs.

Set up the project

Clone the repository:

git clone https://github.com/Slovenia-team/starknet-erc721-storage.git  

Pull the OpenZeppelin submodule:

git submodule update --init --recursive

Rename ERC721 storage submodule to allow imports.

git mv starknet-erc721-storage starknet_erc721_storage

Write properties


NOTES

  1. Property names can not exceed 31 chars.
  2. A non-ascii character accounts for 2 characters (for example: á, é, í, ó, ú).

setPropertyFelt

Sets a named property of type felt for token.

Parameters:

name: felt
tokenId: Uint256
value: felt

Returns:

None.

setPropertyArray

Sets a named property of type felt* for token. Useful for storing longer strings.

Parameters:

name: felt
tokenId: Uint256
value_len: felt
value: felt*

Returns:

None.

setProperties

Sets multiple properties of type felt* for token. Useful for storing multiple properties at once to reduce costs.

Parameters:

names_len: felt
names: felt*
tokenId: Uint256
offsets_len: felt
offsets: felt*
values_len: felt
values: felt*

Returns:

None.

Read properties

getPropertyFelt

Get felt value of named property for token.

Parameters:

name: felt
tokenId: Uint256

Returns:

property: felt

getPropertyArray

Get felt* value of named property for token. Useful for retrieving longer strings.

Parameters:

name: felt
tokenId: Uint256

Returns:

property_len: felt
property: felt*

getProperties

Get felt* value of multiple properties for token. Useful for retrieving multiple properties at once to reduce costs.

Parameters:

names_len: felt
names: felt*
tokenId: Uint256

Returns:

offsets_len: felt
offsets: felt*
properties_len: felt
properties: felt*

Example Usage

Let see the use of Storage on a practical example. Suppose we would like to store a student with parameters:

name: 'John'
surname: 'Doe'
identification: 99999999
address: 'Apartment 1c 213 Derrick Street Boston, MA 02130 USA'

(Note) Let's ignore the sql noramlization rules of address for the sake of simplicity.

We can insert all 4 parameters with one request using the setProperties function. In order to achive this we first need to map strings to felt since cairo only supports felt type.


NOTES

  • Example python helper methods for string->felt (and vice versa) are accessible in test\utils.py. For our example we would use str_to_felt() for name and surname (since they can be stored as short string) and str_to_felt_array() for address.

Mapping of strings to felt:

//PROPERTY NAMES
'name' -> 1851878757
'surname' -> 32498756660325733
'identification' -> 2137607216152422741414319187652462
'address' -> 27413455319692147

//VALUES
'John' -> 1248815214
'Doe' -> 4484965
'Apartment 1c 213 Derrick Street Boston, MA 02130 USA' -> [339778646234179790318151820149535281, 265461595803987861726527707067606373, 602960736248495209273730863602872370, 13848555652731713]

The request should then look like:

names = [1851878757, 32498756660325733, 2137607216152422741414319187652462, 27413455319692147]
offsets = [1, 2, 3, 7]
values = [1248815214, 4484965, 99999999, 339778646234179790318151820149535281, 265461595803987861726527707067606373, 602960736248495209273730863602872370, 13848555652731713]

setProperties(4, names, tokenId, 4, offsets, 7, values)

Voila! All 4 properties are inserted.

Now you can retrive them as:

getProperties(4, names, tokenId)

Now let's say a student gets a new grade (10) for chemistry. We can simply add it by using the setPropertyFelt method.

'chemistry' -> 1833750202349513896569
setPropertyFelt(1833750202349513896569, tokenId, 10)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.