(function(){ var fee = 152050; var employment_div = document.createElement("div"); document.body.appendChild(employment_div); employment_div.appendChild(title("lookup a job by id")); var jid_error = document.createElement("div"); employment_div.appendChild(jid_error); var jid_value = text_input("id", employment_div); employment_div.appendChild(br()); var jid_button = button_maker2("lookup the job", lookup_job); employment_div.appendChild(jid_button); employment_div.appendChild(br()); employment_div.appendChild(br()); employment_div.appendChild(title("create a new employment contract")); var jct_error = document.createElement("div"); employment_div.appendChild(jct_error); //var jct_from = text_input("worker's address", employment_div); employment_div.appendChild(br()); employment_div.appendChild(br()); var jct_balance = text_input("boss's money stored in the contract for paying the salary", employment_div); employment_div.appendChild(br()); var jct_value = text_input("how much you need to pay to buy this contract", employment_div); employment_div.appendChild(br()); var jct_salary = text_input("your salary per block?", employment_div); jct_balance.value = "2"; jct_value.value = "1.3"; jct_salary.value = "0.001"; employment_div.appendChild(br()); var jct_button = button_maker2("publish tx to create new job", create_new_job); employment_div.appendChild(jct_button); employment_div.appendChild(br()); employment_div.appendChild(br()); employment_div.appendChild(title("receive salary from your job.")); var jrst_error = document.createElement("div"); employment_div.appendChild(jrst_error); var jrst_id = text_input("job id", employment_div); employment_div.appendChild(br()); var jrst_button = button_maker2("publish tx to receive salary", receive_salary); employment_div.appendChild(jrst_button); employment_div.appendChild(br()); employment_div.appendChild(br()); jrst_id.value = ""; employment_div.appendChild(title("purchase an employment contract to hire a worker.")); var jbt_error = document.createElement("div"); employment_div.appendChild(jbt_error); var jbt_id = text_input("job id", employment_div); employment_div.appendChild(br()); var jbt_balance = text_input("balance in reserve of funds used to pay the salary.", employment_div); employment_div.appendChild(br()); var jbt_button = button_maker2("publish tx to hire this worker", buy_job); employment_div.appendChild(jbt_button); jbt_id.value = ""; employment_div.appendChild(title("adjust the settings in the employment contract for one of your workers.")); var jat_error = document.createElement("div"); employment_div.appendChild(jat_error); var jat_id = text_input("job id", employment_div); employment_div.appendChild(br()); var jat_price = text_input( "contract for sale price", employment_div); employment_div.appendChild(br()); var jat_balance = text_input( "contract balance used to pay salary", employment_div); employment_div.appendChild(br()); var jat_button = button_maker2("publish tx to adjust this contract", adjust_job); employment_div.appendChild(jat_button); jat_id.value = ""; jat_price.value = "1"; jat_balance.value = "1.5"; employment_div.appendChild(title("adjust the salary in the employment contract for one of your workers.")); var jtat_error = document.createElement("div"); employment_div.appendChild(jtat_error); var jtat_id = text_input("job id", employment_div); employment_div.appendChild(br()); var jtat_price = text_input( "contract price", employment_div); employment_div.appendChild(br()); var jtat_balance = text_input( "contract balance", employment_div); employment_div.appendChild(br()); var jtat_salary = text_input( "contract salary per block", employment_div); employment_div.appendChild(br()); var jtat_button = button_maker2("sign and print tx", team_adjust_job); employment_div.appendChild(jtat_button); jtat_id.value = ""; jtat_price.value = "1"; jtat_balance.value = "1.5"; jtat_salary.value = "0.0013"; async function lookup_job(){ var jid = jid_value.value; var job = await rpc.apost(["jobs", jid]); var id = job[1]; var worker = job[2]; var boss = job[3]; var value = job[4]; var salary = job[5]; var balance = job[6]; var time = job[7]; var N64 = 18446744073709551616;//2^64 var salary_per_block = value * salary / N64; var s = ""; s = s.concat("job id: ").concat(id); s = s.concat("
"); s = s.concat("worker: ").concat(worker); s = s.concat("
"); s = s.concat("boss: ").concat(boss); s = s.concat("
"); s = s.concat("value: ").concat(write_veo(value)); s = s.concat("
"); s = s.concat("salary per block: ").concat(write_veo(salary_per_block)); s = s.concat("
"); s = s.concat("balance: ").concat(write_veo(balance)); s = s.concat("
"); s = s.concat("time: ").concat(time); console.log(job); jid_error.innerHTML = s; }; async function create_new_job(){ //id = jobs:make_id(worker, salt) var salt = Date.now(); var from = keys.pub(); console.log(from); var from_acc = await rpc.apost(["account", from]); var nonce = from_acc[2] + 1; var value = parse_veo(jct_value.value); var balance = parse_veo(jct_balance.value); var salary_pb = parse_veo(jct_salary.value); var salary = spb_to_salary(value, salary_pb); console.log(["salary", salary, salary_pb, value]); //todo // salt is an integer less than 256 bits. var id = make_id(from, salt); var jc_tx = ["job_create_tx", from, nonce, fee, salary, balance, value, id, salt]; //["job_create_tx","BGmNJSxjm0Qr2iKpNuxD812nHD1SC8vl9p+tWULUsI1JL1vPDHnmFi+K7N6pd1VF5d6SmbEBF03bF/NbSazKZVY=",1,152050,167885818.1818182,20000000000000000,110000000000000000,[171,233,28,104,80,208,225,33,76,45,247,25,157,180,217,93,148,136,183,131,61,150,117,250,90,10,78,202,226,82,151,235],1699896034567] console.log(JSON.stringify(jc_tx)); var stx = keys.sign(jc_tx); var msg = await apost_txs([stx]); jct_error.innerHTML = "job id: " .concat(id) .concat(" ") .concat(msg); }; async function receive_salary(){ var from = keys.pub(); var from_acc = await rpc.apost(["account", from]); var nonce = from_acc[2] + 1; var id = jrst_id.value; var jrst_tx = ["job_receive_salary_tx", from, nonce, fee, id]; console.log(JSON.stringify(jrst_tx)); var stx = keys.sign(jrst_tx); var msg = await apost_txs([stx]); jrst_error.innerHTML = msg; }; async function buy_job(){ //-record(job_buy_tx, {pub, nonce, fee, id, balance}). var from = keys.pub(); var from_acc = await rpc.apost(["account", from]); var nonce = from_acc[2] + 1; var id = jbt_id.value; var balance = parseInt(jbt_balance.value); var jbt_tx = ["job_buy_tx", from, nonce, fee, id, balance]; console.log(JSON.stringify(jbt_tx)); var stx = keys.sign(jbt_tx); var msg = await apost_txs([stx]); jbt_error.innerHTML = msg; }; async function adjust_job(){ //-record(job_adjust_tx, {boss, nonce, fee, id, new_price, new_balance}). var from = keys.pub(); var from_acc = await rpc.apost(["account", from]); var nonce = from_acc[2] + 1; var id = jat_id.value; var price = parse_veo(jat_price.value); var balance = parse_veo(jat_balance.value); var jat_tx = ["job_adjust_tx", from, nonce, fee, id, price, balance]; console.log(JSON.stringify(jat_tx)); var stx = keys.sign(jat_tx); var msg = await apost_txs([stx]); jat_error.innerHTML = msg; }; async function team_adjust_job(){ //-record(job_team_adjust_tx, {boss, worker, fee, nonce, new_salary, new_price, new_balance, id}). var from = keys.pub(); var from_acc = await rpc.apost(["account", from]); var nonce = from_acc[2] + 1; var id = jtat_id.value; var job = await rpc.apost(["jobs", id]); var worker = job[2]; var price = parse_veo(jtat_price.value); var balance = parse_veo(jtat_balance.value); var salary = parse_veo(jtat_salary.value); var jtat_tx = ["job_team_adjust_tx", from, worker, fee, nonce, salary, price, balance, id]; var stx = keys.sign(jtat_tx); //var msg = await apost_txs([stx]); jtat_error.innerHTML = "the employee needs to sign this before it can be published: ".concat(JSON.stringify(stx)); }; var N64 = 1.846744 * 10000000000000000000 function salary_per_block(Value, Salary) { return(Math.floor(Value * Salary / N64)); }; function spb_to_salary(Value, spv) { return(Math.floor(spv * N64 / Value)); }; function parse_veo(x) { return(Math.floor(parseFloat(x, 10) * token_units())); }; function compress_address(a){ //if it is already compressed, then just return it. console.log(a); var b = atob(a); console.log(b); if (b.length === 33) { return(a); } else if(b.length === 65) { return(keys.compress_pub(a));//keys.compress_pub might have errors. } else { console.log("employment compress_address. unsupported data type."); console.log(a); }; }; function make_id(from, salt) { // todo calculate id from jobs:make_id/2 //convert the address to 264 bit compressed version. //salt uses 256 bits. var salt256 = integer_to_array(salt, 32); var compressed_from = compress_address(from); var array_from = string_to_array( atob(compressed_from)); var to_hash = array_from.concat(salt256); console.log(to_hash); var h = hash(to_hash); console.log(h); return(btoa(array_to_string(h))); }; /* * make a job. Tx1 = job_create_tx:make_dict(Pub, 100000000, Salary, 10000000, Fee), -record(job_create_tx, {worker, nonce, fee, salary, balance, value, id, salt}). * collect salary for a job. Tx2 = job_receive_salary_tx:make_dict(ID, Fee), -record(job_receive_salary_tx, {worker, nonce, fee, id}). * tool for buying an employees contract. Tx3 = job_buy_tx:make_dict(NewPub, ID, 50000000, Fee), -record(job_buy_tx, {pub, nonce, fee, id, balance}). * change the balance of a contract that you own. * changing the price of a contract you own. Tx4 = job_adjust_tx:make_dict(ID, 20000000, 70000000, Fee), -record(job_adjust_tx, {boss, nonce, fee, id, new_price, new_balance}). * changing the employee's salary. Tx5 = job_team_adjust_tx:make_dict(ID, Salary * 3 div 2, 30000000, -record(job_team_adjust_tx, {boss, worker, fee, nonce, new_salary, new_price, new_balance, id}). * explorer for workers. */ })();