UNPKG

@rsksmart/rif-storage-pinning

Version:

Application for providing your storage space to other to use in exchange of RIF Tokens

119 lines (118 loc) 6.41 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const web3_utils_1 = require("web3-utils"); const bignumber_js_1 = __importDefault(require("bignumber.js")); const logger_1 = require("../../logger"); const errors_1 = require("../../errors"); const utils_1 = require("../../utils"); const agreement_model_1 = __importDefault(require("../../models/agreement.model")); const definitions_1 = require("../../definitions"); const communication_1 = require("../../communication"); const logger = logger_1.loggingFactory('processor:blockchain:agreement'); function getBlockDate(eth, blockNumber) { return __awaiter(this, void 0, void 0, function* () { return new Date((yield eth.getBlock(blockNumber)).timestamp * 1000); }); } const handlers = { NewAgreement(event, options) { return __awaiter(this, void 0, void 0, function* () { const { blockNumber, returnValues: { provider: offerId, agreementCreator: consumer, dataReference: dReference, size, billingPeriod, billingPrice, token: tokenAddress, availableFunds } } = event; const agreementReference = web3_utils_1.soliditySha3(consumer, ...dReference, tokenAddress); const dataReference = utils_1.decodeByteArray(dReference); const data = { agreementReference, dataReference, consumer, offerId, size, billingPeriod, billingPrice, availableFunds, token: tokenAddress, expiredAtBlockNumber: null, lastPayout: yield getBlockDate(options.eth, blockNumber) }; const [agreement] = yield agreement_model_1.default.upsert(data); // Agreement might already exist logger.info(`Created new Agreement with ID ${agreementReference} for offer ${offerId}`); if (options.manager) { yield communication_1.broadcast(definitions_1.MessageCodesEnum.I_AGREEMENT_NEW, { agreementReference: agreementReference }); yield options.manager.pin(dataReference, agreement.size, agreement.agreementReference); } }); }, AgreementStopped(event, options) { return __awaiter(this, void 0, void 0, function* () { const { returnValues: { agreementReference: id } } = event; const agreement = yield agreement_model_1.default.findByPk(id); if (!agreement) { throw new errors_1.EventError(`Agreement with ID ${id} was not found!`, 'AgreementStopped'); } agreement.isActive = false; yield agreement.save(); if (options.manager) { try { yield options.manager.unpin(agreement.dataReference); } catch (e) { // We ignore not-pinned errors because the files might be already GCed if (e.code !== errors_1.NotPinnedError.code) { throw e; } } yield communication_1.broadcast(definitions_1.MessageCodesEnum.I_AGREEMENT_STOPPED, { agreementReference: agreement.agreementReference }); } logger.info(`Agreement ${id} was stopped.`); }); }, AgreementFundsDeposited(event) { return __awaiter(this, void 0, void 0, function* () { const { returnValues: { agreementReference: id, amount } } = event; const agreement = yield agreement_model_1.default.findByPk(id); if (!agreement) { throw new errors_1.EventError(`Agreement with ID ${id} was not found!`, 'AgreementFundsDeposited'); } agreement.availableFunds = agreement.availableFunds.plus(new bignumber_js_1.default(amount)); yield agreement.save(); logger.info(`Agreement ${id} was topped up with ${amount}.`); }); }, AgreementFundsWithdrawn(event) { return __awaiter(this, void 0, void 0, function* () { const { returnValues: { agreementReference: id, amount } } = event; const agreement = yield agreement_model_1.default.findByPk(id); if (!agreement) { throw new errors_1.EventError(`Agreement with ID ${id} was not found!`, 'AgreementFundsWithdrawn'); } agreement.availableFunds = agreement.availableFunds.minus(new bignumber_js_1.default(amount)); yield agreement.save(); logger.info(`${amount} was withdrawn from funds of Agreement ${id}.`); }); }, AgreementFundsPayout(event, options) { return __awaiter(this, void 0, void 0, function* () { const { blockNumber, returnValues: { agreementReference: id, amount } } = event; const agreement = yield agreement_model_1.default.findByPk(id); if (!agreement) { throw new errors_1.EventError(`Agreement with ID ${id} was not found!`, 'AgreementFundsWithdrawn'); } agreement.lastPayout = yield getBlockDate(options.eth, blockNumber); agreement.availableFunds = agreement.availableFunds.minus(new bignumber_js_1.default(amount)); yield agreement.save(); logger.info(`${amount} was payed out from funds of Agreement ${id}.`); }); } }; exports.default = utils_1.buildHandler(handlers, ['NewAgreement', 'AgreementFundsDeposited', 'AgreementFundsWithdrawn', 'AgreementFundsPayout', 'AgreementStopped']);