SC CODE: // 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", "derocalls.js")
31 STORE("descrHdr", "Dero calls")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "derocalls.js")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "2a9c0c6ca11836cb7993787c4b93a45b7094af05ff53382598ee3895b09add41")
37 STORE("fileCheckS", "57eb6d8d8905fbf98fb7faf579576755be653f7ce7adf8548b15e2667e41185")
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
/*let last_block_update=0;
async function subscribe(){
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = "0";
JSONR.method = "Subscribe";
JSONR.params = {};
JSONR.params = {"Event": "new_topoheight"};
response = await socketSend(JSONR);
if(response.result){
//excellent
}else if(response.error){
await alertModal(response.error.message);
}
}
async function getHeight(){
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.method = "DERO.GetHeight";
response = await socketSend(JSONR);
if(response.result){
latest_block.innerHTML = response.result.height;
return response.result.height;
}else if(response.error){
await alertModal(response.error.message);
}
}
alertTimerId =0;
function myFunction() {
timer = secs;
clearTimeout(alertTimerId);
alertTimerId = setTimeout(doTime, 1000);
};
var runit = async function() {
if(refresh_mode =="timer"){
if(c_status.classList.contains('ok')){
await refreshBids("timer");
}
myFunction();
}
};
var secs = 30;
var seconds = secs * 1000;
var running = setInterval(runit, secs * 1000);
var timer = secs;
function doTime() {
if (--timer >= 0) {
//Call self every second.
alertTimerId = setTimeout(doTime, 1000);
}
}
window.addEventListener('load', async function () {
setTimeout(await runit(), 2000);
});
let loading = false;
let cooked = 0;
const refreshBids = async function (caller=""){
if(caller != refresh_mode && caller != ""){
return;
}
if(loading){
if(++cooked > 2){
loading = false;
cooked = 0;
}
return;
}
cooked = 0;
loading = true;
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = false;
JSONR.params.variables = true;
JSONR.params.scid = bids_sc_id;
refreshbidsbutton.innerText = "Loading..."
let response = await socketSend(JSONR);
if(response.result){
await displayBids(response.result);
if(caller != "topoheight"){
await getHeight();
}
}
refreshbidsbutton.innerText = "Refresh Bid List";
loading = false;
}
//add a bid from html inputs
var createbidbutton = document.getElementById('create_bid');
createbidbutton.addEventListener('click', async function createBid(event) {
if(parseFloat(dero_bid_amt.value) == 0 ||
parseFloat(pls_bid_amt.value) == 0 ||
dero_bid_amt.value == "" ||
pls_bid_amt.value == ""
){
await alertModal("Zero? Increase amts.");
return;
}else if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return;
}
if(bid_switch_mode == "pls-dero" && ! await connectionOK()){
return;
}
if(bid_switch_mode == "pls-dero"){
real_switch_mode = "dero-pls"
}else{
real_switch_mode = "pls-dero"
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "CreateBid"},
{Name: "dero_amt", DataType: "U", Value: parseFloat(convertToAtomicUnits(dero_bid_amt.value))},
{Name: "pls_amt", DataType: "U", Value: parseFloat(pls_bid_amt.value)},
{Name: "from_to", DataType: "S", Value: real_switch_mode},
{Name: "pls_bid_address", DataType: "S", Value: connected_evm_account}
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
await alertModal("Offer created, txid:"+response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
}
});
//remove a bid from button in table
async function removeBid(index){
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "RemoveBid"},
{Name: "bid_id", DataType: "S", Value: index},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
await alertModal("Offer removed, txid:"+response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
}
}
async function acceptDeroToPLSOffer(offer){
if(! await connectionOK()){return false;}
if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return false;
}
//accepter must deploy .sol contract and fund it etc
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
//Also add ETH Address here
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "AcceptBid"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "accepted_by_pls", DataType: "S", Value: connected_evm_account},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
let pls_htl_txid = await installPLSHTL(2,offer.pls_bid_address);
if(pls_htl_txid == false){
return false;
}
await alertModal("Next step, approve SC listing TX in Dero wallet.");
await addSCIDToList("PLS",pls_htl_txid,offer);
}else if(response.error){
await alertModal(response.error.message);
}
}
async function acceptPLSToDeroOffer(offer){
//Deploy 48hr contract
//accepter must deploy dvm contract and fund it etc
if(! await connectionOK()){return false;}
if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return false;
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
//Also add ETH Address here
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "AcceptBid"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "accepted_by_pls", DataType: "S", Value: connected_evm_account},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
let dero_htl_txid = await installDeroHTL(2,offer.dero_bid_address);
if(dero_htl_txid == false){
return false;
}
await addSCIDToList("DERO",dero_htl_txid,offer);
}else if(response.error){
await alertModal(response.error.message);
}
}
//Add to bid list after starting and funding hashed time lock contract
async function addSCIDToList(asset,htl_scid,offer){
//asset should be AddDEROSCID or AddPLSSCID
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Add"+asset+"SCID"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "scid", DataType: "S", Value: htl_scid},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
response = await socketSend(JSONR);
if(response.result){
await alertModal("You've posted the "+asset+" smart contract now it needs to be funded to complete this step.");
if(offer.dscid == "waiting" && offer.pscid == "waiting"){
if(
(offer.dero_bid_address != "connected_dero_account" && offer.from_to == "pls-dero" && asset == "DERO") ||
(offer.dero_bid_address != "connected_dero_account" && offer.from_to == "dero-pls" && asset == "PLS")
){
document.getElementById("my_taken").click();
}
}
}else if(response.error){
await alertModal(response.error.message);
button_states=[]
}
}
//---------
//get gas fees quote for htl sc installation
async function installDeroHTL(days_to_lock,dero_receiver_address){
let JSONR = {};
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Initialize"},
{Name: "receiver", DataType: "S", Value: dero_receiver_address},
];//receiver
JSONR.params.ringsize = 2;
JSONR.params.sc = getDeroHTLContract(days_to_lock);//Deploy 48hr contract,//get sc id with days_to_lock
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return false;
}
//install htl contract, set the receiver
JSONR = {};
JSONR.method = "transfer";
JSONR.params = {};
JSONR.params.fees = 0;
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc = response.result.gasstorage;
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Initialize"},
{Name: "receiver", DataType: "S", Value: dero_receiver_address},
];
JSONR.params.ringsize = 2;
JSONR.params.sc = getDeroHTLContract(days_to_lock);//Deploy 48hr contract,//get sc id with days_to_lock
response = await socketSend(JSONR);
if(response.result){
//messages.innerHTML = "Installed with deadline in days: "+days_to_lock + "<br>" + messages.innerHTML;
//return id and it will be shared to listing...
let confirmed = await confirmation(response.result.txid);
if(confirmed){
await alertModal("Installed with deadline in days: "+days_to_lock);
return response.result.txid;
}else{
return false;
}
}else if(response.error){
await alertModal(response.error.message);
return false;
}
}
let confirm_height=0;
async function confirmation(txid) {
confirm_height = await getHeight();
return new Promise(function (resolve,reject) {
let attempts = 0;
const attempt = async() => {
let this_height = await getHeight();
let code_valid = await getDeroHTLCode(txid)
if( code_valid && this_height > confirm_height){
resolve(true)
}else if(attempts < 18){
let this_height = await getHeight();
let code_valid = await getDeroHTLCode(txid)
attempts++;
if(code_valid && this_height > confirm_height){
resolve(true)
}
}else{
reject(false)
}
}
setTimeout(attempt, 2000)
})
}
//------------------
//Store keys for convenience if you stay on the app.
let keys = [];
//Start contract countdown and fund it also provide a sha256 hash. Used for both stages.
async function fundDeroHTL(id,dero_htl_scid,dero_amt,hash) {
//check if hash is eth type..
if(hash.length == 66){
hash = hash.slice(2);
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_dero_deposit = parseInt(dero_amt);
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "StartSwap"},
{Name: "hash", DataType: "S", Value: hash}
];
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(response.result){
alertModal("Funds Deposited and locked with provided hash." + "<br> TXID" + response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
return false;
}
}
async function checkDeroHTLCode(days,deroHTL){
let original = getDeroHTLContract(days);
let installed = deroHTL.code;
if(original === installed && original !== false){
deroHTL.code_valid = true;
return true;
}
return false;
}
async function getDeroHTLCode(dero_htl_scid){
let JSONR = {};
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = true;
JSONR.params.variables = false;
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(typeof response.result !== 'undefined'){
if(response.result.code != ""){
return response.result.code;
}
}else if(response.error){
return false;
}
return false;
}
//Make it return a derohtlcontract object instead...
async function getDeroHTLDetails(dero_htl_scid,_dero_amount){
//also check receiver addresses
let deroHTL = {};
let JSONR = {};
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = true;
JSONR.params.keysstring = ["hash","deposited","deadline","key","receiver"];
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(response.result){
if(typeof response.result !== 'undefined' && typeof response.result.code !== 'undefined'){
deroHTL.code = response.result.code;
}else{
deroHTL.code = "";
}
deroHTL.scid = dero_htl_scid;
deroHTL.hash_ok = true;
deroHTL.balance_ok = true;
deroHTL.deadline_ok = true;
deroHTL.key_ok = true;
deroHTL.hash = response.result.valuesstring[0];
deroHTL.deposited = response.result.valuesstring[1];
deroHTL.deadline = response.result.valuesstring[2];
deroHTL.key = response.result.valuesstring[3];
deroHTL.receiver = response.result.valuesstring[4];
if(deroHTL.receiver.length == 132){
deroHTL.receiver = hexToUtf8(deroHTL.receiver);
}
deroHTL.balance = response.result.balance;
if(!deroHTL.hash.includes("NOT AVAILABLE")){
deroHTL.hash = hexToUtf8(deroHTL.hash);
}else{
deroHTL.hash_ok = false;
}
if(!deroHTL.key.includes("NOT AVAILABLE")){
deroHTL.key = hexToUtf8(deroHTL.key);
}else{
deroHTL.key_ok = false;
deroHTL.key = "";
}
deroHTL.deposited = parseInt(deroHTL.deposited);
if(deroHTL.deposited < 1 ||
_dero_amount != deroHTL.deposited ||
_dero_amount != deroHTL.balance
){
deroHTL.balance_ok = false;
}
deroHTL.deadline = parseInt(deroHTL.deadline);
if(deroHTL.deadline < nowInSeconds()){
deroHTL.deadline_ok = false;
}
return(deroHTL);
}else if(response.error){
await alertModal(response.result.error.message);
}
}
async function deroWithdrawal(key,dero_htl_scid) {
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = 5;
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Withdraw"},
{Name: "key", DataType:"S", Value: String(key)},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return;
}
//Have gas fees, prolly 0 but ok
JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = 6;
JSONR.method = "transfer"
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Withdraw"},
{Name: "key", DataType:"S", Value: String(key)},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
JSONR.params.fees = response.result.gasstorage;
response = await socketSend(JSONR);
if(response.result){
await alertModal(response.result.txid);
return response.result.txid;
}else if(response.error){
await alertModal(response.error.message);
return "";
}
};
async function refundDero(dero_htl_scid) {
let JSONR = {};
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Refund"},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
//current_mode = "refund";
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return;
}
//have gas fee, now refund...
JSONR = {};
JSONR.method = "transfer"
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Refund"},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
JSONR.params.fees = response.result.gasstorage;
response = await socketSend(JSONR);
if(response.result){
await alertModal("Refund Successful with TXID:"+response.result.txid);
}else if(response.error){
await alertModal(response.error.message);
}
};
//--Smart Contract
function getDeroHTLContract(days){
let seconds;
if(days === 1){
seconds = one_day_in_secs;
}else if(days === 2){
seconds = two_days_in_secs;
}else{
return false;
}
return`Function Initialize(receiver String) Uint64
1 STORE("owner",SIGNER())
2 IF IS_ADDRESS_VALID(ADDRESS_RAW(receiver)) THEN GOTO 4
3 RETURN 0
4 STORE("receiver",receiver)
5 STORE("deadline",0)
6 STORE("deposited",0)
7 RETURN 0
End Function
Function StartSwap(hash String) Uint64
1 IF DEROVALUE() == 0 THEN GOTO 7
2 IF EXISTS("hash")==1 THEN GOTO 7
3 STORE("hash",hash)
4 STORE("deadline",BLOCK_TIMESTAMP() + `+ seconds +`)
5 STORE("deposited",DEROVALUE())
6 RETURN 0
7 RETURN 1
End Function
Function Withdraw(key String) Uint64
1 IF ADDRESS_RAW(LOAD("receiver"))==SIGNER() THEN GOTO 3
2 RETURN 1
3 IF LOAD("deadline")>BLOCK_TIMESTAMP() THEN GOTO 5
4 RETURN 1
5 IF STRLEN(key)<=32 THEN GOTO 7
6 RETURN 1
7 IF LOAD("hash")==HEX(SHA256(key)) THEN GOTO 9
8 RETURN 1
9 SEND_DERO_TO_ADDRESS(SIGNER(),LOAD("deposited"))
10 STORE("key",key)
11 RETURN 0
End Function
Function Refund() Uint64
1 IF LOAD("owner")==SIGNER() THEN GOTO 3
2 RETURN 1
3 IF LOAD("deadline")<BLOCK_TIMESTAMP() THEN GOTO 5
4 RETURN 1
5 SEND_DERO_TO_ADDRESS(SIGNER(),LOAD("deposited"))
6 RETURN 0
End Function`;
}*/ |
SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:'// 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", "derocalls.js")
31 STORE("descrHdr", "Dero calls")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "derocalls.js")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "2a9c0c6ca11836cb7993787c4b93a45b7094af05ff53382598ee3895b09add41")
37 STORE("fileCheckS", "57eb6d8d8905fbf98fb7faf579576755be653f7ce7adf8548b15e2667e41185")
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
/*let last_block_update=0;
async function subscribe(){
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = "0";
JSONR.method = "Subscribe";
JSONR.params = {};
JSONR.params = {"Event": "new_topoheight"};
response = await socketSend(JSONR);
if(response.result){
//excellent
}else if(response.error){
await alertModal(response.error.message);
}
}
async function getHeight(){
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.method = "DERO.GetHeight";
response = await socketSend(JSONR);
if(response.result){
latest_block.innerHTML = response.result.height;
return response.result.height;
}else if(response.error){
await alertModal(response.error.message);
}
}
alertTimerId =0;
function myFunction() {
timer = secs;
clearTimeout(alertTimerId);
alertTimerId = setTimeout(doTime, 1000);
};
var runit = async function() {
if(refresh_mode =="timer"){
if(c_status.classList.contains('ok')){
await refreshBids("timer");
}
myFunction();
}
};
var secs = 30;
var seconds = secs * 1000;
var running = setInterval(runit, secs * 1000);
var timer = secs;
function doTime() {
if (--timer >= 0) {
//Call self every second.
alertTimerId = setTimeout(doTime, 1000);
}
}
window.addEventListener('load', async function () {
setTimeout(await runit(), 2000);
});
let loading = false;
let cooked = 0;
const refreshBids = async function (caller=""){
if(caller != refresh_mode && caller != ""){
return;
}
if(loading){
if(++cooked > 2){
loading = false;
cooked = 0;
}
return;
}
cooked = 0;
loading = true;
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = false;
JSONR.params.variables = true;
JSONR.params.scid = bids_sc_id;
refreshbidsbutton.innerText = "Loading..."
let response = await socketSend(JSONR);
if(response.result){
await displayBids(response.result);
if(caller != "topoheight"){
await getHeight();
}
}
refreshbidsbutton.innerText = "Refresh Bid List";
loading = false;
}
//add a bid from html inputs
var createbidbutton = document.getElementById('create_bid');
createbidbutton.addEventListener('click', async function createBid(event) {
if(parseFloat(dero_bid_amt.value) == 0 ||
parseFloat(pls_bid_amt.value) == 0 ||
dero_bid_amt.value == "" ||
pls_bid_amt.value == ""
){
await alertModal("Zero? Increase amts.");
return;
}else if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return;
}
if(bid_switch_mode == "pls-dero" && ! await connectionOK()){
return;
}
if(bid_switch_mode == "pls-dero"){
real_switch_mode = "dero-pls"
}else{
real_switch_mode = "pls-dero"
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "CreateBid"},
{Name: "dero_amt", DataType: "U", Value: parseFloat(convertToAtomicUnits(dero_bid_amt.value))},
{Name: "pls_amt", DataType: "U", Value: parseFloat(pls_bid_amt.value)},
{Name: "from_to", DataType: "S", Value: real_switch_mode},
{Name: "pls_bid_address", DataType: "S", Value: connected_evm_account}
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
await alertModal("Offer created, txid:"+response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
}
});
//remove a bid from button in table
async function removeBid(index){
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "RemoveBid"},
{Name: "bid_id", DataType: "S", Value: index},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
await alertModal("Offer removed, txid:"+response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
}
}
async function acceptDeroToPLSOffer(offer){
if(! await connectionOK()){return false;}
if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return false;
}
//accepter must deploy .sol contract and fund it etc
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
//Also add ETH Address here
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "AcceptBid"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "accepted_by_pls", DataType: "S", Value: connected_evm_account},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
let pls_htl_txid = await installPLSHTL(2,offer.pls_bid_address);
if(pls_htl_txid == false){
return false;
}
await alertModal("Next step, approve SC listing TX in Dero wallet.");
await addSCIDToList("PLS",pls_htl_txid,offer);
}else if(response.error){
await alertModal(response.error.message);
}
}
async function acceptPLSToDeroOffer(offer){
//Deploy 48hr contract
//accepter must deploy dvm contract and fund it etc
if(! await connectionOK()){return false;}
if(banned.find(addr=>addr==connected_dero_account)){
removeBanHandler();
return false;
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
//Also add ETH Address here
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "AcceptBid"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "accepted_by_pls", DataType: "S", Value: connected_evm_account},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
let response = await socketSend(JSONR);
if(response.result){
let dero_htl_txid = await installDeroHTL(2,offer.dero_bid_address);
if(dero_htl_txid == false){
return false;
}
await addSCIDToList("DERO",dero_htl_txid,offer);
}else if(response.error){
await alertModal(response.error.message);
}
}
//Add to bid list after starting and funding hashed time lock contract
async function addSCIDToList(asset,htl_scid,offer){
//asset should be AddDEROSCID or AddPLSSCID
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Add"+asset+"SCID"},
{Name: "bid_id", DataType: "S", Value: offer.id},
{Name: "scid", DataType: "S", Value: htl_scid},
];
JSONR.params.scid = bids_sc_id;
JSONR.params.ringsize = 2;
response = await socketSend(JSONR);
if(response.result){
await alertModal("You've posted the "+asset+" smart contract now it needs to be funded to complete this step.");
if(offer.dscid == "waiting" && offer.pscid == "waiting"){
if(
(offer.dero_bid_address != "connected_dero_account" && offer.from_to == "pls-dero" && asset == "DERO") ||
(offer.dero_bid_address != "connected_dero_account" && offer.from_to == "dero-pls" && asset == "PLS")
){
document.getElementById("my_taken").click();
}
}
}else if(response.error){
await alertModal(response.error.message);
button_states=[]
}
}
//---------
//get gas fees quote for htl sc installation
async function installDeroHTL(days_to_lock,dero_receiver_address){
let JSONR = {};
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Initialize"},
{Name: "receiver", DataType: "S", Value: dero_receiver_address},
];//receiver
JSONR.params.ringsize = 2;
JSONR.params.sc = getDeroHTLContract(days_to_lock);//Deploy 48hr contract,//get sc id with days_to_lock
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return false;
}
//install htl contract, set the receiver
JSONR = {};
JSONR.method = "transfer";
JSONR.params = {};
JSONR.params.fees = 0;
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc = response.result.gasstorage;
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "Initialize"},
{Name: "receiver", DataType: "S", Value: dero_receiver_address},
];
JSONR.params.ringsize = 2;
JSONR.params.sc = getDeroHTLContract(days_to_lock);//Deploy 48hr contract,//get sc id with days_to_lock
response = await socketSend(JSONR);
if(response.result){
//messages.innerHTML = "Installed with deadline in days: "+days_to_lock + "<br>" + messages.innerHTML;
//return id and it will be shared to listing...
let confirmed = await confirmation(response.result.txid);
if(confirmed){
await alertModal("Installed with deadline in days: "+days_to_lock);
return response.result.txid;
}else{
return false;
}
}else if(response.error){
await alertModal(response.error.message);
return false;
}
}
let confirm_height=0;
async function confirmation(txid) {
confirm_height = await getHeight();
return new Promise(function (resolve,reject) {
let attempts = 0;
const attempt = async() => {
let this_height = await getHeight();
let code_valid = await getDeroHTLCode(txid)
if( code_valid && this_height > confirm_height){
resolve(true)
}else if(attempts < 18){
let this_height = await getHeight();
let code_valid = await getDeroHTLCode(txid)
attempts++;
if(code_valid && this_height > confirm_height){
resolve(true)
}
}else{
reject(false)
}
}
setTimeout(attempt, 2000)
})
}
//------------------
//Store keys for convenience if you stay on the app.
let keys = [];
//Start contract countdown and fund it also provide a sha256 hash. Used for both stages.
async function fundDeroHTL(id,dero_htl_scid,dero_amt,hash) {
//check if hash is eth type..
if(hash.length == 66){
hash = hash.slice(2);
}
let JSONR = {};
JSONR.method = "scinvoke";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.sc_dero_deposit = parseInt(dero_amt);
JSONR.params.sc_rpc = [
{Name: "entrypoint", DataType: "S", Value: "StartSwap"},
{Name: "hash", DataType: "S", Value: hash}
];
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(response.result){
alertModal("Funds Deposited and locked with provided hash." + "<br> TXID" + response.result.txid);
await refreshBids();
}else if(response.error){
await alertModal(response.error.message);
return false;
}
}
async function checkDeroHTLCode(days,deroHTL){
let original = getDeroHTLContract(days);
let installed = deroHTL.code;
if(original === installed && original !== false){
deroHTL.code_valid = true;
return true;
}
return false;
}
async function getDeroHTLCode(dero_htl_scid){
let JSONR = {};
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = true;
JSONR.params.variables = false;
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(typeof response.result !== 'undefined'){
if(response.result.code != ""){
return response.result.code;
}
}else if(response.error){
return false;
}
return false;
}
//Make it return a derohtlcontract object instead...
async function getDeroHTLDetails(dero_htl_scid,_dero_amount){
//also check receiver addresses
let deroHTL = {};
let JSONR = {};
JSONR.method = "DERO.GetSC";
JSONR.params = {};
JSONR.params.scid = "";
JSONR.params.code = true;
JSONR.params.keysstring = ["hash","deposited","deadline","key","receiver"];
JSONR.params.scid = dero_htl_scid;
let response = await socketSend(JSONR);
if(response.result){
if(typeof response.result !== 'undefined' && typeof response.result.code !== 'undefined'){
deroHTL.code = response.result.code;
}else{
deroHTL.code = "";
}
deroHTL.scid = dero_htl_scid;
deroHTL.hash_ok = true;
deroHTL.balance_ok = true;
deroHTL.deadline_ok = true;
deroHTL.key_ok = true;
deroHTL.hash = response.result.valuesstring[0];
deroHTL.deposited = response.result.valuesstring[1];
deroHTL.deadline = response.result.valuesstring[2];
deroHTL.key = response.result.valuesstring[3];
deroHTL.receiver = response.result.valuesstring[4];
if(deroHTL.receiver.length == 132){
deroHTL.receiver = hexToUtf8(deroHTL.receiver);
}
deroHTL.balance = response.result.balance;
if(!deroHTL.hash.includes("NOT AVAILABLE")){
deroHTL.hash = hexToUtf8(deroHTL.hash);
}else{
deroHTL.hash_ok = false;
}
if(!deroHTL.key.includes("NOT AVAILABLE")){
deroHTL.key = hexToUtf8(deroHTL.key);
}else{
deroHTL.key_ok = false;
deroHTL.key = "";
}
deroHTL.deposited = parseInt(deroHTL.deposited);
if(deroHTL.deposited < 1 ||
_dero_amount != deroHTL.deposited ||
_dero_amount != deroHTL.balance
){
deroHTL.balance_ok = false;
}
deroHTL.deadline = parseInt(deroHTL.deadline);
if(deroHTL.deadline < nowInSeconds()){
deroHTL.deadline_ok = false;
}
return(deroHTL);
}else if(response.error){
await alertModal(response.result.error.message);
}
}
async function deroWithdrawal(key,dero_htl_scid) {
let JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = 5;
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Withdraw"},
{Name: "key", DataType:"S", Value: String(key)},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return;
}
//Have gas fees, prolly 0 but ok
JSONR = {};
JSONR.jsonrpc = "2.0";
JSONR.id = 6;
JSONR.method = "transfer"
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Withdraw"},
{Name: "key", DataType:"S", Value: String(key)},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
JSONR.params.fees = response.result.gasstorage;
response = await socketSend(JSONR);
if(response.result){
await alertModal(response.result.txid);
return response.result.txid;
}else if(response.error){
await alertModal(response.error.message);
return "";
}
};
async function refundDero(dero_htl_scid) {
let JSONR = {};
JSONR.method = "DERO.GetGasEstimate";
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Refund"},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
//current_mode = "refund";
let response = await socketSend(JSONR);
if(response.error){
await alertModal(response.error.message);
return;
}
//have gas fee, now refund...
JSONR = {};
JSONR.method = "transfer"
JSONR.params = {};
JSONR.params.transfers = [{
destination: rando_dest,
amount:0,
Burn:0,
payload_rpc:[]
}];
JSONR.params.sc = "";
JSONR.params.sc_value = 0;
JSONR.params.sc_rpc = [
{Name: "SC_ACTION", DataType: "U", Value: 0},
{Name: "SC_ID", DataType: "H", Value: dero_htl_scid},
{Name: "entrypoint", DataType: "S", Value: "Refund"},
];
JSONR.params.ringsize = 2;
JSONR.params.signer = connected_dero_account;
JSONR.params.fees = response.result.gasstorage;
response = await socketSend(JSONR);
if(response.result){
await alertModal("Refund Successful with TXID:"+response.result.txid);
}else if(response.error){
await alertModal(response.error.message);
}
};
//--Smart Contract
function getDeroHTLContract(days){
let seconds;
if(days === 1){
seconds = one_day_in_secs;
}else if(days === 2){
seconds = two_days_in_secs;
}else{
return false;
}
return`Function Initialize(receiver String) Uint64
1 STORE("owner",SIGNER())
2 IF IS_ADDRESS_VALID(ADDRESS_RAW(receiver)) THEN GOTO 4
3 RETURN 0
4 STORE("receiver",receiver)
5 STORE("deadline",0)
6 STORE("deposited",0)
7 RETURN 0
End Function
Function StartSwap(hash String) Uint64
1 IF DEROVALUE() == 0 THEN GOTO 7
2 IF EXISTS("hash")==1 THEN GOTO 7
3 STORE("hash",hash)
4 STORE("deadline",BLOCK_TIMESTAMP() + `+ seconds +`)
5 STORE("deposited",DEROVALUE())
6 RETURN 0
7 RETURN 1
End Function
Function Withdraw(key String) Uint64
1 IF ADDRESS_RAW(LOAD("receiver"))==SIGNER() THEN GOTO 3
2 RETURN 1
3 IF LOAD("deadline")>BLOCK_TIMESTAMP() THEN GOTO 5
4 RETURN 1
5 IF STRLEN(key)<=32 THEN GOTO 7
6 RETURN 1
7 IF LOAD("hash")==HEX(SHA256(key)) THEN GOTO 9
8 RETURN 1
9 SEND_DERO_TO_ADDRESS(SIGNER(),LOAD("deposited"))
10 STORE("key",key)
11 RETURN 0
End Function
Function Refund() Uint64
1 IF LOAD("owner")==SIGNER() THEN GOTO 3
2 RETURN 1
3 IF LOAD("deadline")<BLOCK_TIMESTAMP() THEN GOTO 5
4 RETURN 1
5 SEND_DERO_TO_ADDRESS(SIGNER(),LOAD("deposited"))
6 RETURN 0
End Function`;
}*/'] |