Protocol · v1.0 · Base · chain 8453
Open infrastructure for music ownership.
SoundMint is native music-ownership infrastructure on Base. Artists press each song as a 1-of-1 master NFT they actually own, and every song gets its own onchain monetization stack. Fans collect a fixed-price token to unlock a song, or buy a bonding-curve stake to co-own its revenue — all settled in USDC. Revenue splits are enforced onchain by a per-song vault: creators keep a majority share, holders share the rest, and the protocol takes a 5% fee.
Every contract below is deployed on Base with source verified on the block explorer — the ABI, the code, and the state are public. You don’t need permission (or an API key) to read releases, verify provenance, or collect a song directly from the contracts.
What’s immutable, and why
When a song is pressed, its SongIPAsset — the 1-of-1 master NFT — sets its tokenURI exactly once, inside a one-shot initializer. There is no setter. The URI is an ipfs:// content address, so the metadata JSON — and the encrypted master audio and cover art it references — are content-addressed too: changing a single byte would change the address.
The factory implementations froze permanently at the first mainnet press. The protocol’s governance (a SoundMint Safe) can authorize new factories in the Registry, but can never rewrite a minted master, its audio fingerprint, or its splits.
Practical consequence for integrators: a release you read from the Registry today reads the same forever. Cache aggressively; trust the chain.
The release pipeline
Press the master
SongIPFactory → SongIPAssetThe factory clones a 1-of-1 Master NFT (ERC-721) to the artist and logs it in the Registry with the audio’s IPFS fingerprint.
Open for collecting
SongIPAsset.stake → SongIPFactoryThe artist stakes the master with their splits and pricing; the factory deploys the song’s MonetizationVault, Collector Token, and Ownership Token.
Fans collect
CollectorTokenFans buy an ERC-1155 collector token in USDC at a fixed, first-sale-locked price; holding one unlocks streaming and downloads in Player and Crate.
Fans co-own
OwnershipTokenFans can buy a bonding-curve ERC-20 stake in the song and earn a proportional, claimable share of its ongoing revenue.
Revenue splits, onchain
MonetizationVaultEvery sale routes USDC into the vault: a 5% protocol fee, then the creator collective and ownership holders — each claims their own balance anytime.
Bundle into an album
AlbumGroupFactoryOptionally group several released songs into one onchain album (no new token) with an optional album-wide split for sync and licensing.
Deployed contracts
Addresses resolve from the same registry the app itself uses. Per-release assets are EIP-1167 minimal-proxy clones — every pressed song gets its own instances; the canonical implementations are listed here.
Core Infrastructure
SoundMintRegistry
RegistryOne onchain index of every song and album
0x00543c632c3c760AC57B6eD524e328fa9b25a00b
Details
SoundMintRegistry
RegistryOne onchain index of every song and album
0x00543c632c3c760AC57B6eD524e328fa9b25a00b
A single onchain directory listing every song and album released through SoundMint on Base. When a factory mints your Master NFT, it records your song’s contract address, your artist wallet, and the IPFS fingerprint of the audio here — plus whether revenue-sharing is switched on. Crate and Player read this as the protocol’s authoritative “does this release exist, who owns it, and is it monetized” lookup, so fans can trust a release is genuine.
Key functions
verifySong(song)— anyone reads back whether a song is genuinely registered, plus its artist, audio hash, and monetized statusregisterSong(song, artist, ipfsHash)— an authorized factory logs a newly minted Master NFT under the artist with its audio fingerprintregisterAlbum(albumId, artist, songs[])— a factory groups several song contracts into one indexed album recordmarkMonetized(song)— a factory flags a song as revenue-sharing once its Ownership Token and vault are liveauthorizeFactory(factory)— the SoundMint Safe grants a factory permission to write to the index
SongIPFactory
Factory (EIP-1167 clones)Deploys every song’s master + monetization stack
0x366be46354573431784A4E4CFfa173176DDfBE88
Details
SongIPFactory
Factory (EIP-1167 clones)Deploys every song’s master + monetization stack
0x366be46354573431784A4E4CFfa173176DDfBE88
The onchain birthplace of every SoundMint release. When an artist presses a song, it stamps out a fresh Master NFT (ERC-721) using gas-cheap cloning, so each release gets its own dedicated contract without paying full deployment cost, and records it in the global Registry. Later, when the artist stakes that song to open it for sale, the factory deploys and wires together the song’s Collector Token, Ownership Token, and revenue vault — all settling in USDC with the protocol’s 5% fee baked in.
Key functions
deploySong(params)— clones a new Master NFT (ERC-721), mints it to the artist, and registers the song onchaindeployMonetizationContracts(song, artist, config)— on stake, spins up and wires that song’s Collector Token, Ownership Token, and USDC vaultretireSongMonetization(song, …)— when a song is unstaked, permanently freezes its token markets and marks it retiredproposeImplementationUpgrade(…)— owner-only; starts a ~48-hour timelock before new templates apply to future songspauseCollectorToken(token)— lets the SoundMint Safe hit an emergency stop on a single song’s collector market
AlbumGroupFactory
Album grouping (mints no token)Bundles your songs into an album — no new token
0xc1d7E567c4b77efA1963dfF7d58ac1961FD726bf
Details
AlbumGroupFactory
Album grouping (mints no token)Bundles your songs into an album — no new token
0xc1d7E567c4b77efA1963dfF7d58ac1961FD726bf
Despite the “factory” name, this contract deploys nothing per song and mints no token — it records albums as plain onchain data: a name, a cover image, and a list of your already-released songs (each its own Master NFT), indexed in the Registry so surfaces like Crate can show the tracks as one release. Before saving, it checks every song is registered and currently owned by you. You can optionally attach one album-wide 0xSplits split for income that belongs to the whole album (sync, licensing) — per-song sales still flow through each song’s own vault.
Key functions
createAlbum(name, coverURI, songs[])— groups songs you own into a new onchain album and indexes it in the RegistryaddSongToAlbum(albumId, song)— appends another registered song you own to an existing album, up to 100 tracksremoveSongFromAlbum(albumId, song)— drops a song out of the album’s track listenableAlbumMonetization(albumId, retentionBps)— one-time attaches an optional album-wide 0xSplits revenue splitdeactivateAlbum(albumId)— permanently marks the album inactive — one-way, no reactivation
Per-Release Assets
SongIPAsset
ERC-721 · Master NFT · ERC-2981 royalties · cloned per songOne song, one 1-of-1 master the artist truly owns
0x93F8B90f17c2869e00d643F15e7A9EA984CbD13A
Details
SongIPAsset
ERC-721 · Master NFT · ERC-2981 royalties · cloned per songOne song, one 1-of-1 master the artist truly owns
0x93F8B90f17c2869e00d643F15e7A9EA984CbD13A
The single, one-of-a-kind NFT (ERC-721) that stands for the master recording of one song — the onchain original an artist mints and holds. A fresh contract is deployed per song, its token is always #1, and a 5% resale royalty to the artist is wired in from the start. When the artist decides to monetize, they “stake” this master into a MonetizationVault, which deploys the fan-facing Collector Token and revenue-sharing Ownership Token; while no fan has bought in yet, they can unstake and take the master back.
Key functions
stake(config)— locks in splits and pricing, deploys the vault + collector and ownership tokens, and moves the master into the vaultunstake()— reclaims the master and permanently retires monetization — only while no fan has collected or bought incurrentOwner() → address— reports the true artist-owner even while the master is held in the vault during a releaseisStaked() → bool— tells you whether the song is currently live for monetizationinitialize(artist, ipfsHash, uri, factory)— factory-only setup that mints the 1-of-1 master to the artist and sets their 5% resale royalty
MonetizationVault
Revenue vault · USDC settlement · cloned per songEvery dollar a song earns, split and paid out onchain
0xED6df7301Fa0493fDBD70739580d428eA7A00d4E
Details
MonetizationVault
Revenue vault · USDC settlement · cloned per songEvery dollar a song earns, split and paid out onchain
0xED6df7301Fa0493fDBD70739580d428eA7A00d4E
The per-song bank account that catches every dollar a release earns and settles it onchain in USDC. Whenever a Collector Token or Ownership Token sells — or an outside licensing/sync deal pays in — the vault first takes the fixed 5% protocol fee, then routes the rest to the song’s creators and, when any exist, its Ownership Token holders. The creators’ majority share (locked between 51% and 95% at mint) accrues to each collaborator by their exact percentage, and everyone pulls their own earnings whenever they want — splits can’t be changed or shorted after buyers join.
Key functions
receiveCollectorRevenueUSDC(amount)— takes money from a collection sale, skims the 5% fee, and splits the rest between creators and holdersreceiveOwnershipRevenueUSDC(amount)— takes proceeds from Ownership Token curve sales and, after the fee, routes them to the creator collectivereceiveOtherRevenueUSDC(amount)— lets anyone pay in outside revenue (licensing, sync, tips) to be fee-skimmed and split the same wayclaimCreatorRevenueUSDC()— lets a creator withdraw their accrued USDC share to their own wallet at any timecanUnstake() → bool— reports whether the artist can still pull the master back — false forever once any token sells
Fan Tokens
CollectorToken
ERC-1155 · cloned per songA few dollars of USDC buys the token that unlocks a song
0x3A67bbE2c3aA1d33b6692Ff8aC246616AA0964c2
Details
CollectorToken
ERC-1155 · cloned per songA few dollars of USDC buys the token that unlocks a song
0x3A67bbE2c3aA1d33b6692Ff8aC246616AA0964c2
The low-cost, fan-facing way to collect a song. Each release gets its own ERC-1155 token anyone can buy at a fixed USDC price — no supply limit, so every fan who wants in can own one. Holding at least one is what Player and Crate check to unlock streaming and downloads, and it’s freely transferable like any collectible. Every purchase sends USDC straight into the song’s vault. Collector tokens grant access and proof of support only — no revenue share or voting (that’s the Ownership Token). Buyer protection: the price can be tuned before the first sale, but the moment anyone buys it’s permanently locked, so no later fan pays more.
Key functions
purchaseWithUSDC(qty, maxCost)— pay the fixed USDC price to mint 1–100 collector tokens, with a max-cost guard against surprise changeshasAccess(user) → bool— true if a wallet holds at least one token — the onchain gate Player and Crate read to unlock playbackgetTotalCostUSDC(qty)— quotes the exact USDC you’ll pay for a given quantity before you commitupdatePriceUSDC(newPrice)— lets the artist set the price, but only before the first sale — permanently locked after
OwnershipToken
ERC-20 · bonding-curve revenue share · cloned per songBuy a stake in the song and collect its revenue
0xAa0bA2F260F3ccDBc2A734179a305E7B9D62C4c2
Details
OwnershipToken
ERC-20 · bonding-curve revenue share · cloned per songBuy a stake in the song and collect its revenue
0xAa0bA2F260F3ccDBc2A734179a305E7B9D62C4c2
A limited-supply ERC-20 token, one per song, that turns fans into revenue-sharing co-owners. Creators keep at least 51% of the tokens; the rest are sold to the public along a quadratic bonding curve priced in USDC, so each token costs a little more than the last. Every holder earns a proportional cut of the song’s ongoing revenue (collector sales and other payouts routed through the vault, but not the primary token-sale proceeds), which accrues automatically and can be claimed in USDC at any time. New buyers never dilute what earlier holders have already earned.
Key functions
purchaseWithUSDC(qty, maxCost)— buy up to 10 tokens along the curve in USDC, with a max-cost slippage guardcalculatePurchasePriceUSDC(qty)— quote the exact USDC cost to buy a given number of tokens right nowclaimRevenueUSDC()— withdraw your accrued share of the song’s revenue as USDCgetClaimableRevenueUSDC(holder)— check how much USDC revenue a holder can currently claimreceiveRevenueUSDC(amount)— vault-only hook that credits incoming song revenue to all holders pro-rata
Integrating
Read releases — public API, no key
GET https://api.soundmint.com/api/v1/crate/releases GET https://api.soundmint.com/api/v1/crate/releases/:id GET https://api.soundmint.com/api/v1/crate/artists/:username/releases
Returns published releases with per-track collector-token addresses and prices (raw 6-decimal USDC). Streaming of owned masters stays behind authenticated, ownership-gated endpoints.
Verify provenance — straight from the chain
Call verifySong(address) on the Registry to confirm a song contract is genuine, who the artist is, and the IPFS fingerprint of its audio. The ABI is on the verified-source page above.
Collect a song — two calls, USDC on Base
USDC.approve(collectorToken, priceUSDC) CollectorToken.purchaseWithUSDC(quantity, maxCostUSDC)
maxCostUSDC is a hard ceiling — a price change after your approval makes the transaction revert rather than overcharge. Collecting grants listen access to that song on SoundMint; it is not a license to the underlying work.
Deeper integration surfaces — typed ABIs, event schemas, and webhooks — are being documented as the protocol opens up. If you’re building something, tell us what you need.
Protocol v1.0 · Base · implementations frozen at first press · Whitepaper