all files / src/ conditionUtils.js

100% Statements 24/24
100% Branches 2/2
100% Functions 3/3
100% Lines 23/23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                                                                     
'use strict'
 
const cc = require('five-bells-condition')
const makeCaseAttestation = require('five-bells-shared/utils/makeCaseAttestation')
 
/**
 * Get the compound execution_condition.
 * @param {Object} params
 * @param {String} params.receiptCondition Receipt condition
 * @param {URI} params.notary (optional)
 * @param {URI} params.caseId (required iff params.notary)
 * @param {String} params.notaryPublicKey (required iff params.notary)
 * @returns {String} Execution condition
 */
function getExecutionCondition (params) {
  if (!params.notary) return params.receiptCondition
 
  const condition = new cc.ThresholdSha256()
  condition.addSubconditionUri(params.receiptCondition)
  const notaryConditionParams = Object.assign({}, params, { state: 'executed' })
  condition.addSubconditionUri(getNotaryCondition(notaryConditionParams))
  condition.setThreshold(2)
  return condition.getConditionUri()
}
 
/**
 * @param {Object} params
 * @param {URI} params.caseId
 * @param {URI} params.notary
 * @param {String} params.notaryPublicKey
 * @returns {String} Cancellation condition
 */
function getCancellationCondition (params) {
  params.state = 'rejected'
  return getNotaryCondition(params)
}
 
/**
 * @param {Object} params
 * @param {String} params.state "executed" or "cancelled"
 * @param {URI} params.caseId
 * @param {URI} params.notary
 * @param {String} params.notaryPublicKey base64
 * @returns {String} Notary condition
 */
function getNotaryCondition (params) {
  const signatureCondition = new cc.Ed25519()
  signatureCondition.setPublicKey(new Buffer(params.notaryPublicKey, 'base64'))
  const attestationUri = makeCaseAttestation(params.caseId, params.state)
  const condition = new cc.PrefixSha256()
  condition.setPrefix(new Buffer(attestationUri, 'utf8'))
  condition.setSubfulfillment(signatureCondition)
  return condition.getConditionUri()
}
 
exports.getExecutionCondition = getExecutionCondition
exports.getCancellationCondition = getCancellationCondition