| SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:'// DeroBeats Registry — Minimal
// Initialize, RegisterSong, UpvoteSong, RemoveSong, TransferOwnership, GetTotalSongs, GetSong
// Return codes: 0=ok 1=init_fail 101=bad songSCID 102=bad title 103=bad artist 104=duplicate
// 105=anon 106=not_owner 107=not_found 108=length_limit 111=newOwner_empty 200=already_upvoted
Function Initialize() Uint64
10 IF EXISTS("owner") THEN GOTO 999
20 DIM addr as String
25 LET addr = ADDRESS_STRING(SIGNER())
26 IF LEN(addr) < 1 THEN GOTO 999
30 STORE("owner", addr)
40 STORE("total_songs", 0)
50 STORE("platform_name", "DeroBeats")
60 STORE("platform_url", "derobeats.tela")
98 RETURN 0
999 RETURN 1
End Function
// RegisterSong — 6 params (previewArtCid optional)
Function RegisterSong(songSCID String, title String, artist String, genre String, ipfsHash String, previewArtCid String) Uint64
10 DIM addr as String
15 LET addr = ADDRESS_STRING(SIGNER())
16 IF LEN(addr) < 1 THEN RETURN 105
20 IF LEN(songSCID) != 64 THEN RETURN 101
25 IF LEN(title) < 1 THEN RETURN 102
26 IF LEN(title) > 256 THEN RETURN 108
30 IF LEN(artist) < 1 THEN RETURN 103
31 IF LEN(artist) > 128 THEN RETURN 108
35 IF LEN(ipfsHash) > 128 THEN RETURN 108
36 IF LEN(genre) > 64 THEN RETURN 108
37 IF LEN(previewArtCid) > 128 THEN RETURN 108
40 IF EXISTS(songSCID + "_registered") THEN RETURN 104
50 DIM count as Uint64
60 LET count = LOAD("total_songs")
70 STORE("song_" + count, songSCID)
80 STORE(songSCID + "_registered", 1)
90 STORE(songSCID + "_title", title)
100 STORE(songSCID + "_artist", artist)
110 STORE(songSCID + "_artist_addr", addr)
120 DIM g as String
125 IF LEN(genre) < 1 THEN LET g = "Unknown" ELSE LET g = genre
130 STORE(songSCID + "_genre", g)
140 STORE(songSCID + "_ipfs", ipfsHash)
145 IF LEN(previewArtCid) > 0 THEN STORE(songSCID + "_preview_art_cid", previewArtCid)
150 STORE(songSCID + "_upvotes", 0)
160 STORE(songSCID + "_timestamp", BLOCK_TIMESTAMP())
170 STORE("total_songs", count + 1)
998 RETURN 0
End Function
// Upvote song (one per address per song)
Function UpvoteSong(songSCID String) Uint64
10 DIM addr as String
15 LET addr = ADDRESS_STRING(SIGNER())
16 IF LEN(addr) < 1 THEN RETURN 105
20 IF EXISTS(songSCID + "_registered") == 0 THEN RETURN 107
30 IF EXISTS(addr + "_upvoted_" + songSCID) THEN RETURN 200
40 DIM upvotes as Uint64
50 LET upvotes = LOAD(songSCID + "_upvotes")
60 STORE(songSCID + "_upvotes", upvotes + 1)
70 STORE(addr + "_upvoted_" + songSCID, 1)
98 RETURN 0
End Function
// Remove song (owner only)
Function RemoveSong(songSCID String) Uint64
10 IF LOAD("owner") != ADDRESS_STRING(SIGNER()) THEN RETURN 106
20 IF EXISTS(songSCID + "_registered") == 0 THEN RETURN 107
30 STORE(songSCID + "_removed", 1)
40 STORE(songSCID + "_removed_at", BLOCK_TIMESTAMP())
98 RETURN 0
End Function
// Transfer ownership (owner only)
Function TransferOwnership(newOwner String) Uint64
10 IF LOAD("owner") != ADDRESS_STRING(SIGNER()) THEN RETURN 106
15 IF LEN(newOwner) < 1 THEN RETURN 111
20 STORE("owner", newOwner)
98 RETURN 0
End Function
Function GetTotalSongs() Uint64
10 RETURN LOAD("total_songs")
End Function
Function GetSong(index Uint64) String
10 DIM total as Uint64
15 LET total = LOAD("total_songs")
20 IF index >= total THEN RETURN ""
25 RETURN LOAD("song_" + index)
End Function
'] |