SDKs and Programs
The npm and Rust packages for mallow's Solana programs, the program addresses, the token mints, and the metadata template for Gumball uploads.
API or SDK?
| Use | When |
|---|---|
| The HTTP API | You want a finished transaction to sign. The builders work out the token standard, the royalty accounts, lookup tables, compressed-artwork proofs and the priority fee for you. Indexed data such as artworks, events, profiles and trending is only in the API. It works from any language |
| A program client | You build the instructions yourself, to combine them with your own in one transaction or to call a mallow program from another program. Or you read and decode accounts straight from your RPC |
Two things only the API can do:
- Draws. A draw from a Gumball or Jellybean made on mallow needs mallow's co-signature, and mallow co-signs only transactions its own draw builder made. See Draws go through mallow
- Scheduled bids. mallow places the bid for you later, so the record lives on mallow's side
Program Addresses
These are the mainnet addresses. Each one is the address in the program's source and in its published clients.
| Program | Address | What it does | Source |
|---|---|---|---|
| mallow Market | MMA7VebX8Pi5JrrvaTBBm7nW81sfCww7ZtLBBT1YCy8 | Fixed-price listings, edition sales and offers | Not public |
| mallow Auction | MAUsg1KhgYQV2Kxr9ccAkv7bUod88Qi3AKe5nUN41oe | Auctions: bids and settlement | Not public |
| mallow Rewards | MRWDBkgyy3t3aA9C85DhmPfj39ss2nUgdsNthsRba2N | Artwork staking, SMORES rewards and store credits | Not public |
| mallow Sweepstake | sWEEpg22uXSMaDx9QjdVKeUaZtk2Vj19XusBeszTiTQ | Holds sweepstake entries in escrow and settles the draw | Not public |
| mallow Gumball | MGUMqztv7MHgoHBYWbvMyL3E3NJ4UHfTwgLJUQAbKGa | The Gumball Machine: random draws of pre-minted artworks | GitHub |
| Gumball Guard | GGRDy4ieS7ExrUu313QkszyuT9o3BvDLuc3H5VLgCpSF | The rules a draw must pass: payment, allowlists, start time and more. Gumball and Jellybean both use it | GitHub |
| mallow Jellybean | J3LLYcm8V5hJRzCKENRPW3yGdQ6xU8Nie8jr3mU88eqq | The Jellybean Machine: draws where an edition with less supply left is rarer | GitHub |
The same seven addresses hold a deployed program on devnet, checked on 12 October 2026.
A New artwork Gumball is the exception to the table. It runs on Metaplex's Core Candy Machine program, not on mallow Gumball, which draws pre-minted artworks only.
You don't have to take a sweepstake result on trust. The Sweepstake program decides every draw on chain, and Verifying a draw shows how to recompute one.
Token Mints
| Token | Mint |
|---|---|
| SMORES | smoEhMZMweWBnpd1QoU4ZjuVNBxMFchqy4NRMBbtW7V |
| mallowSOL | MLLWWq9TLHK3oQznWqwPyqD7kH4LXTHSKXK4yLz7LjD |
Program Clients
Each program has a client generated from its interface with Codama. A client holds the account decoders, the instruction builders, the address derivations, the error codes and the program address.
| Program | JavaScript, Solana Kit | JavaScript, Umi | Rust |
|---|---|---|---|
| Market | @mallow-labs/mallow-market | mallow-market-client | |
| Auction | @mallow-labs/mallow-auction | mallow-auction-client | |
| Rewards | @mallow-labs/mallow-rewards | mallow-rewards-client | |
| Sweepstake | @mallow-labs/mallow-sweepstake-sdk | mallow-sweepstake-client | |
| Gumball and Gumball Guard | @mallow-labs/mallow-gumball | @mallow-labs/mallow-gumball-umi | mallow-gumball-client |
| Jellybean | @mallow-labs/mallow-jellybean | @mallow-labs/mallow-jellybean-umi | mallow-jellybean-client |
The JavaScript packages are on npm and the Rust crates are on crates.io.
npm install @mallow-labs/mallow-market @solana/kit@7cargo add mallow-market-clientThe smallest useful call reads a listing straight from the chain, with no API key:
import { address, createSolanaRpc } from "@solana/kit";
import {
MALLOW_MARKET_ERROR__LISTING_EXPIRED,
MALLOW_MARKET_PROGRAM_ADDRESS,
fetchMaybeListingFromSeeds,
getMallowMarketErrorMessage,
} from "@mallow-labs/mallow-market";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
// Derives the listing PDA from the mint and decodes the account.
const listing = await fetchMaybeListingFromSeeds(rpc, { mint: address("<artwork-mint>") });
if (listing.exists) {
console.log(listing.data.seller, listing.data.price); // price is a bigint
}
console.log(MALLOW_MARKET_PROGRAM_ADDRESS); // MMA7VebX8Pi5JrrvaTBBm7nW81sfCww7ZtLBBT1YCy8
console.log(getMallowMarketErrorMessage(MALLOW_MARKET_ERROR__LISTING_EXPIRED)); // error 6002What to know before you depend on them:
- Solana Kit version. The Market, Auction, Rewards, Gumball and Jellybean clients are built for
@solana/kit7. The Sweepstake SDK pins@solana/kit8.3.0 - Error messages.
getMallowMarketErrorMessageand the same function in the other clients return the text only outside production builds. WithNODE_ENV=productionthey return a placeholder, so log the code number as well - Jellybean. The Kit client is marked as not yet tested in its repository. The Umi client is the tested one
- Market, Auction and Rewards have no README on npm. The types are the documentation. The Gumball client has a README with examples
- The Rust crates export the same pieces under
generated, with the program address as a constant such asMALLOW_MARKET_ID
Other Packages
| Package | What it's for | State |
|---|---|---|
@mallow-labs/mallow-sweepstake-sdk | Verifies a sweepstake draw without mallow's servers, as a library and as the mallow-sweepstake command. Also the Kit client for the Sweepstake program, at /generated | Documented in its README |
@mallow-labs/mallow-common | Token mints and a token registry with symbols and decimals, plus the types mallow's own apps share | Documented. Brings in Anchor, @solana/web3.js and Umi |
@mallow-labs/kit | Helpers on top of Solana Kit: Jupiter quotes, priority-fee constants, and checks for expired-transaction and low-balance errors | Documented. Asks for @solana/kit 2, older than the program clients use |
@mallow-labs/mallow-util | Small helpers with no Solana dependency: Merkle roots and proofs, address shortening, explorer links | Documented |
@mallow-labs/mallow-rewards-sdk | An Anchor 0.29 client for the Rewards program: stake, unstake, claim | Documented |
@mallow-labs/mallow-sdk | An older Anchor client for the Market and Auction programs | Last published in February 2024. Its README covers installing only. Use the generated clients instead |
@mallow-labs/mallow-solana | Shared @solana/web3.js helpers the other packages build on | No README |
To verify a sweepstake draw from a script:
npm install @mallow-labs/mallow-sweepstake-sdkimport { verifyDrawManifest } from "@mallow-labs/mallow-sweepstake-sdk";
const manifest = await (await fetch("<manifest-url>")).json();
const verification = await verifyDrawManifest(manifest);
console.log(verification.offlineIntegrityValid, verification.errors);This checks the manifest against itself and against the drand signature. To also check it against the chain, use the command on the Sweepstake page.
To use the token registry:
import { MALLOW_SOL, SMORES, TokenBySymbol } from "@mallow-labs/mallow-common";
console.log(SMORES); // smoEhMZMweWBnpd1QoU4ZjuVNBxMFchqy4NRMBbtW7V
console.log(MALLOW_SOL); // MLLWWq9TLHK3oQznWqwPyqD7kH4LXTHSKXK4yLz7LjD
console.log(TokenBySymbol["USDC"].decimals); // 6mallow-common pins @types/node
@mallow-labs/mallow-common 1.2.0 declares @types/node 20.14.8 as an exact peer
dependency. In a project with another version, npm install stops with ERESOLVE. Pass
--legacy-peer-deps to install it anyway.
These are the packages mallow's own apps are built on. Pin an exact version of any you depend on.
Gumball Metadata Template
When you load artworks into a New artwork Gumball on mallow.art,
each image needs a JSON file beside it with the same name: 001.png and 001.json.
Download the template for a still image or for an HTML artwork:
{
"name": "My NFT #1",
"description": "This is a description of my NFT",
"attributes": [
{
"trait_type": "Background",
"value": "Green"
}
],
"tags": ["photography", "my-custom-tag"]
}| Field | Required | Rules |
|---|---|---|
name | Yes | Text, 32 characters at most |
description | Yes | Text, 1,000 characters at most |
attributes | No | A list of traits. Each has a trait_type and a value, and both must be text. Write a number as "7", not 7 |
tags | No | A list of text tags. mallow lowercases each one and turns spaces into hyphens |
animation_url | No | For an HTML artwork, the address of the HTML, such as an ipfs:// link. Must not be empty |
properties.category | No | Set it to "html" beside animation_url, so mallow treats the artwork as HTML |
- Leave out
image. mallow writesimageandpropertiesfrom the files you upload - For an HTML artwork, the uploaded image is the thumbnail and
animation_urlis the artwork - Any other top-level field in the file is kept as it is
- The upload page checks every file before it uploads anything, and names the file and the field when one fails