SenShaMart/blockchain/compensation.js
2023-07-13 11:32:02 +10:00

69 lines
No EOL
1.7 KiB
JavaScript

const ChainUtil = require('../util/chain-util');
const Integration = require('./integration');
const integrationValidation = {
input: ChainUtil.valdiateIsPublicKey,
counter: ChainUtil.createValidateIsIntegerWithMin(1)
};
const baseValidation = {
input: ChainUtil.validateIsPublicKey,
brokerName: ChainUtil.validateIsString,
integration: ChainUtil.createValidateObject(integrationValidation),
signature: ChainUtil.validateIsSignature
};
class Compensation {
constructor(senderKeyPair, brokerName, integration) {
const verifyIntegration = Integration.verify(integration);
if (!verifyIntegration.result) {
throw new Error(verifyIntegration.reason);
}
this.input = senderKeyPair.getPublic().encode('hex');
this.brokerName = brokerName;
this.integration = {
input: integration.input,
counter: integration.counter
};
this.signature = senderKeyPair.sign(Compensation.hashToSign(this));
const verification = Compensation.verify(this);
if (!verification.result) {
throw new Error(verification.reason);
}
}
static hashToSign(transaction) {
return ChainUtil.hash([
transaction.input,
transaction.brokerName,
transaction.integration]);
}
static verify(transaction) {
const validationRes = ChainUtil.validateObject(transaction, baseValidation);
if (!validationRes.result) {
return validationRes;
}
const verifyRes = ChainUtil.verifySignature(
transaction.input,
transaction.signature,
Compensation.hashToSign(transaction));
if (!verifyRes.result) {
return verifyRes;
}
return {
result: true,
};
}
static name() {
return "Compensation";
}
}
module.exports = Compensation;