LogoLogo
  • 🖼️About
  • ❔FAQ
  • processes
    • 🎫How to apply
    • 👁️‍🗨️Curation process: 'Blind'
    • ✅Curation process: 'Select'
    • 💻Code
  • Values
    • 🔒Permanence
    • ⚖️Equality
    • ♻️Climate
  • Docs
    • Contracts
    • Private policy
  • 🔗Links
    • Collections page
    • Discord
    • Twitter
    • gmDAO token
    • gmDAO website
Powered by GitBook
On this page
  • Artist requirements
  • Javascript
  • Processing
  • Code archival

Was this helpful?

  1. processes

Code

Artist requirements

The gm.studio platform supports artwork code created in Processing (the java app) or Javascript (including p5js).

Javascript

Artists should provide a script adhering to the following spec:

  • A single minified js file.

  • We recommend p5.js, but we can also support any non-WebGL based libraries.

  • Your script should contain a standalone function that reads parameters from window.params and draws the artwork in a canvas in the current window.

  • The window params type is described in the code block below.

  • Your script should write the attributes to window.metadata

  • Upon completion your script should set document.complete = true

// window.params type
type ScriptParams = {
  seed: string; // a 0x prefixed 256bit seed for the artwork generation
  tokenId: number; // the id of the token in the collection
  res?: number; // the resolution of the render (width)
}

// this will be available on window.params
// for example, access the seed:
doRender(window.params.seed);

window.metadata = {
  palette: "Olive",
  size: "Huge",
  ...
};

...

// once rendering is finished
document.complete = true;

Notes:

  • All metadata values should be output as String types.

  • You should tell us the aspect ratio of the output so that we can display the pieces optimally in our gallery.

  • The currently supported version of p5 is 1.4.0

Processing

// === GMStudio Arguments ===
String outDir;
String seed;
int tokenId;
int res;
// === GMStudio Arguments ===

void setup() {
    // Initialise GMStudio Arguments //
    outDir = args[0];
    seed = args[1];
    tokenId = int(args[2]);
    res = args[3];

    // ... artist's code here ... //
}

void exit() {
    // Save rendered image
    save(outDir + "/out.png");

    // Save traits to disk
    writeTraits();

    // let processing carry with it's regular exit routine
    super.exit();
}

// An example function for storing the NFT traits
void writeTraits() {
    JSONObject traits = new JSONObject();
    traits.setString("Palette", "Chrome");
    saveJSONObject(traits, outDir + "/metadata.json");
}

Code archival

Storing in contract bytecode

This step is usually performed by the studio team

  • generate a gzipped tarball of all files

    • tar -czf archive.tar.gz sketch.min.js desc.json

  • get the blob's hex string e.g. by echo "0x"$(hexdump archive.tar.gz -v -e '/1 "%02X"')

  • store blob using repo.store(blob)

    • an event containing the storage address will be emitted during the transaction

Code verification

Please make sure that the stored code matches the one used for rendering the tokens.

  • Connect a wallet (needed to get a connection to the blockchain)

  • Make sure to select the correct collection address

  • Click Download Blob to download the code archive

  • Unpack the archive

Please verify that the stored script is correct e.g. by rerendering the genesis token using the downloaded code.

You can fetch the seed for a given token directly from the collection contract on etherscan:

  • Fetch the seed using contract.tokenSeed(tokenId)

Code signature

If the stored code is correct, you can proceed to sign your code (this step is optional but we highly encourage to do so).

  • Connect the wallet that you want to use to sign your code. The wallet will be associated with your code.

  • Click Sign

  • Metamask will pop up and prompt you to sign something - please do so.

    • Even though some of the characters might seem weird, this is totally fine because we are signing the raw binary hash of the repository entry while Metamask tries to interpret it as a string.

  • Please communicate the output appearing below the buttons to the studio team.

//                                           __                    __ __
//                                          |  \                  |  \  \
//   ______  ______ ____           _______ _| ▓▓_   __    __  ____| ▓▓\▓▓ ______
//  /      \|      \    \         /       \   ▓▓ \ |  \  |  \/      ▓▓  \/      \
// |  ▓▓▓▓▓▓\ ▓▓▓▓▓▓\▓▓▓▓\       |  ▓▓▓▓▓▓▓\▓▓▓▓▓▓ | ▓▓  | ▓▓  ▓▓▓▓▓▓▓ ▓▓  ▓▓▓▓▓▓\
// | ▓▓  | ▓▓ ▓▓ | ▓▓ | ▓▓        \▓▓    \  | ▓▓ __| ▓▓  | ▓▓ ▓▓  | ▓▓ ▓▓ ▓▓  | ▓▓
// | ▓▓__| ▓▓ ▓▓ | ▓▓ | ▓▓__      _\▓▓▓▓▓▓\ | ▓▓|  \ ▓▓__/ ▓▓ ▓▓__| ▓▓ ▓▓ ▓▓__/ ▓▓
//  \▓▓    ▓▓ ▓▓ | ▓▓ | ▓▓  \    |       ▓▓  \▓▓  ▓▓\▓▓    ▓▓\▓▓    ▓▓ ▓▓\▓▓    ▓▓
//  _\▓▓▓▓▓▓▓\▓▓  \▓▓  \▓▓\▓▓     \▓▓▓▓▓▓▓    \▓▓▓▓  \▓▓▓▓▓▓  \▓▓▓▓▓▓▓\▓▓ \▓▓▓▓▓▓
// |  \__| ▓▓
//  \▓▓    ▓▓
//   \▓▓▓▓▓▓
//
PreviousCuration process: 'Select'NextPermanence

Last updated 2 years ago

Was this helpful?

Artists can also submit code. In order for your script to inter-operate with GMStudio's rendering stack, you are required to include the following code:

The official on-chain code repository for the gm.studio was deployed to . This repository is used to store the code for all on-chain collections and acts as a central database thereof.

The code can be either fetched directly from the contract using the repo.getBlob(collectionAddress) or more conveniently using the tool under :

Navigate to the collection contract, e.g.

Navigate to

Make sure to select the correct address of your collection. See also

Processing
0x8229e9bc30cb02c2d9af25022bc146a302c48c47
gmstudio.art/repo
0x65d8b2bf930a0015028efcaee5af7bf61b90b76f
gmstudio.art/repo
contracts
💻
Page cover image