def creatordispute(multi, identity, defaults, dry_run): """ File a dispute (as a job creator). If you are a job creator, file a dispute on a job, for example if the job is not done on time. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Dispute Delivery': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True Order.update_orders(rein, Document, Document.get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) valid_results = filter_and_parse_valid_sigs(rein, contents) not_our_orders = [] for res in valid_results: if res['Job creator public key'] == key: not_our_orders.append(res) if len(not_our_orders) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(not_our_orders, 'Job ID', form) else: doc = dispute_prompt(rein, not_our_orders, "Deliverables") if not doc: return log.info('got delivery for dispute') fields = [ {'label': 'Job name', 'value_from': doc}, {'label': 'Job ID', 'value_from': doc}, {'label': 'Dispute detail', 'not_null': form}, {'label': 'Primary escrow redeem script', 'value_from': doc}, {'label': 'Mediator escrow redeem script', 'value_from': doc}, ] document = assemble_document('Dispute Delivery', fields) res = sign_and_store_document(rein, 'creatordispute', document, user.daddr, user.dkey, store) if res and store: click.echo("Dispute signed by job creator. Run 'rein sync' to push to available servers.") log.info('creatordispute signed') if res else log.error('creatordispute failed')
def status(multi, identity, jobid): """ Show user info and active jobs. """ (log, user, key, urls) = init(multi, identity) Order.update_orders(rein, Document, get_user_documents) documents = get_user_documents(rein) if jobid is None: click.echo("User: %s" % user.name) click.echo("Master bitcoin address: %s" % user.maddr) click.echo("Delegate bitcoin address: %s" % user.daddr) click.echo("Delegate public key: %s" % key) click.echo("Willing to mediate: %s" % user.will_mediate) if user.will_mediate: click.echo("Mediator fee: %s %%" % user.mediator_fee) click.echo("Total document count: %s" % len(documents)) click.echo("Registered servers: ") for url in urls: click.echo(" " + url) click.echo("Testnet: %s" % PersistConfig.get_testnet(rein)) click.echo('') click.echo('ID Job ID Status') click.echo('-----------------------------------------------------') orders = Order.get_user_orders(rein, Document) for order in orders: past_tense = order.get_past_tense(order.get_state(rein, Document)) click.echo("%s %s %s" % (order.id, order.job_id, past_tense)) else: order = Order.get_by_job_id(rein, jobid) documents = order.get_documents(rein, Document) for document in documents: click.echo("\n" + document.contents)
def workerdispute(multi, identity, defaults, dry_run): """ File a dispute (as a worker). If you are a worker, file a dispute because the creator is unresponsive or does not accept work that fulfills the job specification, they would use this command to file a dispute. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Dispute Offer': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True valid_results = [] Order.update_orders(rein, Document, Document.get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) valid_results = filter_and_parse_valid_sigs(rein, contents) if len(valid_results) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(valid_results, 'Job ID', form) else: doc = dispute_prompt(rein, valid_results, 'Deliverables') if not doc: return log.info('got in-process job for dispute') fields = [ {'label': 'Job name', 'value_from': doc}, {'label': 'Job ID', 'value_from': doc}, {'label': 'Dispute detail', 'not_null': form}, {'label': 'Primary escrow redeem script', 'value_from': doc}, {'label': 'Mediator escrow redeem script', 'value_from': doc}, ] document = assemble_document('Dispute Offer', fields) res = sign_and_store_document(rein, 'workerdispute', document, user.daddr, user.dkey, store) if res and store: click.echo("Dispute signed by worker. Run 'rein sync' to push to available servers.") log.info('workerdispute signed') if res else log.error('workerdispute failed')
def workerdispute(multi, identity, defaults, dry_run): """ File a dispute (as a worker). If you are a worker, file a dispute because the creator is unresponsive or does not accept work that fulfills the job specification, they would use this command to file a dispute. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Dispute Offer': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True valid_results = [] Order.update_orders(rein, Document, get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) valid_results = filter_and_parse_valid_sigs(rein, contents) if len(valid_results) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(valid_results, 'Job ID', form) else: doc = dispute_prompt(rein, valid_results, 'Deliverables') if not doc: return log.info('got in-process job for dispute') fields = [ {'label': 'Job name', 'value_from': doc}, {'label': 'Job ID', 'value_from': doc}, {'label': 'Dispute detail', 'not_null': form}, {'label': 'Primary escrow redeem script', 'value_from': doc}, {'label': 'Mediator escrow redeem script', 'value_from': doc}, ] document = assemble_document('Dispute Offer', fields) res = sign_and_store_document(rein, 'workerdispute', document, user.daddr, user.dkey, store) if res and store: click.echo("Dispute signed by worker. Run 'rein sync' to push to available servers.") log.info('workerdispute signed') if res else log.error('workerdispute failed')
def status(multi, identity, jobid): """ Show user info and active jobs. """ (log, user, key, urls) = init(multi, identity) Order.update_orders(rein, Document, Document.get_user_documents) documents = Document.get_user_documents(rein) if jobid is None: click.echo("User: %s" % user.name) click.echo("Master bitcoin address: %s" % user.maddr) click.echo("Delegate bitcoin address: %s" % user.daddr) click.echo("Delegate public key: %s" % key) click.echo("Willing to mediate: %s" % user.will_mediate) if user.will_mediate: click.echo("Mediator fee: %s %%" % user.mediator_fee) click.echo("Total document count: %s" % len(documents)) click.echo("Registered servers: ") for url in urls: click.echo(" " + url) click.echo("Testnet: %s" % PersistConfig.get_testnet(rein)) click.echo('') click.echo('ID Job ID Status') click.echo('-----------------------------------------------------') orders = Order.get_user_orders(rein, Document) for order in orders: past_tense = order.get_past_tense(order.get_state(rein, Document)) click.echo("%s %s %s" % (order.id, order.job_id, past_tense)) else: remote_documents = [] for url in urls: log.info("Querying %s for job id %s..." % (url, jobid)) sel_url = "{0}query?owner={1}&query=by_job_id&job_ids={2}&testnet={3}" try: answer = requests.get( url=sel_url.format(url, user.maddr, jobid, rein.testnet)) except: click.echo('Error connecting to server.') log.error('server connect error ' + url) continue data = answer.json() remote_documents += filter_and_parse_valid_sigs( rein, data['by_job_id']) unique_documents = unique(remote_documents) for doc in remote_documents: click.echo(doc) if len(remote_documents) == 0: order = Order.get_by_job_id(rein, jobid) if order: documents = order.get_documents(rein, Document) for document in documents: click.echo("\n" + document.contents) else: click.echo("Job id not found")
def status(multi, identity, jobid): """ Show user info and active jobs. """ (log, user, key, urls) = init(multi, identity) Order.update_orders(rein, Document, Document.get_user_documents) documents = Document.get_user_documents(rein) if jobid is None: click.echo("User: %s" % user.name) click.echo("Master bitcoin address: %s" % user.maddr) click.echo("Delegate bitcoin address: %s" % user.daddr) click.echo("Delegate public key: %s" % key) click.echo("Willing to mediate: %s" % user.will_mediate) if user.will_mediate: click.echo("Mediator fee: %s %%" % user.mediator_fee) click.echo("Total document count: %s" % len(documents)) click.echo("Registered servers: ") for url in urls: click.echo(" " + url) click.echo("Testnet: %s" % PersistConfig.get_testnet(rein)) click.echo('') click.echo('ID Job ID Status') click.echo('-----------------------------------------------------') orders = Order.get_user_orders(rein, Document) for order in orders: past_tense = order.get_past_tense(order.get_state(rein, Document)) click.echo("%s %s %s" % (order.id, order.job_id, past_tense)) else: remote_documents = [] for url in urls: log.info("Querying %s for job id %s..." % (url, jobid)) sel_url = "{0}query?owner={1}&query=by_job_id&job_ids={2}&testnet={3}" try: answer = requests.get(url=sel_url.format(url, user.maddr, jobid, rein.testnet)) except: click.echo('Error connecting to server.') log.error('server connect error ' + url) continue data = answer.json() remote_documents += filter_and_parse_valid_sigs(rein, data['by_job_id']) unique_documents = unique(remote_documents) for doc in remote_documents: click.echo(doc) if len(remote_documents) == 0: order = Order.get_by_job_id(rein, jobid) if order: documents = order.get_documents(rein, Document) for document in documents: click.echo("\n" + document.contents) else: click.echo("Job id not found")
def accept(multi, identity, defaults, dry_run): """ Accept a delivery. Review and accept deliveries for your jobs. Once a delivery is accpted, mediators are advised not to sign any tranasctions refunding the job creator. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Accept Delivery': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True Order.update_orders(rein, Document, Document.get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) valid_results = filter_and_parse_valid_sigs(rein, contents) our_orders = [] for res in valid_results: if res['Job creator public key'] == key: order = Order.get_by_job_id(rein, res['Job ID']) res['state'] = order.get_state(rein, Document) our_orders.append(res) if len(our_orders) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(our_orders, 'Job ID', form) else: doc = accept_prompt(rein, our_orders, "Deliverables") if not doc: return log.info('got delivery for accept') fields = [ {'label': 'Job name', 'value_from': doc}, {'label': 'Job ID', 'value_from': doc}, {'label': 'Signed primary payment', 'not_null': form}, {'label': 'Signed mediator payment', 'not_null': form}, {'label': 'Primary escrow redeem script', 'value_from': doc}, {'label': 'Mediator escrow redeem script', 'value_from': doc}, ] document = assemble_document('Accept Delivery', fields) click.echo('\n'+document+'\n') if click.confirm("Are you sure?"): res = sign_and_store_document(rein, 'accept', document, user.daddr, user.dkey, store) if res and store: click.echo("Accepted delivery. Run 'rein sync' to push to available servers.") log.info('accept signed') if res else log.error('accept failed') else: click.echo("Accept aborted.")
def deliver(multi, identity, defaults, dry_run): """ Deliver on a job. Share deliverables with the creator of the job when completed. In the event of a dispute, mediators are advised to review the deliverables while deciding how to distribute funds. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Deliver': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True Order.update_orders(rein, Document, Document.get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) offers = filter_and_parse_valid_sigs(rein, contents) not_our_orders = [] for res in offers: if res['Job creator public key'] != key: not_our_orders.append(res) if len(not_our_orders) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(not_our_orders, 'Job ID', form) else: doc = delivery_prompt(rein, not_our_orders, 'Deliverables') if not doc: return log.info('got offer for delivery') fields = [ {'label': 'Job name', 'value_from': doc}, {'label': 'Job ID', 'value_from': doc}, {'label': 'Deliverables', 'not_null': form}, {'label': 'Bid amount (BTC)', 'value_from': doc}, {'label': 'Primary escrow address', 'value_from': doc}, {'label': 'Mediator escrow address', 'value_from': doc}, {'label': 'Primary escrow redeem script', 'value_from': doc}, {'label': 'Mediator escrow redeem script', 'value_from': doc}, {'label': 'Worker public key', 'value_from': doc}, {'label': 'Mediator public key', 'value_from': doc}, {'label': 'Job creator public key', 'value_from': doc}, ] document = assemble_document('Delivery', fields) if check_redeem_scripts(document): res = sign_and_store_document(rein, 'delivery', document, user.daddr, user.dkey, store) if res and store: click.echo("Delivery created. Run 'rein sync' to push to available servers.") else: click.echo("Incorrect redeem scripts. Check keys and their order in redeem script.") res = False log.info('delivery signed') if res else log.error('delivery failed')
def accept(multi, identity, defaults, dry_run): """ Accept a delivery. Review and accept deliveries for your jobs. Once a delivery is accpted, mediators are advised not to sign any tranasctions refunding the job creator. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Accept Delivery': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True Order.update_orders(rein, Document, get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) valid_results = filter_and_parse_valid_sigs(rein, contents) our_orders = [] for res in valid_results: if res['Job creator public key'] == key: our_orders.append(res) if len(our_orders) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(our_orders, 'Job ID', form) else: doc = accept_prompt(rein, our_orders, "Deliverables") if not doc: return log.info('got delivery for accept') fields = [ { 'label': 'Job name', 'value_from': doc }, { 'label': 'Job ID', 'value_from': doc }, { 'label': 'Signed primary payment', 'not_null': form }, { 'label': 'Signed mediator payment', 'not_null': form }, { 'label': 'Primary escrow redeem script', 'value_from': doc }, { 'label': 'Mediator escrow redeem script', 'value_from': doc }, ] document = assemble_document('Accept Delivery', fields) click.echo('\n' + document + '\n') if click.confirm("Are you sure?"): res = sign_and_store_document(rein, 'accept', document, user.daddr, user.dkey, store) if res and store: click.echo( "Accepted delivery. Run 'rein sync' to push to available servers." ) log.info('accept signed') if res else log.error('accept failed') else: click.echo("Accept aborted.")
def deliver(multi, identity, defaults, dry_run): """ Deliver on a job. Share deliverables with the creator of the job when completed. In the event of a dispute, mediators are advised to review the deliverables while deciding how to distribute funds. """ (log, user, key, urls) = init(multi, identity) form = {} if defaults: form = parse_document(open(defaults).read()) if 'Title' in form and form['Title'] != 'Rein Deliver': return click.echo("Input file type: " + form['Title']) store = False if dry_run else True Order.update_orders(rein, Document, get_user_documents) documents = [] orders = Order.get_user_orders(rein, Document) for order in orders: state = order.get_state(rein, Document) if state in ['offer', 'delivery']: # get parsed offer for this order and put it in an array documents += order.get_documents(rein, Document, state) contents = [] for document in documents: contents.append(document.contents) offers = filter_and_parse_valid_sigs(rein, contents) not_our_orders = [] for res in offers: if res['Job creator public key'] != key: not_our_orders.append(res) if len(not_our_orders) == 0: click.echo('None found') return if 'Job ID' in form.keys(): doc = select_by_form(not_our_orders, 'Job ID', form) else: doc = delivery_prompt(rein, not_our_orders, 'Deliverables') if not doc: return log.info('got offer for delivery') fields = [ { 'label': 'Job name', 'value_from': doc }, { 'label': 'Job ID', 'value_from': doc }, { 'label': 'Deliverables', 'not_null': form }, { 'label': 'Bid amount (BTC)', 'value_from': doc }, { 'label': 'Primary escrow address', 'value_from': doc }, { 'label': 'Mediator escrow address', 'value_from': doc }, { 'label': 'Primary escrow redeem script', 'value_from': doc }, { 'label': 'Mediator escrow redeem script', 'value_from': doc }, { 'label': 'Worker public key', 'value_from': doc }, { 'label': 'Mediator public key', 'value_from': doc }, { 'label': 'Job creator public key', 'value_from': doc }, ] document = assemble_document('Delivery', fields) if check_redeem_scripts(document): res = sign_and_store_document(rein, 'delivery', document, user.daddr, user.dkey, store) if res and store: click.echo( "Delivery created. Run 'rein sync' to push to available servers." ) else: click.echo( "Incorrect redeem scripts. Check keys and their order in redeem script." ) res = False log.info('delivery signed') if res else log.error('delivery failed')