SC Arguments: [Name:SC_ACTION Type:uint64 Value:'0' Name:SC_ID Type:hash Value:'bfe785f81c25be362b03863a6a18cb261b7dfc5f7d3c3ff0e82730f0e9cd41bb' Name:content Type:string Value:'function gbid(elid){
return document.getElementById(elid);
}
var doctypeselect = gbid('doc_type');
var docNameHdr = gbid('docNameHdr');
var docDescrHdr = gbid('docDescrHdr');
var docIconURLHdr = gbid('docIconURLHdr');
var docDURL = gbid('docDURL');
var docSubDir = gbid('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(eventorid) {
smartcontract.value = getDocSCCode();
let last_errors = errors.map(a => a.error);
let tid = '';
if(eventorid instanceof String || typeof eventorid === 'string'){
tid = eventorid;
}else{
tid = eventorid.target.id;
}
let ok = checkDocInputs(tid);
if(ok.ok){
deployDocButton.removeAttribute("disabled");
}else {
deployDocButton.setAttribute("disabled", true);
}
let same_error = JSON.stringify(ok.errors.map(a => a.error)) === JSON.stringify(last_errors);
if(gbid('dwarn') && (!same_error || ok.errors.length === 0)){gbid('dwarn').remove();}
if(ok.errors.length != 0){
let errorsText = "";
for (const error of ok.errors) {
errorsText = error.error + errorsText + "\n";
if(error.id !=='' && !same_error){
let warn = document.createElement("p");
warn.innerText = error.error;
warn.id ="dwarn";
warn.style.color = "red";
gbid(error.id).after(warn);
}
}
if(!same_error){
alert(errorsText);
}
}
}
var errors = [];
function checkDocInputs(tid){
let ok = true;
errors = [];
blob = new Blob([smartcontract.value]);
if(blob.size > 18000){
if(tid === "docDescrHdr"){
errors.push({"id":tid,"error":"Description or doc too large."});
}else{
errors.push({"id":tid,"error":"Doc too large."});
}
ok = false;
}
if (docText.value.match(/(\/\u002A|\u002A\/)/)) {
errors.push({"id":tid,"error":"Multi-line comments not allowed."});
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({"id":tid,"error":"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({"id":tid,"error":"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;
}
var fileCheckC = "";
var fileCheckS = "";
var filename="";
var signed_filename="";
var installed_docs = [];
var fileContents = document.querySelector('input#open_file[type="file"]');
fileContents.addEventListener('change', (e) => {
if(fileContents.files.length !== 1){
docText.value = "";
filename = "";
docNameHdr.value = "";
docEdit(e);
return;
}
let file = fileContents.files[0];
let reader = new FileReader();
reader.onload = () => {
docText.value = reader.result;
filename = file.name;
docNameHdr.value = filename;
docEdit('open_file');
};
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};
}
var fileCheck = document.querySelector('input#open_signed_file[type="file"]');
fileCheck.addEventListener('change', (e) => {
console.log(e);
if(fileCheck.files.length !== 1){
fileCheck.value = "";
fileCheckC = "";
fileCheckS = "";
docEdit(e);
return;
}
let file = fileCheck.files[0];
let reader = new FileReader();
reader.onload = (e) => {
if(file.name.split('.').pop() !== "signed"){
fileCheck.value = "";
fileCheckC = "";
fileCheckS = "";
alert("Not a .signed file.");
docEdit('open_signed_file');
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('open_signed_file');
};
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>";
}
gbid("output").innerHTML = outputText;
docEdit('');
alert(res.txid);
}else if(installType == "index"){
gbid("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 = gbid('smartcontract');
var docText = gbid('document');
var deployDocButton = gbid('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;
}' Name:entrypoint Type:string Value:'StoreItem' Name:name Type:string Value:'siteinstaller.js'] |