SC CODE: Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "transactions-ui.js")
31 STORE("descrHdr", "Transaction display UI components")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "190f726ca9ba3447e6d70917c078c714da4d33ead068945a3057107f31706702")
37 STORE("fileCheckS", "15bdb43e0dfd9b8e2c1971b65445ae36f38a8acb0449f5d2dfc43a37b8287221")
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
/*
({
name:'transactions-ui',version:'1.0.0',
b1:'background:rgba(82,200,219,0.1);border:1px solid #52c8db;color:#52c8db;padding:0.5rem 1rem;border-radius:6px;cursor:pointer',
b2:'background:rgba(0,0,0,0.2);border:1px solid rgba(82,200,219,0.3);padding:1.5rem;border-radius:8px;margin-bottom:2rem',
h3:'color:#52c8db;margin:0 0 1.5rem 0;font-size:1.2rem;font-weight:600',
renderEnhancedTransactionDisplay(h,d,p){return`<div class="enhanced-card"><div class="card-header"><div style="display:flex;align-items:center;gap:1rem"><button onclick="window.location.hash='transactions'" style="${this.b1}">← Back</button><span style="color:#888">|</span><span style="color:#52c8db;font-weight:500">Transaction Explorer</span></div><div class="actions"><button onclick="navigator.clipboard.writeText('${h}')" style="${this.b1}">Copy Hash</button><button onclick="window.location.reload()" style="${this.b1}">Refresh</button></div></div><div class="card-content">${this.renderHeader(h,d)}${this.renderBlockInfo(d)}${this.renderStats(d)}${d.smartContract?this.renderSmartContract(d.smartContract):''}${d.senders&&d.senders.length>0?this.renderSenders(d.senders):''}${this.renderTechnicalDetails(d)}${this.renderHexViewer(d.hex)}${this.renderTransactionProof(h,p)}</div></div>`},
renderHeader(h,d){const t=d.basic.timestamp?this.formatAge(Date.now()-d.basic.timestamp.getTime()):'Unknown';return`<div style="margin-bottom:2rem"><div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.5rem"><div><h2 style="color:#52c8db;margin:0;font-size:1.6rem;font-weight:700">Transaction Details</h2><div style="color:#b3b3b3;margin-top:0.5rem;font-size:0.9rem">${t} • Block ${d.basic.blockHeight}</div></div><div style="padding:0.5rem 1rem;background:rgba(185,89,182,0.15);color:#b959b6;border-radius:16px;font-size:0.9rem;font-weight:600">Registration (SC)</div></div><div style="${this.b2.replace(';margin-bottom:2rem','')}"><h3 style="color:#52c8db;margin-bottom:1rem;font-size:1.1rem">Transaction Hash</h3><div style="font-family:monospace;color:#b959b6;font-size:0.9rem;word-break:break-all">${h}</div></div></div>`},
renderBlockInfo(d){return`<div style="${this.b2}"><h3 style="${this.h3}">Block Information</h3><div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem"><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">BLOCK HASH</div><div style="font-family:monospace;color:#b959b6;font-size:0.85rem;word-break:break-all">${d.block.hash}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">BUILT BLID</div><div style="font-family:monospace;color:#4ade80;font-size:0.85rem;word-break:break-all">${d.block.blid}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">TX ROOTHASH</div><div style="font-family:monospace;color:#fbbf24;font-size:0.85rem;word-break:break-all">${d.block.txRootHash}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">TIMESTAMP</div><div style="color:#fff;font-weight:500">${d.basic.timestamp?d.basic.timestamp.toLocaleString():'Unknown'}</div><div style="color:#888;font-size:0.8rem;margin-top:0.25rem">${d.basic.timestamp?this.formatAge(Date.now()-d.basic.timestamp.getTime()):''}</div></div></div></div>`},
renderStats(d){const s='background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;text-align:center',l='font-size:1.6rem;font-weight:700;margin-bottom:0.5rem',t='color:#b3b3b3;font-size:0.8rem';return`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1rem;margin-bottom:2rem"><div style="${s};border:1px solid rgba(82,200,219,0.3)"><div style="color:#52c8db;${l}">${d.basic.blockHeight}</div><div style="${t}">BLOCK HEIGHT</div></div><div style="${s};border:1px solid rgba(251,191,36,0.3)"><div style="color:#fbbf24;${l}">${d.basic.fee.toFixed(5)}</div><div style="${t}">FEE (DERO)</div></div><div style="${s};border:1px solid rgba(74,222,128,0.3)"><div style="color:#4ade80;${l}">${(d.basic.size/1024).toFixed(3)} kB</div><div style="${t}">TX SIZE</div></div><div style="${s};border:1px solid rgba(185,89,182,0.3)"><div style="color:#b959b6;${l}">${d.type.ringSize}</div><div style="${t}">RING SIZE</div></div><div style="${s};border:1px solid rgba(82,200,219,0.3)"><div style="color:#52c8db;${l}">${d.basic.confirmations}</div><div style="${t}">CONFIRMATIONS</div></div></div>`},
renderTransactionProof(h,p){return`<div style="background:rgba(251,191,36,0.1);border:1px solid rgba(251,191,36,0.3);padding:1.5rem;border-radius:8px;margin-bottom:2rem;border-left:4px solid #fbbf24"><h3 style="color:#fbbf24;margin:0 0 1rem 0;font-size:1.2rem;font-weight:600">Transaction Proof</h3><div style="background:rgba(0,0,0,0.2);border-radius:6px;padding:1rem;margin-bottom:1rem"><div style="color:#fbbf24;font-weight:600;margin-bottom:0.5rem">DERO Proof System:</div><div style="color:#b3b3b3;font-size:0.85rem;line-height:1.4">DERO uses homomorphic encryption where <strong>balances are never decrypted</strong> on-chain. Proofs require <strong>TXID</strong> and <strong>deroproof</strong>.</div></div><div style="background:rgba(0,0,0,0.2);border-radius:6px;padding:1rem"><div style="color:#fbbf24;font-weight:600;margin-bottom:0.5rem">Manual Verification:</div><div style="color:#b3b3b3;font-size:0.9rem;margin-bottom:1rem">Use DERO wallet CLI:</div><div style="margin-bottom:0.75rem"><div style="color:#52c8db;font-size:0.9rem;margin-bottom:0.25rem">Generate proof:</div><code style="background:rgba(0,0,0,0.3);padding:0.25rem 0.5rem;border-radius:4px;color:#52c8db;font-family:monospace;display:block">get_tx_key ${h}</code></div></div></div>`},
renderSmartContract(s){if(!s||!s.hasSmartContract)return'';let h=`<div style="${this.b2}"><h3 style="${this.h3.replace('1.5rem','1.2rem')}">Smart Contract Data</h3>`;h+=`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:1.5rem"><div style="text-align:center;padding:1rem;background:rgba(185,89,182,0.1);border-radius:6px"><div style="color:#b959b6;font-size:1.4rem;font-weight:700">${s.scBalance.toFixed(5)}</div><div style="color:#b3b3b3;font-size:0.8rem">SC Balance (DERO)</div></div><div style="text-align:center;padding:1rem;background:rgba(74,222,128,0.1);border-radius:6px"><div style="color:#4ade80;font-size:1.4rem;font-weight:700">${s.deposited.toFixed(5)}</div><div style="color:#b3b3b3;font-size:0.8rem">Deposited (DERO)</div></div></div>`;if(s.scid)h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.5rem;font-size:0.9rem">SCID:</h4><div style="background:rgba(0,0,0,0.3);padding:0.75rem;border-radius:6px;font-family:monospace;color:#b959b6;font-size:0.85rem;word-break:break-all">${s.scid}</div></div>`;const a=s.scArguments.map(g=>`<div style="padding:0.75rem;background:rgba(0,0,0,0.3);border-radius:6px;margin-bottom:0.5rem"><div style="display:grid;grid-template-columns:100px 70px 1fr;gap:0.75rem"><div><span style="color:#52c8db;font-size:0.85rem;font-weight:600">${g.name}</span></div><div><span style="color:#fbbf24;font-size:0.75rem">${g.type}</span></div><div><span style="color:#4ade80;font-size:0.8rem;font-family:monospace;word-break:break-all">${g.value}</span></div></div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">SC Arguments</h4>${a}</div>`;if(s.scVariables)h+=this.renderSCVariables(s.scVariables);if(s.scCode)h+=this.renderSCCode(s.scCode);h+=`</div>`;return h},
renderSCVariables(v){if(!v)return'';let h='',s1='padding:0.75rem;background:rgba(0,0,0,0.3);border-radius:6px;margin-bottom:0.5rem';if(v.strings&&Object.keys(v.strings).length>0){const sv=Object.entries(v.strings).map(([k,x])=>`<div style="${s1}"><div style="color:#52c8db;font-size:0.85rem;font-weight:600;margin-bottom:0.25rem">${k}</div><div style="color:#4ade80;font-size:0.8rem;font-family:monospace;word-break:break-all">${x}</div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">String Variables</h4>${sv}</div>`}if(v.reserves&&Object.keys(v.reserves).length>0){const rv=Object.entries(v.reserves).map(([k,a])=>`<div style="${s1}"><div style="color:#52c8db;font-size:0.85rem;font-weight:600;margin-bottom:0.25rem">${k}</div><div style="color:#4ade80;font-size:0.9rem">${a} atomic units</div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">Current Reserves</h4>${rv}</div>`}return h},
renderSCCode(c){if(!c)return'';return`<div style="margin-bottom:1.5rem"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:0.75rem"><h4 style="color:#52c8db;margin:0;font-size:1rem">SC CODE</h4><button onclick="navigator.clipboard.writeText(this.nextElementSibling.textContent);this.textContent='✓ Copied';setTimeout(()=>this.textContent='Copy Code',2000)" style="${this.b1.replace('padding:0.5rem 1rem','padding:0.4rem 0.8rem')};font-size:0.8rem">Copy Code</button></div><pre style="background:rgba(0,0,0,0.4);padding:1rem;border-radius:6px;margin:0;font-family:monospace;color:#4ade80;font-size:0.75rem;line-height:1.4;max-height:400px;overflow:auto;white-space:pre-wrap">${c}</pre></div>`},
renderSenders(s){if(!s||!s.length)return'';const h=s.map(a=>`<div style="background:rgba(0,0,0,0.3);padding:0.75rem;border-radius:6px;margin-bottom:0.5rem"><span style="font-family:monospace;color:#52c8db;font-size:0.85rem;word-break:break-all">${a}</span></div>`).join('');return`<div style="${this.b2}"><h3 style="${this.h3.replace('1.5rem 0','1rem 0')}">Sender Addresses (Ring ${s.length})</h3><div style="max-height:300px;overflow-y:auto">${h}</div></div>`},
renderTechnicalDetails(d){return`<div style="${this.b2}"><h3 style="${this.h3}">Technical Details</h3><div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1rem"><div><div style="color:#b3b3b3;font-size:0.8rem">Transaction Version</div><div style="color:#fff">${d.raw.tx.version||1}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem">Signature Type</div><div style="color:#fff">${d.type.signatureType}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem">Ring Privacy Level</div><div style="color:#fff">${d.type.ringSize}</div></div></div></div>`},
formatAge(ms){const s=Math.floor(ms/1000),m=Math.floor(s/60),h=Math.floor(m/60),d=Math.floor(h/24);return d>0?d+'d ago':h>0?h+'h ago':m>0?m+'m ago':s+'s ago'},
renderHexViewer(x){if(!x||x.length<100)return'';const f=(h)=>{let r='';for(let i=0;i<h.length;i+=64){const o=(i/2).toString(16).padStart(8,'0'),c=h.slice(i,i+64),b=c.match(/.{2}/g)?.join(' ')||c;r+=`${o} ${b.padEnd(47)}\n`}return r};return`<div style="${this.b2}"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem"><h3 style="color:#52c8db;margin:0;font-size:1.1rem">Raw Transaction Data</h3><button onclick="navigator.clipboard.writeText('${x}');this.textContent='✓ Copied';setTimeout(()=>this.textContent='Copy Hex',2000)" style="${this.b1.replace('padding:0.5rem 1rem','padding:0.4rem 0.8rem')};font-size:0.8rem">Copy Hex</button></div><div style="background:rgba(0,0,0,0.4);border-radius:6px;padding:1rem;max-height:300px;overflow:auto"><pre style="margin:0;font-family:monospace;color:#4ade80;font-size:0.75rem;line-height:1.3">${f(x)}</pre></div><div style="color:#888;font-size:0.8rem;margin-top:0.5rem">Size: ${(x.length/2).toLocaleString()} bytes • ${x.length} hex chars</div></div>`}
});
*/ |
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("nameHdr", "transactions-ui.js")
31 STORE("descrHdr", "Transaction display UI components")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "190f726ca9ba3447e6d70917c078c714da4d33ead068945a3057107f31706702")
37 STORE("fileCheckS", "15bdb43e0dfd9b8e2c1971b65445ae36f38a8acb0449f5d2dfc43a37b8287221")
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
/*
({
name:'transactions-ui',version:'1.0.0',
b1:'background:rgba(82,200,219,0.1);border:1px solid #52c8db;color:#52c8db;padding:0.5rem 1rem;border-radius:6px;cursor:pointer',
b2:'background:rgba(0,0,0,0.2);border:1px solid rgba(82,200,219,0.3);padding:1.5rem;border-radius:8px;margin-bottom:2rem',
h3:'color:#52c8db;margin:0 0 1.5rem 0;font-size:1.2rem;font-weight:600',
renderEnhancedTransactionDisplay(h,d,p){return`<div class="enhanced-card"><div class="card-header"><div style="display:flex;align-items:center;gap:1rem"><button onclick="window.location.hash='transactions'" style="${this.b1}">← Back</button><span style="color:#888">|</span><span style="color:#52c8db;font-weight:500">Transaction Explorer</span></div><div class="actions"><button onclick="navigator.clipboard.writeText('${h}')" style="${this.b1}">Copy Hash</button><button onclick="window.location.reload()" style="${this.b1}">Refresh</button></div></div><div class="card-content">${this.renderHeader(h,d)}${this.renderBlockInfo(d)}${this.renderStats(d)}${d.smartContract?this.renderSmartContract(d.smartContract):''}${d.senders&&d.senders.length>0?this.renderSenders(d.senders):''}${this.renderTechnicalDetails(d)}${this.renderHexViewer(d.hex)}${this.renderTransactionProof(h,p)}</div></div>`},
renderHeader(h,d){const t=d.basic.timestamp?this.formatAge(Date.now()-d.basic.timestamp.getTime()):'Unknown';return`<div style="margin-bottom:2rem"><div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.5rem"><div><h2 style="color:#52c8db;margin:0;font-size:1.6rem;font-weight:700">Transaction Details</h2><div style="color:#b3b3b3;margin-top:0.5rem;font-size:0.9rem">${t} • Block ${d.basic.blockHeight}</div></div><div style="padding:0.5rem 1rem;background:rgba(185,89,182,0.15);color:#b959b6;border-radius:16px;font-size:0.9rem;font-weight:600">Registration (SC)</div></div><div style="${this.b2.replace(';margin-bottom:2rem','')}"><h3 style="color:#52c8db;margin-bottom:1rem;font-size:1.1rem">Transaction Hash</h3><div style="font-family:monospace;color:#b959b6;font-size:0.9rem;word-break:break-all">${h}</div></div></div>`},
renderBlockInfo(d){return`<div style="${this.b2}"><h3 style="${this.h3}">Block Information</h3><div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem"><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">BLOCK HASH</div><div style="font-family:monospace;color:#b959b6;font-size:0.85rem;word-break:break-all">${d.block.hash}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">BUILT BLID</div><div style="font-family:monospace;color:#4ade80;font-size:0.85rem;word-break:break-all">${d.block.blid}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">TX ROOTHASH</div><div style="font-family:monospace;color:#fbbf24;font-size:0.85rem;word-break:break-all">${d.block.txRootHash}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem;margin-bottom:0.5rem">TIMESTAMP</div><div style="color:#fff;font-weight:500">${d.basic.timestamp?d.basic.timestamp.toLocaleString():'Unknown'}</div><div style="color:#888;font-size:0.8rem;margin-top:0.25rem">${d.basic.timestamp?this.formatAge(Date.now()-d.basic.timestamp.getTime()):''}</div></div></div></div>`},
renderStats(d){const s='background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;text-align:center',l='font-size:1.6rem;font-weight:700;margin-bottom:0.5rem',t='color:#b3b3b3;font-size:0.8rem';return`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1rem;margin-bottom:2rem"><div style="${s};border:1px solid rgba(82,200,219,0.3)"><div style="color:#52c8db;${l}">${d.basic.blockHeight}</div><div style="${t}">BLOCK HEIGHT</div></div><div style="${s};border:1px solid rgba(251,191,36,0.3)"><div style="color:#fbbf24;${l}">${d.basic.fee.toFixed(5)}</div><div style="${t}">FEE (DERO)</div></div><div style="${s};border:1px solid rgba(74,222,128,0.3)"><div style="color:#4ade80;${l}">${(d.basic.size/1024).toFixed(3)} kB</div><div style="${t}">TX SIZE</div></div><div style="${s};border:1px solid rgba(185,89,182,0.3)"><div style="color:#b959b6;${l}">${d.type.ringSize}</div><div style="${t}">RING SIZE</div></div><div style="${s};border:1px solid rgba(82,200,219,0.3)"><div style="color:#52c8db;${l}">${d.basic.confirmations}</div><div style="${t}">CONFIRMATIONS</div></div></div>`},
renderTransactionProof(h,p){return`<div style="background:rgba(251,191,36,0.1);border:1px solid rgba(251,191,36,0.3);padding:1.5rem;border-radius:8px;margin-bottom:2rem;border-left:4px solid #fbbf24"><h3 style="color:#fbbf24;margin:0 0 1rem 0;font-size:1.2rem;font-weight:600">Transaction Proof</h3><div style="background:rgba(0,0,0,0.2);border-radius:6px;padding:1rem;margin-bottom:1rem"><div style="color:#fbbf24;font-weight:600;margin-bottom:0.5rem">DERO Proof System:</div><div style="color:#b3b3b3;font-size:0.85rem;line-height:1.4">DERO uses homomorphic encryption where <strong>balances are never decrypted</strong> on-chain. Proofs require <strong>TXID</strong> and <strong>deroproof</strong>.</div></div><div style="background:rgba(0,0,0,0.2);border-radius:6px;padding:1rem"><div style="color:#fbbf24;font-weight:600;margin-bottom:0.5rem">Manual Verification:</div><div style="color:#b3b3b3;font-size:0.9rem;margin-bottom:1rem">Use DERO wallet CLI:</div><div style="margin-bottom:0.75rem"><div style="color:#52c8db;font-size:0.9rem;margin-bottom:0.25rem">Generate proof:</div><code style="background:rgba(0,0,0,0.3);padding:0.25rem 0.5rem;border-radius:4px;color:#52c8db;font-family:monospace;display:block">get_tx_key ${h}</code></div></div></div>`},
renderSmartContract(s){if(!s||!s.hasSmartContract)return'';let h=`<div style="${this.b2}"><h3 style="${this.h3.replace('1.5rem','1.2rem')}">Smart Contract Data</h3>`;h+=`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:1.5rem"><div style="text-align:center;padding:1rem;background:rgba(185,89,182,0.1);border-radius:6px"><div style="color:#b959b6;font-size:1.4rem;font-weight:700">${s.scBalance.toFixed(5)}</div><div style="color:#b3b3b3;font-size:0.8rem">SC Balance (DERO)</div></div><div style="text-align:center;padding:1rem;background:rgba(74,222,128,0.1);border-radius:6px"><div style="color:#4ade80;font-size:1.4rem;font-weight:700">${s.deposited.toFixed(5)}</div><div style="color:#b3b3b3;font-size:0.8rem">Deposited (DERO)</div></div></div>`;if(s.scid)h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.5rem;font-size:0.9rem">SCID:</h4><div style="background:rgba(0,0,0,0.3);padding:0.75rem;border-radius:6px;font-family:monospace;color:#b959b6;font-size:0.85rem;word-break:break-all">${s.scid}</div></div>`;const a=s.scArguments.map(g=>`<div style="padding:0.75rem;background:rgba(0,0,0,0.3);border-radius:6px;margin-bottom:0.5rem"><div style="display:grid;grid-template-columns:100px 70px 1fr;gap:0.75rem"><div><span style="color:#52c8db;font-size:0.85rem;font-weight:600">${g.name}</span></div><div><span style="color:#fbbf24;font-size:0.75rem">${g.type}</span></div><div><span style="color:#4ade80;font-size:0.8rem;font-family:monospace;word-break:break-all">${g.value}</span></div></div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">SC Arguments</h4>${a}</div>`;if(s.scVariables)h+=this.renderSCVariables(s.scVariables);if(s.scCode)h+=this.renderSCCode(s.scCode);h+=`</div>`;return h},
renderSCVariables(v){if(!v)return'';let h='',s1='padding:0.75rem;background:rgba(0,0,0,0.3);border-radius:6px;margin-bottom:0.5rem';if(v.strings&&Object.keys(v.strings).length>0){const sv=Object.entries(v.strings).map(([k,x])=>`<div style="${s1}"><div style="color:#52c8db;font-size:0.85rem;font-weight:600;margin-bottom:0.25rem">${k}</div><div style="color:#4ade80;font-size:0.8rem;font-family:monospace;word-break:break-all">${x}</div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">String Variables</h4>${sv}</div>`}if(v.reserves&&Object.keys(v.reserves).length>0){const rv=Object.entries(v.reserves).map(([k,a])=>`<div style="${s1}"><div style="color:#52c8db;font-size:0.85rem;font-weight:600;margin-bottom:0.25rem">${k}</div><div style="color:#4ade80;font-size:0.9rem">${a} atomic units</div></div>`).join('');h+=`<div style="margin-bottom:1.5rem"><h4 style="color:#52c8db;margin-bottom:0.75rem;font-size:1rem">Current Reserves</h4>${rv}</div>`}return h},
renderSCCode(c){if(!c)return'';return`<div style="margin-bottom:1.5rem"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:0.75rem"><h4 style="color:#52c8db;margin:0;font-size:1rem">SC CODE</h4><button onclick="navigator.clipboard.writeText(this.nextElementSibling.textContent);this.textContent='✓ Copied';setTimeout(()=>this.textContent='Copy Code',2000)" style="${this.b1.replace('padding:0.5rem 1rem','padding:0.4rem 0.8rem')};font-size:0.8rem">Copy Code</button></div><pre style="background:rgba(0,0,0,0.4);padding:1rem;border-radius:6px;margin:0;font-family:monospace;color:#4ade80;font-size:0.75rem;line-height:1.4;max-height:400px;overflow:auto;white-space:pre-wrap">${c}</pre></div>`},
renderSenders(s){if(!s||!s.length)return'';const h=s.map(a=>`<div style="background:rgba(0,0,0,0.3);padding:0.75rem;border-radius:6px;margin-bottom:0.5rem"><span style="font-family:monospace;color:#52c8db;font-size:0.85rem;word-break:break-all">${a}</span></div>`).join('');return`<div style="${this.b2}"><h3 style="${this.h3.replace('1.5rem 0','1rem 0')}">Sender Addresses (Ring ${s.length})</h3><div style="max-height:300px;overflow-y:auto">${h}</div></div>`},
renderTechnicalDetails(d){return`<div style="${this.b2}"><h3 style="${this.h3}">Technical Details</h3><div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1rem"><div><div style="color:#b3b3b3;font-size:0.8rem">Transaction Version</div><div style="color:#fff">${d.raw.tx.version||1}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem">Signature Type</div><div style="color:#fff">${d.type.signatureType}</div></div><div><div style="color:#b3b3b3;font-size:0.8rem">Ring Privacy Level</div><div style="color:#fff">${d.type.ringSize}</div></div></div></div>`},
formatAge(ms){const s=Math.floor(ms/1000),m=Math.floor(s/60),h=Math.floor(m/60),d=Math.floor(h/24);return d>0?d+'d ago':h>0?h+'h ago':m>0?m+'m ago':s+'s ago'},
renderHexViewer(x){if(!x||x.length<100)return'';const f=(h)=>{let r='';for(let i=0;i<h.length;i+=64){const o=(i/2).toString(16).padStart(8,'0'),c=h.slice(i,i+64),b=c.match(/.{2}/g)?.join(' ')||c;r+=`${o} ${b.padEnd(47)}\n`}return r};return`<div style="${this.b2}"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem"><h3 style="color:#52c8db;margin:0;font-size:1.1rem">Raw Transaction Data</h3><button onclick="navigator.clipboard.writeText('${x}');this.textContent='✓ Copied';setTimeout(()=>this.textContent='Copy Hex',2000)" style="${this.b1.replace('padding:0.5rem 1rem','padding:0.4rem 0.8rem')};font-size:0.8rem">Copy Hex</button></div><div style="background:rgba(0,0,0,0.4);border-radius:6px;padding:1rem;max-height:300px;overflow:auto"><pre style="margin:0;font-family:monospace;color:#4ade80;font-size:0.75rem;line-height:1.3">${f(x)}</pre></div><div style="color:#888;font-size:0.8rem;margin-top:0.5rem">Size: ${(x.length/2).toLocaleString()} bytes • ${x.length} hex chars</div></div>`}
});
*/'] |