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.

01

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.

02

The release pipeline

01

Press the master

SongIPFactory → SongIPAsset

The 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.

02

Open for collecting

SongIPAsset.stake → SongIPFactory

The artist stakes the master with their splits and pricing; the factory deploys the song’s MonetizationVault, Collector Token, and Ownership Token.

03

Fans collect

CollectorToken

Fans 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.

04

Fans co-own

OwnershipToken

Fans can buy a bonding-curve ERC-20 stake in the song and earn a proportional, claimable share of its ongoing revenue.

05

Revenue splits, onchain

MonetizationVault

Every sale routes USDC into the vault: a 5% protocol fee, then the creator collective and ownership holders — each claims their own balance anytime.

06

Bundle into an album

AlbumGroupFactory

Optionally group several released songs into one onchain album (no new token) with an optional album-wide split for sync and licensing.

03

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

Registry

One onchain index of every song and album

0x00543c632c3c760AC57B6eD524e328fa9b25a00b

Details

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 status
  • registerSong(song, artist, ipfsHash) an authorized factory logs a newly minted Master NFT under the artist with its audio fingerprint
  • registerAlbum(albumId, artist, songs[]) a factory groups several song contracts into one indexed album record
  • markMonetized(song) a factory flags a song as revenue-sharing once its Ownership Token and vault are live
  • authorizeFactory(factory) the SoundMint Safe grants a factory permission to write to the index
Verified source on Blockscout

SongIPFactory

Factory (EIP-1167 clones)

Deploys every song’s master + monetization stack

0x366be46354573431784A4E4CFfa173176DDfBE88

Details

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 onchain
  • deployMonetizationContracts(song, artist, config) on stake, spins up and wires that song’s Collector Token, Ownership Token, and USDC vault
  • retireSongMonetization(song, …) when a song is unstaked, permanently freezes its token markets and marks it retired
  • proposeImplementationUpgrade(…) owner-only; starts a ~48-hour timelock before new templates apply to future songs
  • pauseCollectorToken(token) lets the SoundMint Safe hit an emergency stop on a single song’s collector market
Verified source on Blockscout

AlbumGroupFactory

Album grouping (mints no token)

Bundles your songs into an album — no new token

0xc1d7E567c4b77efA1963dfF7d58ac1961FD726bf

Details

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 Registry
  • addSongToAlbum(albumId, song) appends another registered song you own to an existing album, up to 100 tracks
  • removeSongFromAlbum(albumId, song) drops a song out of the album’s track list
  • enableAlbumMonetization(albumId, retentionBps) one-time attaches an optional album-wide 0xSplits revenue split
  • deactivateAlbum(albumId) permanently marks the album inactive — one-way, no reactivation
Verified source on Blockscout

Per-Release Assets

SongIPAsset

ERC-721 · Master NFT · ERC-2981 royalties · cloned per song

One song, one 1-of-1 master the artist truly owns

0x93F8B90f17c2869e00d643F15e7A9EA984CbD13A

Details

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 vault
  • unstake() reclaims the master and permanently retires monetization — only while no fan has collected or bought in
  • currentOwner() → address reports the true artist-owner even while the master is held in the vault during a release
  • isStaked() → bool tells you whether the song is currently live for monetization
  • initialize(artist, ipfsHash, uri, factory) factory-only setup that mints the 1-of-1 master to the artist and sets their 5% resale royalty
Verified source on Blockscout

MonetizationVault

Revenue vault · USDC settlement · cloned per song

Every dollar a song earns, split and paid out onchain

0xED6df7301Fa0493fDBD70739580d428eA7A00d4E

Details

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 holders
  • receiveOwnershipRevenueUSDC(amount) takes proceeds from Ownership Token curve sales and, after the fee, routes them to the creator collective
  • receiveOtherRevenueUSDC(amount) lets anyone pay in outside revenue (licensing, sync, tips) to be fee-skimmed and split the same way
  • claimCreatorRevenueUSDC() lets a creator withdraw their accrued USDC share to their own wallet at any time
  • canUnstake() → bool reports whether the artist can still pull the master back — false forever once any token sells
Verified source on Blockscout

Fan Tokens

CollectorToken

ERC-1155 · cloned per song

A few dollars of USDC buys the token that unlocks a song

0x3A67bbE2c3aA1d33b6692Ff8aC246616AA0964c2

Details

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 changes
  • hasAccess(user) → bool true if a wallet holds at least one token — the onchain gate Player and Crate read to unlock playback
  • getTotalCostUSDC(qty) quotes the exact USDC you’ll pay for a given quantity before you commit
  • updatePriceUSDC(newPrice) lets the artist set the price, but only before the first sale — permanently locked after
Verified source on Blockscout

OwnershipToken

ERC-20 · bonding-curve revenue share · cloned per song

Buy a stake in the song and collect its revenue

0xAa0bA2F260F3ccDBc2A734179a305E7B9D62C4c2

Details

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 guard
  • calculatePurchasePriceUSDC(qty) quote the exact USDC cost to buy a given number of tokens right now
  • claimRevenueUSDC() withdraw your accrued share of the song’s revenue as USDC
  • getClaimableRevenueUSDC(holder) check how much USDC revenue a holder can currently claim
  • receiveRevenueUSDC(amount) vault-only hook that credits incoming song revenue to all holders pro-rata
Verified source on Blockscout
04

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