Transaction Details
Open on Dero ExplorerInternal ID:
4199165
Transaction Hash:
fa441acf8f2d251d343ae77e0725147922709ce24df58bbfc37e63289999107d
Block:
Timestamp:
2025-07-27 17:48:27 UTC (2 months ago)
Type:
sc
Ring Size:
2
Payloads:
1
Caller:
…qq30m7ak
(1775808)
SC Data:
[{"name":"SC_ACTION","datatype":"U","value":"0"},{"name":"SC_ID","datatype":"H","value":"bfe785f81c25be362b03863a6a18cb261b7dfc5f7d3c3ff0e82730f0e9cd41bb"},{"name":"content","datatype":"S","value":"function gbid(elid){\n\treturn document.getElementById(elid);\n}\n\nvar doctypeselect = gbid('doc_type');\nvar docNameHdr = gbid('docNameHdr');\nvar docDescrHdr = gbid('docDescrHdr');\nvar docIconURLHdr = gbid('docIconURLHdr');\nvar docDURL = gbid('docDURL');\nvar docSubDir = gbid('docSubDir');\n\nvar docinputs = [docNameHdr,docDescrHdr,docIconURLHdr,docDURL,docSubDir];\ndocinputs.forEach((input) =\u003e {\n\tinput.addEventListener(\"keyup\", docEdit);\n\tinput.addEventListener(\"change\", docEdit);\n\tinput.addEventListener(\"blur\", docEdit);\n});\ndoctypeselect.addEventListener(\"change\", docEdit);\n\nfunction docEdit(eventorid) { \n\tsmartcontract.value = getDocSCCode();\n\tlet last_errors = errors.map(a =\u003e a.error);\n\tlet tid = '';\n\tif(eventorid instanceof String || typeof eventorid === 'string'){\t\t\n\t\ttid\t= eventorid;\t\n\t}else{\n\t\ttid\t= eventorid.target.id;\n\t}\n\tlet ok = checkDocInputs(tid);\n\t\n if(ok.ok){\n\t\tdeployDocButton.removeAttribute(\"disabled\");\n\t}else {\n\t\tdeployDocButton.setAttribute(\"disabled\", true);\n\t}\n\t\n\tlet same_error = JSON.stringify(ok.errors.map(a =\u003e a.error)) === JSON.stringify(last_errors);\n\tif(gbid('dwarn') \u0026\u0026 (!same_error || ok.errors.length === 0)){gbid('dwarn').remove();}\n\tif(ok.errors.length != 0){\t\t\n\t\tlet errorsText = \"\";\n\t\tfor (const error of ok.errors) {\n\t\t\terrorsText = error.error + errorsText + \"\\n\";\n\t\t\tif(error.id !=='' \u0026\u0026 !same_error){\n\t\t\t\tlet warn = document.createElement(\"p\");\n\t\t\t\twarn.innerText = error.error;\n\t\t\t\twarn.id =\"dwarn\";\n\t\t\t\twarn.style.color = \"red\";\n\t\t\t\tgbid(error.id).after(warn);\n\t\t\t}\n\t\t\t\n\t\t} \n\t\tif(!same_error){\t\t\t\n\t\t\talert(errorsText);\n\t\t}\n\t}\n}\nvar errors = [];\nfunction checkDocInputs(tid){\n\t\n\tlet ok = true;\n\terrors = [];\t\n\tblob = new Blob([smartcontract.value]);\n\tif(blob.size \u003e 18000){\n\t\tif(tid === \"docDescrHdr\"){\n\t\t\terrors.push({\"id\":tid,\"error\":\"Description or doc too large.\"});\n\t\t}else{\t\t\n\t\t\terrors.push({\"id\":tid,\"error\":\"Doc too large.\"});\n\t\t}\n\t\tok = false;\n\t}\n\t\n\t\n\n\n\tif (docText.value.match(/(\\/\\u002A|\\u002A\\/)/)) {\t\t\n\t\terrors.push({\"id\":tid,\"error\":\"Multi-line comments not allowed.\"});\n\t\tok = false;\n\t}\t\n\t\n\tif(\n\tdoctypeselect.value==\"\"||\n\tdocNameHdr.value==\"\"||\n\tdocDescrHdr.value==\"\"||\n\tdocDURL.value==\"\"||\n\tfileCheckC==\"\"||\n\tfileCheckS==\"\"||\n\tdocText.value==\"\"||\n\tfilename==\"\"||\n\tsigned_filename==\"\"\n\t){\n\t\tok = false;\n\t}\n\tif(signed_filename !=\"\" \u0026\u0026 filename !=\"\"){\n\t\tlet test_filename = \"\";\n\t\tlet test_signed_filename = \"\";\n\t\ttest_signed_filename = signed_filename.substring(0, signed_filename.lastIndexOf('.')) || signed_filename;\n\t\ttest_signed_filename = test_signed_filename.split('.').pop();\n\t\ttest_filename = filename.split('.').pop();\n\n\t\tif(\"TELA-\"+test_filename.toUpperCase()+\"-1\" != doctypeselect.value || \"TELA-\"+test_signed_filename.toUpperCase()+\"-1\" != doctypeselect.value){\n\t\t\terrors.push({\"id\":tid,\"error\":\"File Extension doesn't match selected document type.\"});\n\t\t\tok = false;\n\t\t}\n\t\tif(installed_docs.length \u003e 0){\n\t\t\tlet full_loc = docSubDir.value + docNameHdr.value;\n\t\t\tfor (let x in installed_docs) {\n\t\t\t\tif(full_loc == installed_docs[x].subdir + installed_docs[x].filename){\n\t\t\t\t\terrors.push({\"id\":tid,\"error\":\"Doc already installed!\"});\n\t\t\t\t\tok = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t}\t\n\treturn {\"ok\":ok,\"errors\":errors};\n}\n\n//docs\nfunction getDocSCCode(){\nlet SCInit = `// Copyright 2024. Civilware. All rights reserved.\n// TELA Decentralized Web Document (TELA-DOC-1)\nFunction InitializePrivate() Uint64\n10 IF init() == 0 THEN GOTO 30\n20 RETURN 1\n30 STORE(\"nameHdr\", \"`+ docNameHdr.value +`\")\n31 STORE(\"descrHdr\", \"`+ docDescrHdr.value +`\")\n32 STORE(\"iconURLHdr\", \"`+ docIconURLHdr.value +`\")\n33 STORE(\"dURL\", \"`+ docDURL.value +`\")\n34 STORE(\"docType\", \"`+ doctypeselect.value +`\")\n35 STORE(\"subDir\", \"`+ docSubDir.value.replace(/^\\/|\\/|\\/$/g, '') +`\")\n36 STORE(\"fileCheckC\", \"`+ fileCheckC +`\")\n37 STORE(\"fileCheckS\", \"`+ fileCheckS +`\")\n100 RETURN 0\nEnd Function\n\n`;\t\n\nlet SCTheRest = `Function init() Uint64\n10 IF EXISTS(\"owner\") == 0 THEN GOTO 30\n20 RETURN 1\n30 STORE(\"owner\", address())\n50 STORE(\"docVersion\", \"1.0.0\")\n60 STORE(\"hash\", HEX(TXID()))\n70 STORE(\"likes\", 0)\n80 STORE(\"dislikes\", 0)\n100 RETURN 0\nEnd Function\n\nFunction address() String\n10 DIM s as String\n20 LET s = SIGNER()\n30 IF IS_ADDRESS_VALID(s) THEN GOTO 50\n40 RETURN \"anon\"\n50 RETURN ADDRESS_STRING(s)\nEnd Function\n\nFunction Rate(r Uint64) Uint64\n10 DIM addr as String\n15 LET addr = address()\n16 IF r \u003c 100 \u0026\u0026 EXISTS(addr) == 0 \u0026\u0026 addr != \"anon\" THEN GOTO 30\n20 RETURN 1\n30 STORE(addr, \"\"+r+\"_\"+BLOCK_HEIGHT())\n40 IF r \u003c 50 THEN GOTO 70\n50 STORE(\"likes\", LOAD(\"likes\")+1)\n60 RETURN 0\n70 STORE(\"dislikes\", LOAD(\"dislikes\")+1)\n100 RETURN 0\nEnd Function\n\n`;\n\nlet telaDocFileContents = \"/*\"+docText.value+\"*/\";\nreturn SCInit + SCTheRest + telaDocFileContents;\n}\n\nvar fileCheckC = \"\";\nvar fileCheckS = \"\";\n\nvar filename=\"\";\nvar signed_filename=\"\";\nvar installed_docs = [];\nvar fileContents = document.querySelector('input#open_file[type=\"file\"]');\nfileContents.addEventListener('change', (e) =\u003e {\n\t\n\tif(fileContents.files.length !== 1){\n\t\tdocText.value = \"\";\n\t\tfilename = \"\";\n\t\tdocNameHdr.value = \"\";\n\t\tdocEdit(e);\n\t\treturn;\n\t}\n let file = fileContents.files["0"];\n let reader = new FileReader();\n reader.onload = () =\u003e {\n\t\tdocText.value = reader.result;\n\t\tfilename = file.name;\n\t\tdocNameHdr.value = filename;\n\t\tdocEdit('open_file');\n };\n reader.readAsText(file);\n});\n\n\nfunction parseSignedFile(signed){\n\tlet c = signed.split('C: ', 2)["1"];\n\tlet s = c.split('S: ', 2)["1"];\n\tc = c.split(/\\r?\\n/, 2)["0"];\n\ts = s.split(/\\r?\\n/, 2)["0"];\n\treturn {\"C\":c,\"S\":s};\n}\n\nvar fileCheck = document.querySelector('input#open_signed_file[type=\"file\"]');\nfileCheck.addEventListener('change', (e) =\u003e {\n\tconsole.log(e);\n\tif(fileCheck.files.length !== 1){\n\t\tfileCheck.value = \"\";\n\t\tfileCheckC = \"\";\n\t\tfileCheckS = \"\";\n\t\tdocEdit(e);\n\t\treturn;\n\t}\n let file = fileCheck.files["0"];\n let reader = new FileReader();\n reader.onload = (e) =\u003e {\n\t\tif(file.name.split('.').pop() !== \"signed\"){\n\t\t\tfileCheck.value = \"\";\n\t\t\tfileCheckC = \"\";\n\t\t\tfileCheckS = \"\";\n\t\t\talert(\"Not a .signed file.\");\n\t\t\tdocEdit('open_signed_file');\n\t\t\treturn;\n\t\t}\n\t\tlet signs = parseSignedFile(reader.result);\n\t\tfileCheckC = signs.C;\n\t\tfileCheckS = signs.S;\n\t\tsigned_filename = file.name;\n\t\tlet test_signed_filename = \"\";\n\t\ttest_signed_filename = signed_filename.substring(0, signed_filename.lastIndexOf('.')) || signed_filename;\n\t\tif (test_signed_filename != filename){\n\t\t\tif(filename != \"\"){\n\t\t\t\talert(\"Filename Mismatch\");\n\t\t\t}else{\n\t\t\t\talert(\"No document file selected yet.\");\n\t\t\t}\n\t\t}\n\t\tdocEdit('open_signed_file');\n };\n reader.readAsText(file);\n});\n\n\nvar installType = \"doc\";\nfunction listener(event) { \n\tlet lastObj = JSON.parse(event.data);\n\tlet res = lastObj.result;\n\tif (res.txid) {\n\t\tif(installType == \"doc\"){\n\t\t\tinstalled_docs.push({\"subdir\":docSubDir.value.replace(/^\\/|\\/|\\/$/g, ''),\"filename\":filename,\"scid\":res.txid});\n\t\t\tdocNameHdr.value = \"\";\n\t\t\tfilename=\"\";\n\t\t\tsigned_filename=\"\";\n\t\t\tfileContents.value = \"\";\n\t\t\tfileCheck.value = \"\";\n\t\t\tlet outputText =\"\";\n\t\t\tfor (let x in installed_docs) {\n\t\t\t\toutputText += (installed_docs[x].subdir !=\"\"? installed_docs[x].subdir + \"/\" :\"\") + installed_docs[x].filename + \":\" + installed_docs[x].scid +\"\u003cbr\u003e\";\n\t\t\t}\n\t\t\tgbid(\"output\").innerHTML = outputText;\n\t\t\tdocEdit('');\n\t\t\talert(res.txid);\n\t\t}else if(installType == \"index\"){\n\t\t\tgbid(\"indexscid\").innerHTML = \"Tela Site Index SCID:\" + res.txid;\n\t\t\talert(\"Congrats, you're all done! This is your Tela Site SCID:\" + res.txid);\n\t\t}\n\t}\n\tsocket.removeEventListener(\"message\", listener);\n};\n\nfunction socketSend(data){\n\tsocket.addEventListener(\"message\", listener);\n\tsendData(data);\n}\n\nvar smartcontract = gbid('smartcontract');\nvar docText = gbid('document');\nvar deployDocButton = gbid('deployDoc');\n\nfunction getQuoteJSON(smart_contract){\n\tlet quoteJSON = {};\n\tquoteJSON.jsonrpc = \"2.0\";\n\tquoteJSON.id = \"1\";\n\tquoteJSON.method = \"DERO.GetGasEstimate\";\n\tquoteJSON.params = {};\n\tquoteJSON.params.transfers = [{\n\t\tdestination: \"dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270\",\n\t\tamount:"0",\n\t\tBurn:"0",\n\t\tpayload_rpc:[] \n\t}];\n\tquoteJSON.params.sc = smart_contract;\n\tquoteJSON.params.sc_value = 0;\n\tquoteJSON.params.sc_rpc = [];\n\tquoteJSON.params.ringsize = 2;\n\tquoteJSON.params.signer = \"dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270\";\n\treturn quoteJSON;\n}\n\ndeployDocButton.addEventListener('click', function(event) {\n\tinstallType =\"doc\"; \n\tlet quoteJSON = getQuoteJSON(smartcontract.value);\t\n\tlet result = confirm(\"Estimated Cost: \"+(niceRound(quoteJSON.params.sc.length * 2 * .00001)) +\" DERO, Install Doc?\");\n\tif (result) {\n\t\tinstallDoc();\n\t} else {\n\t\talert(\"Action canceled.\");\n\t}\n});\n\n//Install JSON\nfunction getInstallJSON(smart_contract){\n\tlet installJSON = {};\n\tinstallJSON.jsonrpc = \"2.0\";\n\tinstallJSON.id = \"1\";\n\tinstallJSON.method = \"transfer\";\n\tinstallJSON.params = {};\n\tinstallJSON.params.fees = 0;\n\tinstallJSON.params.transfers = [{\n\t\tdestination: \"dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270\",\n\t\tamount:"0",\n\t\tBurn:"0",\n\t\tpayload_rpc:[] \n\t}];\n\tinstallJSON.params.sc = smart_contract;\n\tinstallJSON.params.sc_value = 0;\n\tinstallJSON.params.sc_rpc = [];\n\tinstallJSON.params.ringsize = 2;\n\treturn installJSON;\n}"},{"name":"entrypoint","datatype":"S","value":"StoreItem"},{"name":"name","datatype":"S","value":"siteinstaller.js"}]
Payload
Token (SCID):
DERO
Deposited:
none
Fees:
0.18501 DERO