SC CODE: Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("var_header_name", "dero.js")
31 STORE("var_header_description", "")
32 STORE("var_header_icon", "")
33 STORE("dURL", "")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "/")
36 STORE("fileCheckC", "214b1ad1cd407187988293a626aec685f460b2cf82fcd93cc3c2e766b6411e72")
37 STORE("fileCheckS", "0ab547ccab84a3c8be118558d7ea76ecca0411f44b922e1b9a698b86607068c0")
100 RETURN 0
End Function
Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("docVersion", "1.0.0")
60 STORE("hash", HEX(TXID()))
70 STORE("likes", 0)
80 STORE("dislikes", 0)
100 RETURN 0
End Function
Function address() String
10 DIM s as String
20 LET s = SIGNER()
30 IF IS_ADDRESS_VALID(s) THEN GOTO 50
40 RETURN "anon"
50 RETURN ADDRESS_STRING(s)
End Function
Function Rate(r Uint64) Uint64
10 DIM addr as String
15 LET addr = address()
16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30
20 RETURN 1
30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT())
40 IF r < 50 THEN GOTO 70
50 STORE("likes", LOAD("likes")+1)
60 RETURN 0
70 STORE("dislikes", LOAD("dislikes")+1)
100 RETURN 0
End Function
/*
// CIPHER SNAKE DELUXE - DERO / XSWD integration
(function deroModule(){
'use strict';
// Paste your deployed SCID here (64 hex chars) OR append ?scid=<SCID> to URL.
var LEADERBOARD_SCID_DEFAULT = "c84195eda256a4a956ac3422d8296853b6675365a430b8476da1e21c108e59a8";
var SUPPORT_ADDRESS = 'dero1qyjrv7hqstqgzw8eu5nnh2a8gf9sxttq800ksy43w2vj7ed4swn7uqgdhsv66';
var XSWD_ENDPOINTS = [
'ws://localhost:44326/xswd',
'ws://127.0.0.1:44326/xswd',
'ws://localhost:10103/xswd',
'ws://127.0.0.1:10103/xswd',
];
var DERO_UNIT = 100000;
var SIM_STORAGE_KEY = "csd_leaderboard_sim_v1";
var APP_ID_STORAGE = 'csd_xswd_app_id';
var TOP_N = 5;
function resolveScid(){
if (LEADERBOARD_SCID_DEFAULT && /^[0-9a-fA-F]{64}$/.test(LEADERBOARD_SCID_DEFAULT)){
return LEADERBOARD_SCID_DEFAULT;
}
try {
var q = new URLSearchParams(window.location.search);
var s = q.get('scid');
if (s && /^[0-9a-fA-F]{64}$/.test(s)) return s;
} catch (e){}
return "";
}
var LEADERBOARD_SCID = resolveScid();
function getOrCreateAppId(){
var id = localStorage.getItem(APP_ID_STORAGE);
if (!id || !/^[0-9a-f]{64}$/i.test(id)){
var bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
id = Array.from(bytes, function(b){ return b.toString(16).padStart(2,'0'); }).join('');
localStorage.setItem(APP_ID_STORAGE, id);
}
return id;
}
var DeroWallet = (function(){
var ws = null;
var accepted = false;
var addressCache = null;
var nextId = 1;
var pending = new Map();
function isConnected(){
return accepted && ws && ws.readyState === WebSocket.OPEN;
}
function tryOpen(url){
return new Promise(function(resolve, reject){
var sock;
try { sock = new WebSocket(url); }
catch (e){ reject(e); return; }
var settled = false;
var timer = setTimeout(function(){
if (settled) return;
settled = true;
try { sock.close(); } catch(_){}
reject(new Error('timeout'));
}, 4000);
sock.addEventListener('open', function(){
var handshake = {
id: getOrCreateAppId(),
name: 'Cipher Snake Deluxe',
description: 'Cipherpunk snake game with on-chain Top 5 leaderboard.',
url: window.location.origin || 'http://localhost',
};
try { sock.send(JSON.stringify(handshake)); }
catch (e){
clearTimeout(timer); settled = true;
reject(e); return;
}
});
sock.addEventListener('message', function(ev){
var msg; try { msg = JSON.parse(ev.data); } catch(_){ return; }
if (msg.accepted !== undefined && !settled){
clearTimeout(timer);
settled = true;
if (msg.accepted === true){
resolve(sock);
} else {
try { sock.close(); } catch(_){}
reject(new Error(msg.message || 'Wallet rejected the connection'));
}
return;
}
if (msg.id !== undefined && pending.has(msg.id)){
var h = pending.get(msg.id);
pending.delete(msg.id);
if (msg.error) h.reject(new Error(msg.error.message || 'RPC error'));
else h.resolve(msg.result);
}
});
sock.addEventListener('error', function(){
if (settled) return;
settled = true;
clearTimeout(timer);
reject(new Error('WebSocket error'));
});
sock.addEventListener('close', function(){
if (!settled){
settled = true;
clearTimeout(timer);
reject(new Error('WebSocket closed'));
} else if (sock === ws){
accepted = false; ws = null; addressCache = null;
pending.forEach(function(h){ h.reject(new Error('WebSocket closed')); });
pending.clear();
}
});
});
}
function connect(){
if (isConnected()) return Promise.resolve(addressCache);
var endpoints = XSWD_ENDPOINTS.slice();
function next(){
if (!endpoints.length){
return Promise.reject(new Error(
'No DERO wallet detected. Open Engram (Settings > enable XSWD) or dero-wallet-cli with "xswd enable", then retry.'
));
}
var url = endpoints.shift();
return tryOpen(url).catch(function(err){
if (err && /reject/i.test(err.message || '')){ throw err; }
return next();
});
}
return next().then(function(sock){
ws = sock;
accepted = true;
return call('GetAddress', {}).then(function(res){
addressCache = (res && res.address) || null;
return addressCache;
});
});
}
function call(method, params){
return new Promise(function(resolve, reject){
if (!ws || ws.readyState !== WebSocket.OPEN){
reject(new Error('Wallet not connected')); return;
}
var id = nextId++;
pending.set(id, { resolve: resolve, reject: reject });
try {
ws.send(JSON.stringify({
jsonrpc: '2.0', id: id, method: method, params: params || {},
}));
} catch (e){ pending.delete(id); reject(e); return; }
var timeoutMs = /invoke|Transfer|Publish/i.test(method) ? 60000 : 15000;
setTimeout(function(){
if (pending.has(id)){
pending.delete(id);
reject(new Error('Request timeout: ' + method));
}
}, timeoutMs);
});
}
function getAddress(){ return addressCache; }
return { connect: connect, isConnected: isConnected, call: call, getAddress: getAddress };
})();
var Leaderboard = (function(){
function readSim(){
try {
var raw = localStorage.getItem(SIM_STORAGE_KEY);
var arr = raw ? JSON.parse(raw) : [];
return Array.isArray(arr) ? arr : [];
} catch (e){ return []; }
}
function writeSim(arr){
try { localStorage.setItem(SIM_STORAGE_KEY, JSON.stringify(arr)); } catch (e){}
}
function isLive(){ return !!LEADERBOARD_SCID; }
function fetchTop5(){
if (!isLive()){
var entries = readSim();
entries.sort(function(a,b){ return b.score - a.score; });
return Promise.resolve(entries.slice(0, TOP_N));
}
var ensure = DeroWallet.isConnected() ? Promise.resolve() : DeroWallet.connect();
return ensure.then(function(){
var keys = [];
for (var i = 0; i < TOP_N; i++){
keys.push('name_' + i, 'score_' + i, 'addr_' + i, 'time_' + i);
}
return DeroWallet.call('DERO.GetSC', {
scid: LEADERBOARD_SCID,
code: false, variables: false, keysstring: keys,
});
}).then(function(res){
var values = (res && res.valuesstring) || [];
var rows = [];
for (var i = 0; i < TOP_N; i++){
var name = values[i*4] || '';
var score = parseInt(values[i*4 + 1] || '0', 10) || 0;
var addr = values[i*4 + 2] || '';
var time = parseInt(values[i*4 + 3] || '0', 10) || 0;
if (score > 0 && name){
rows.push({ pseudo: name, score: score, address: addr, height: time });
}
}
rows.sort(function(a,b){ return b.score - a.score; });
return rows;
});
}
function publish(pseudo, score){
if (score <= 0) return Promise.reject(new Error('Score must be positive'));
if (!/^[A-Za-z0-9_\-]{1,16}$/.test(pseudo)){
return Promise.reject(new Error('Pseudo must be 1-16 chars [A-Z a-z 0-9 _ -]'));
}
if (!isLive()){
var list = readSim();
list.push({
pseudo: pseudo, score: score,
address: 'SIM_' + Math.random().toString(36).slice(2,10).toUpperCase(),
height: Date.now(), you: true,
});
list.sort(function(a,b){ return b.score - a.score; });
writeSim(list.slice(0, 50));
return Promise.resolve({ simulated: true });
}
var ensure = DeroWallet.isConnected() ? Promise.resolve() : DeroWallet.connect();
return ensure.then(function(){
return DeroWallet.call('scinvoke', {
scid: LEADERBOARD_SCID,
ringsize: 2,
sc_rpc: [
{ name: 'entrypoint', datatype: 'S', value: 'Publish' },
{ name: 'pseudo', datatype: 'S', value: pseudo },
{ name: 'score', datatype: 'U', value: score },
],
});
}).then(function(res){
return { simulated: false, txid: (res && res.txid) || null };
});
}
return { fetchTop5: fetchTop5, publish: publish, isLive: isLive };
})();
window.Leaderboard = Leaderboard;
window.DeroWallet = DeroWallet;
var modeChip = document.getElementById('modeChip');
if (modeChip){
if (Leaderboard.isLive()){
modeChip.textContent = 'MODE: MAINNET';
modeChip.classList.remove('sim');
modeChip.classList.add('live');
modeChip.title = 'SCID: ' + LEADERBOARD_SCID.slice(0,10) + '...';
DeroWallet.connect().catch(function(){});
} else {
modeChip.textContent = 'MODE: SIM (no SCID)';
modeChip.title = 'No SCID configured. Append ?scid=<SCID> to URL to go live.';
}
}
window.__csdSupportAddress = SUPPORT_ADDRESS;
window.__csdDeroUnit = DERO_UNIT;
})();
*/ |
| SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:'Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("var_header_name", "dero.js")
31 STORE("var_header_description", "")
32 STORE("var_header_icon", "")
33 STORE("dURL", "")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "/")
36 STORE("fileCheckC", "214b1ad1cd407187988293a626aec685f460b2cf82fcd93cc3c2e766b6411e72")
37 STORE("fileCheckS", "0ab547ccab84a3c8be118558d7ea76ecca0411f44b922e1b9a698b86607068c0")
100 RETURN 0
End Function
Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("docVersion", "1.0.0")
60 STORE("hash", HEX(TXID()))
70 STORE("likes", 0)
80 STORE("dislikes", 0)
100 RETURN 0
End Function
Function address() String
10 DIM s as String
20 LET s = SIGNER()
30 IF IS_ADDRESS_VALID(s) THEN GOTO 50
40 RETURN "anon"
50 RETURN ADDRESS_STRING(s)
End Function
Function Rate(r Uint64) Uint64
10 DIM addr as String
15 LET addr = address()
16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30
20 RETURN 1
30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT())
40 IF r < 50 THEN GOTO 70
50 STORE("likes", LOAD("likes")+1)
60 RETURN 0
70 STORE("dislikes", LOAD("dislikes")+1)
100 RETURN 0
End Function
/*
// CIPHER SNAKE DELUXE - DERO / XSWD integration
(function deroModule(){
'use strict';
// Paste your deployed SCID here (64 hex chars) OR append ?scid=<SCID> to URL.
var LEADERBOARD_SCID_DEFAULT = "c84195eda256a4a956ac3422d8296853b6675365a430b8476da1e21c108e59a8";
var SUPPORT_ADDRESS = 'dero1qyjrv7hqstqgzw8eu5nnh2a8gf9sxttq800ksy43w2vj7ed4swn7uqgdhsv66';
var XSWD_ENDPOINTS = [
'ws://localhost:44326/xswd',
'ws://127.0.0.1:44326/xswd',
'ws://localhost:10103/xswd',
'ws://127.0.0.1:10103/xswd',
];
var DERO_UNIT = 100000;
var SIM_STORAGE_KEY = "csd_leaderboard_sim_v1";
var APP_ID_STORAGE = 'csd_xswd_app_id';
var TOP_N = 5;
function resolveScid(){
if (LEADERBOARD_SCID_DEFAULT && /^[0-9a-fA-F]{64}$/.test(LEADERBOARD_SCID_DEFAULT)){
return LEADERBOARD_SCID_DEFAULT;
}
try {
var q = new URLSearchParams(window.location.search);
var s = q.get('scid');
if (s && /^[0-9a-fA-F]{64}$/.test(s)) return s;
} catch (e){}
return "";
}
var LEADERBOARD_SCID = resolveScid();
function getOrCreateAppId(){
var id = localStorage.getItem(APP_ID_STORAGE);
if (!id || !/^[0-9a-f]{64}$/i.test(id)){
var bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
id = Array.from(bytes, function(b){ return b.toString(16).padStart(2,'0'); }).join('');
localStorage.setItem(APP_ID_STORAGE, id);
}
return id;
}
var DeroWallet = (function(){
var ws = null;
var accepted = false;
var addressCache = null;
var nextId = 1;
var pending = new Map();
function isConnected(){
return accepted && ws && ws.readyState === WebSocket.OPEN;
}
function tryOpen(url){
return new Promise(function(resolve, reject){
var sock;
try { sock = new WebSocket(url); }
catch (e){ reject(e); return; }
var settled = false;
var timer = setTimeout(function(){
if (settled) return;
settled = true;
try { sock.close(); } catch(_){}
reject(new Error('timeout'));
}, 4000);
sock.addEventListener('open', function(){
var handshake = {
id: getOrCreateAppId(),
name: 'Cipher Snake Deluxe',
description: 'Cipherpunk snake game with on-chain Top 5 leaderboard.',
url: window.location.origin || 'http://localhost',
};
try { sock.send(JSON.stringify(handshake)); }
catch (e){
clearTimeout(timer); settled = true;
reject(e); return;
}
});
sock.addEventListener('message', function(ev){
var msg; try { msg = JSON.parse(ev.data); } catch(_){ return; }
if (msg.accepted !== undefined && !settled){
clearTimeout(timer);
settled = true;
if (msg.accepted === true){
resolve(sock);
} else {
try { sock.close(); } catch(_){}
reject(new Error(msg.message || 'Wallet rejected the connection'));
}
return;
}
if (msg.id !== undefined && pending.has(msg.id)){
var h = pending.get(msg.id);
pending.delete(msg.id);
if (msg.error) h.reject(new Error(msg.error.message || 'RPC error'));
else h.resolve(msg.result);
}
});
sock.addEventListener('error', function(){
if (settled) return;
settled = true;
clearTimeout(timer);
reject(new Error('WebSocket error'));
});
sock.addEventListener('close', function(){
if (!settled){
settled = true;
clearTimeout(timer);
reject(new Error('WebSocket closed'));
} else if (sock === ws){
accepted = false; ws = null; addressCache = null;
pending.forEach(function(h){ h.reject(new Error('WebSocket closed')); });
pending.clear();
}
});
});
}
function connect(){
if (isConnected()) return Promise.resolve(addressCache);
var endpoints = XSWD_ENDPOINTS.slice();
function next(){
if (!endpoints.length){
return Promise.reject(new Error(
'No DERO wallet detected. Open Engram (Settings > enable XSWD) or dero-wallet-cli with "xswd enable", then retry.'
));
}
var url = endpoints.shift();
return tryOpen(url).catch(function(err){
if (err && /reject/i.test(err.message || '')){ throw err; }
return next();
});
}
return next().then(function(sock){
ws = sock;
accepted = true;
return call('GetAddress', {}).then(function(res){
addressCache = (res && res.address) || null;
return addressCache;
});
});
}
function call(method, params){
return new Promise(function(resolve, reject){
if (!ws || ws.readyState !== WebSocket.OPEN){
reject(new Error('Wallet not connected')); return;
}
var id = nextId++;
pending.set(id, { resolve: resolve, reject: reject });
try {
ws.send(JSON.stringify({
jsonrpc: '2.0', id: id, method: method, params: params || {},
}));
} catch (e){ pending.delete(id); reject(e); return; }
var timeoutMs = /invoke|Transfer|Publish/i.test(method) ? 60000 : 15000;
setTimeout(function(){
if (pending.has(id)){
pending.delete(id);
reject(new Error('Request timeout: ' + method));
}
}, timeoutMs);
});
}
function getAddress(){ return addressCache; }
return { connect: connect, isConnected: isConnected, call: call, getAddress: getAddress };
})();
var Leaderboard = (function(){
function readSim(){
try {
var raw = localStorage.getItem(SIM_STORAGE_KEY);
var arr = raw ? JSON.parse(raw) : [];
return Array.isArray(arr) ? arr : [];
} catch (e){ return []; }
}
function writeSim(arr){
try { localStorage.setItem(SIM_STORAGE_KEY, JSON.stringify(arr)); } catch (e){}
}
function isLive(){ return !!LEADERBOARD_SCID; }
function fetchTop5(){
if (!isLive()){
var entries = readSim();
entries.sort(function(a,b){ return b.score - a.score; });
return Promise.resolve(entries.slice(0, TOP_N));
}
var ensure = DeroWallet.isConnected() ? Promise.resolve() : DeroWallet.connect();
return ensure.then(function(){
var keys = [];
for (var i = 0; i < TOP_N; i++){
keys.push('name_' + i, 'score_' + i, 'addr_' + i, 'time_' + i);
}
return DeroWallet.call('DERO.GetSC', {
scid: LEADERBOARD_SCID,
code: false, variables: false, keysstring: keys,
});
}).then(function(res){
var values = (res && res.valuesstring) || [];
var rows = [];
for (var i = 0; i < TOP_N; i++){
var name = values[i*4] || '';
var score = parseInt(values[i*4 + 1] || '0', 10) || 0;
var addr = values[i*4 + 2] || '';
var time = parseInt(values[i*4 + 3] || '0', 10) || 0;
if (score > 0 && name){
rows.push({ pseudo: name, score: score, address: addr, height: time });
}
}
rows.sort(function(a,b){ return b.score - a.score; });
return rows;
});
}
function publish(pseudo, score){
if (score <= 0) return Promise.reject(new Error('Score must be positive'));
if (!/^[A-Za-z0-9_\-]{1,16}$/.test(pseudo)){
return Promise.reject(new Error('Pseudo must be 1-16 chars [A-Z a-z 0-9 _ -]'));
}
if (!isLive()){
var list = readSim();
list.push({
pseudo: pseudo, score: score,
address: 'SIM_' + Math.random().toString(36).slice(2,10).toUpperCase(),
height: Date.now(), you: true,
});
list.sort(function(a,b){ return b.score - a.score; });
writeSim(list.slice(0, 50));
return Promise.resolve({ simulated: true });
}
var ensure = DeroWallet.isConnected() ? Promise.resolve() : DeroWallet.connect();
return ensure.then(function(){
return DeroWallet.call('scinvoke', {
scid: LEADERBOARD_SCID,
ringsize: 2,
sc_rpc: [
{ name: 'entrypoint', datatype: 'S', value: 'Publish' },
{ name: 'pseudo', datatype: 'S', value: pseudo },
{ name: 'score', datatype: 'U', value: score },
],
});
}).then(function(res){
return { simulated: false, txid: (res && res.txid) || null };
});
}
return { fetchTop5: fetchTop5, publish: publish, isLive: isLive };
})();
window.Leaderboard = Leaderboard;
window.DeroWallet = DeroWallet;
var modeChip = document.getElementById('modeChip');
if (modeChip){
if (Leaderboard.isLive()){
modeChip.textContent = 'MODE: MAINNET';
modeChip.classList.remove('sim');
modeChip.classList.add('live');
modeChip.title = 'SCID: ' + LEADERBOARD_SCID.slice(0,10) + '...';
DeroWallet.connect().catch(function(){});
} else {
modeChip.textContent = 'MODE: SIM (no SCID)';
modeChip.title = 'No SCID configured. Append ?scid=<SCID> to URL to go live.';
}
}
window.__csdSupportAddress = SUPPORT_ADDRESS;
window.__csdDeroUnit = DERO_UNIT;
})();
*/'] |