💻
Code
The gm.studio platform supports artwork code created in Processing (the java app) or Javascript (including p5js).
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
Artists can also submit Processing code. In order for your script to inter-operate with GMStudio's rendering stack, you are required to include the following code:
// === 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");
}
The official on-chain code repository for the gm.studio was deployed to 0x8229e9bc30cb02c2d9af25022bc146a302c48c47. This repository is used to store the code for all on-chain collections and acts as a central database thereof.
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
Please make sure that the stored code matches the one used for rendering the tokens.
The code can be either fetched directly from the contract using the
repo.getBlob(collectionAddress)
or more conveniently using the tool under gmstudio.art/repo:- 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)
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.
// __ __ __
// | \ | \ \
// ______ ______ ____ _______ _| ▓▓_ __ __ ____| ▓▓\▓▓ ______
// / \| \ \ / \ ▓▓ \ | \ | \/ ▓▓ \/ \
// | ▓▓▓▓▓▓\ ▓▓▓▓▓▓\▓▓▓▓\ | ▓▓▓▓▓▓▓\▓▓▓▓▓▓ | ▓▓ | ▓▓ ▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓▓\
// | ▓▓ | ▓▓ ▓▓ | ▓▓ | ▓▓ \▓▓ \ | ▓▓ __| ▓▓ | ▓▓ ▓▓ | ▓▓ ▓▓ ▓▓ | ▓▓
// | ▓▓__| ▓▓ ▓▓ | ▓▓ | ▓▓__ _\▓▓▓▓▓▓\ | ▓▓| \ ▓▓__/ ▓▓ ▓▓__| ▓▓ ▓▓ ▓▓__/ ▓▓
// \▓▓ ▓▓ ▓▓ | ▓▓ | ▓▓ \ | ▓▓ \▓▓ ▓▓\▓▓ ▓▓\▓▓ ▓▓ ▓▓\▓▓ ▓▓
// _\▓▓▓▓▓▓▓\▓▓ \▓▓ \▓▓\▓▓ \▓▓▓▓▓▓▓ \▓▓▓▓ \▓▓▓▓▓▓ \▓▓▓▓▓▓▓\▓▓ \▓▓▓▓▓▓
// | \__| ▓▓
// \▓▓ ▓▓
// \▓▓▓▓▓▓
//
Last modified 9mo ago