SC Arguments: [Name:SC_ACTION Type:uint64 Value:'0' Name:SC_ID Type:hash Value:'bfe785f81c25be362b03863a6a18cb261b7dfc5f7d3c3ff0e82730f0e9cd41bb' Name:content Type:string Value:'var doctypeselect = document.getElementById('doc_type');
var docNameHdr = document.getElementById('docNameHdr');
var docDescrHdr = document.getElementById('docDescrHdr');
var docIconURLHdr = document.getElementById('docIconURLHdr');
var docDURL = document.getElementById('docDURL');
var docSubDir = document.getElementById('docSubDir');
var docinputs = [docNameHdr,docDescrHdr,docIconURLHdr,docDURL,docSubDir];
docinputs.forEach((input) => {
input.addEventListener("keyup", docEdit);
input.addEventListener("change", docEdit);
input.addEventListener("blur", docEdit);
});
doctypeselect.addEventListener("change", docEdit);
function docEdit(event) {
smartcontract.value = getDocSCCode();
let ok = checkDocInputs();
if(ok.ok){
deployDocButton.removeAttribute("disabled");
}else {
deployDocButton.setAttribute("disabled", true);
}
if(ok.errors.length != 0){
let errorsText = "";
for (const error of ok.errors) {
errorsText = error + errorsText + "\n";
}
alert(errorsText);
}
}
function checkDocInputs(){
let ok = true;
let errors = [];
blob = new Blob([docText.value]);
if(blob.size > 18000){
errors.push("Doc too large.");
ok = false;
}
if(
doctypeselect.value==""||
docNameHdr.value==""||
docDescrHdr.value==""||
docDURL.value==""||
fileCheckC==""||
fileCheckS==""||
docText.value==""||
filename==""||
signed_filename==""
){
ok = false;
}
if(signed_filename !="" && filename !=""){
let test_filename = "";
let test_signed_filename = "";
test_signed_filename = signed_filename.substring(0, signed_filename.lastIndexOf('.')) || signed_filename;
test_signed_filename = test_signed_filename.split('.').pop();
test_filename = filename.split('.').pop();
if("TELA-"+test_filename.toUpperCase()+"-1" != doctypeselect.value || "TELA-"+test_signed_filename.toUpperCase()+"-1" != doctypeselect.value){
errors.push("File Extension doesn't match selected document type.");
ok = false;
}
if(installed_docs.length > 0){
let full_loc = docSubDir.value + docNameHdr.value;
for (let x in installed_docs) {
if(full_loc == installed_docs[x].subdir + installed_docs[x].filename){
errors.push("Doc already installed!");
ok = false;
}
}
}
}
return {"ok":ok,"errors":errors};
}
//docs
function getDocSCCode(){
let SCInit = `// Copyright 2024. Civilware. All rights reserved.
// TELA Decentralized Web Document (TELA-DOC-1)
Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "`+ docNameHdr.value +`")
31 STORE("descrHdr", "`+ docDescrHdr.value +`")
32 STORE("iconURLHdr", "`+ docIconURLHdr.value +`")
33 STORE("dURL", "`+ docDURL.value +`")
34 STORE("docType", "`+ doctypeselect.value +`")
35 STORE("subDir", "`+ docSubDir.value.replace(/^\/|\/|\/$/g, '') +`")
36 STORE("fileCheckC", "`+ fileCheckC +`")
37 STORE("fileCheckS", "`+ fileCheckS +`")
100 RETURN 0
End Function
`;
let SCTheRest = `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
`;
let telaDocFileContents = "/*"+docText.value+"*/";
return SCInit + SCTheRest + telaDocFileContents;
}
let fileCheckC = "";
let fileCheckS = "";
var filename="";
var signed_filename="";
var installed_docs = [];
let fileContents = document.querySelector('input#open_file[type="file"]');
fileContents.addEventListener('change', () => {
if(fileContents.files.length !== 1){
docText.value = "";
filename = "";
docNameHdr.value = "";
docEdit();
return;
}
let file = fileContents.files[0];
let reader = new FileReader();
reader.onload = () => {
docText.value = reader.result;
filename = file.name;
docNameHdr.value = filename;
docEdit();
};
reader.readAsText(file);
});
function parseSignedFile(signed){
let c = signed.split('C: ', 2)[1];
let s = c.split('S: ', 2)[1];
c = c.split(/\r?\n/, 2)[0];
s = s.split(/\r?\n/, 2)[0];
return {"C":c,"S":s};
}
let fileCheck = document.querySelector('input#open_signed_file[type="file"]');
fileCheck.addEventListener('change', () => {
if(fileCheck.files.length !== 1){
fileCheck.value = "";
fileCheckC = "";
fileCheckS = "";
docEdit();
return;
}
let file = fileCheck.files[0];
let reader = new FileReader();
reader.onload = () => {
if(file.name.split('.').pop() !== "signed"){
fileCheck.value = "";
fileCheckC = "";
fileCheckS = "";
alert("Not a .signed file.");
docEdit();
return;
}
let signs = parseSignedFile(reader.result);
fileCheckC = signs.C;
fileCheckS = signs.S;
signed_filename = file.name;
let test_signed_filename = "";
test_signed_filename = signed_filename.substring(0, signed_filename.lastIndexOf('.')) || signed_filename;
if (test_signed_filename != filename){
if(filename != ""){
alert("Filename Mismatch");
}else{
alert("No document file selected yet.");
}
}
docEdit();
};
reader.readAsText(file);
});
var installType = "doc";
function listener(event) {
let lastObj = JSON.parse(event.data);
let res = lastObj.result;
if (res.txid) {
if(installType == "doc"){
installed_docs.push({"subdir":docSubDir.value.replace(/^\/|\/|\/$/g, ''),"filename":filename,"scid":res.txid});
docNameHdr.value = "";
filename="";
signed_filename="";
fileContents.value = "";
fileCheck.value = "";
let outputText ="";
for (let x in installed_docs) {
outputText += (installed_docs[x].subdir !=""? installed_docs[x].subdir + "/" :"") + installed_docs[x].filename + ":" + installed_docs[x].scid +"<br>";
}
document.getElementById("output").innerHTML = outputText;
docEdit();
alert(res.txid);
}else if(installType == "index"){
document.getElementById("indexscid").innerHTML = "Tela Site Index SCID:" + res.txid;
alert("Congrats, you're all done! This is your Tela Site SCID:" + res.txid);
}
}
socket.removeEventListener("message", listener);
};
function socketSend(data){
socket.addEventListener("message", listener);
sendData(data);
}
var smartcontract = document.getElementById('smartcontract');
var docText = document.getElementById('document');
var deployDocButton = document.getElementById('deployDoc');
function getQuoteJSON(smart_contract){
let quoteJSON = {};
quoteJSON.jsonrpc = "2.0";
quoteJSON.id = "1";
quoteJSON.method = "DERO.GetGasEstimate";
quoteJSON.params = {};
quoteJSON.params.transfers = [{
destination: "dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270",
amount:0,
Burn:0,
payload_rpc:[]
}];
quoteJSON.params.sc = smart_contract;
quoteJSON.params.sc_value = 0;
quoteJSON.params.sc_rpc = [];
quoteJSON.params.ringsize = 2;
quoteJSON.params.signer = "dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270";
return quoteJSON;
}
deployDocButton.addEventListener('click', function(event) {
installType ="doc";
let quoteJSON = getQuoteJSON(smartcontract.value);
let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001)) +" DERO, Install Doc?");
if (result) {
installDoc();
} else {
alert("Action canceled.");
}
});
//Install JSON
function getInstallJSON(smart_contract){
let installJSON = {};
installJSON.jsonrpc = "2.0";
installJSON.id = "1";
installJSON.method = "transfer";
installJSON.params = {};
installJSON.params.fees = 0;
installJSON.params.transfers = [{
destination: "dero1qykyta6ntpd27nl0yq4xtzaf4ls6p5e9pqu0k2x4x3pqq5xavjsdxqgny8270",
amount:0,
Burn:0,
payload_rpc:[]
}];
installJSON.params.sc = smart_contract;
installJSON.params.sc_value = 0;
installJSON.params.sc_rpc = [];
installJSON.params.ringsize = 2;
return installJSON;
}
//Install Doc function
function installDoc(){
socketSend(getInstallJSON(smartcontract.value));
}
//Install Index function
function installIndex(){
socketSend(getInstallJSON(indexSCCode.value));
}
var indexNameHdr = document.getElementById('indexNameHdr');
var indexDescrHdr = document.getElementById('indexDescrHdr');
var indexIconURLHdr = document.getElementById('indexIconURLHdr');
var indexDURL = document.getElementById('indexDURL');
var deployIndexButton = document.getElementById('deployIndex');
var generateIndexButton = document.getElementById('generateIndex');
var indexinputs = [indexNameHdr,indexDescrHdr,indexIconURLHdr,indexDURL];
indexinputs.forEach((input) => {
input.addEventListener("keyup", indexEdit);
input.addEventListener("change", indexEdit);
input.addEventListener("blur", indexEdit);
});
function indexEdit(event) {
let docs ="";
let line_no = 40;
for (let x in installed_docs) {
docs += (line_no++) + ` STORE("DOC`+(parseFloat(x) + 1) + `", "` +installed_docs[x].scid + `")`+"\n";
}
indexSCCode.value = getIndexSC(docs);
let ok = checkIndexInputs();
if(ok.ok){
deployIndexButton.removeAttribute("disabled");
}else{
deployIndexButton.setAttribute("disabled", true);
}
if(ok.errors.length != 0){
let errorsText = "";
for (const error of ok.errors) {
errorsText = error + errorsText + "\n";
}
alert(errorsText);
}
}
deployIndexButton.addEventListener('click', function(event) {
installType ="index";
let quoteJSON = getQuoteJSON(indexSCCode.value);
let result = confirm("Estimated Cost: "+(niceRound(quoteJSON.params.sc.length * 2 * .00001)) +" DERO, Install Tela-Index?");
if (result) {
installIndex(indexSCCode.value);
} else {
console.log("Action canceled.");
}
});
function checkIndexInputs(){
let ok = true;
let errors = [];
blob = new Blob([indexSCCode.value]);
if(blob.size > 18000){
errors.push("Doc too large.");
ok = false;
}
if(
indexNameHdr.value==""||
indexDescrHdr.value==""||
indexDURL.value==""||
indexSCCode.value==""||
installed_docs.length == 0
){
ok = false;
}
return {"ok":ok,"errors":errors};
}
//Index
var indexSCCode = document.getElementById('indexSCCode');
function getIndexSC(docs){
let indexInit = `// Copyright 2024. Civilware. All rights reserved.
// TELA Decentralized Web Standard (TELA-INDEX-1)
Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "`+indexNameHdr.value+`")
31 STORE("descrHdr", "`+indexDescrHdr.value+`")
32 STORE("iconURLHdr", "`+indexIconURLHdr.value+`")
33 STORE("dURL", "`+indexDURL.value+`")
` + docs + `
1000 RETURN 0
End Function
`;
let indexTheRest = `Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("telaVersion", "1.0.0") // TELA SC version
60 STORE("commit", 0) // The initial commit
70 STORE(0, HEX(TXID())) // SCID commit hash
80 STORE("hash", HEX(TXID()))
85 STORE("likes", 0)
90 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
Function UpdateCode(code String) Uint64
10 IF LOAD("owner") == "anon" THEN GOTO 20
15 IF code == "" THEN GOTO 20
16 IF LOAD("owner") == address() THEN GOTO 30
20 RETURN 1
30 UPDATE_SC_CODE(code)
40 STORE("commit", LOAD("commit")+1) // New commit
50 STORE(LOAD("commit"), HEX(TXID())) // New hash
60 STORE("hash", HEX(TXID()))
100 RETURN 0
End Function
`;
return indexInit + indexTheRest;
}
function niceRound(number){
return Math.round(number*100000000)/100000000;
}
' Name:entrypoint Type:string Value:'StoreItem' Name:name Type:string Value:'siteinstaller.js'] |