Composition
Publishing side
Writers
- Terrence Dole—50.0%
- Marcus Vane—50.0%
Publishers
- —
PH = of the publisher's-half (the 50% of composition revenue allocated to publishers; the other 50% writer's-half is paid directly to writers).
Nightscript · Meridian Music Group
Dregs
Composition and master are two separate copyrights. Composition is the song (lyrics + melody, identified by ISWC). Master is the specific recording (identified by ISRC). They live in parallel ecosystems with different owners, collectors, and money flows.
Composition
Writers
Publishers
PH = of the publisher's-half (the 50% of composition revenue allocated to publishers; the other 50% writer's-half is paid directly to writers).
Master
Owner of record
Meridian Music Group · 100.0%
Held since: 2024-07-19
Artist royalty
16.0%
Of the master's net revenue. Producer points (below) come off the artist's share in standard major-label deals via a Letter of Direction.
Neighboring rights
Eligible
Master-side performance royalties — SoundExchange (US, non-interactive digital), PPL (UK), GVL (DE), etc.
Usage analytics
Every play is checked against the on-chain record — the only durable defense against AI counterfeits and unattributed training use.
On-chain · Verified contract source
// ── This recording's registration · Base (mainnet) ──
RightsRegistry(0xEaa4…6848).registerRight(
"Dregs - Cassette Summer - Nightscript - master rights",
keccak256("Nightscript"), // subLabel
0, // master_economic_interest
initialOwner,
attestationUID
);
// → emit RightRegistered(...) tx 0x99bfee…76da0c1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.27;34import {IEAS} from "./interfaces/IEAS.sol";5import {IPAssetAuth} from "./IPAssetAuth.sol";67/// @notice Tracks transferable rights and their on-chain ownership history.8/// @dev Each right is identified by a deterministic rightId derived from9/// keccak256(recordId, rightType). Right types match the music-rights10/// schema enum: 0 master_economic_interest, 1 catalog_administration,11/// 2 publishing_administration, 3 neighboring_rights, 4 sync_clearance,12/// 5 mechanical_administration.13contract RightsRegistry {14IEAS public immutable eas;15IPAssetAuth public immutable auth;1617struct Right {18address currentOwner;19bytes32 subLabel;20uint8 rightType;21uint64 lastTransferAt;22bool exists;23}2425mapping(bytes32 => Right) public rights;2627event RightRegistered(28bytes32 indexed rightId,29bytes32 indexed subLabel,30uint8 indexed rightType,31address initialOwner,32bytes32 attestationUID33);3435event RightsTransferred(36bytes32 indexed rightId,37address indexed from,38address indexed to,39uint8 rightType,40bytes32 attestationUID,41uint64 timestamp42);4344/// @notice Compute the deterministic right ID for a (recordId, rightType).45function rightIdOf(string memory recordId, uint8 rightType) public pure returns (bytes32) {46return keccak256(abi.encodePacked(recordId, rightType));47}4849/// @notice Register a right for the first time. Caller must hold50/// ROLE_REGISTER for the sub-label; attestationUID references the51/// MUSIC_RECORDING_v1 attestation for the underlying recording.52function registerRight(53string calldata recordId,54bytes32 subLabel,55uint8 rightType,56address initialOwner,57bytes32 attestationUID58) external returns (bytes32 rightId) {59require(auth.canRegister(msg.sender, subLabel), "RightsRegistry: not authorized");60require(rightType <= 5, "RightsRegistry: bad rightType");61_verifyAttestationExists(attestationUID);6263rightId = rightIdOf(recordId, rightType);64require(!rights[rightId].exists, "RightsRegistry: already registered");6566rights[rightId] = Right({67currentOwner: initialOwner,68subLabel: subLabel,69rightType: rightType,70lastTransferAt: uint64(block.timestamp),71exists: true72});7374emit RightRegistered(rightId, subLabel, rightType, initialOwner, attestationUID);75}7677/// @notice Transfer a right. Caller must be the current owner. The78/// attestation must be a RIGHTS_TRANSFER_v1 with both signatures.79function transferRight(bytes32 rightId, address to, bytes32 attestationUID) external {80Right storage r = rights[rightId];81require(r.exists, "RightsRegistry: unknown right");82require(msg.sender == r.currentOwner, "RightsRegistry: not current owner");83_verifyAttestationExists(attestationUID);8485address from = r.currentOwner;86r.currentOwner = to;87r.lastTransferAt = uint64(block.timestamp);8889emit RightsTransferred(rightId, from, to, r.rightType, attestationUID, uint64(block.timestamp));90}9192function ownerOf(bytes32 rightId) external view returns (address) {93require(rights[rightId].exists, "RightsRegistry: unknown right");94return rights[rightId].currentOwner;95}96}