UNPKG

@dolomite-exchange/dolomite-margin

Version:

Ethereum Smart Contracts and TypeScript library used for the DolomiteMargin trading protocol

268 lines 11.7 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Logs = void 0; var bignumber_js_1 = __importDefault(require("bignumber.js")); var Helpers_1 = require("../lib/Helpers"); var Events_json_1 = require("../../build/published_contracts/Events.json"); var AdminImpl_json_1 = require("../../build/published_contracts/AdminImpl.json"); var Permission_json_1 = require("../../build/published_contracts/Permission.json"); var Expiry_json_1 = require("../../build/published_contracts/Expiry.json"); var SignedOperationProxy_json_1 = require("../../build/published_contracts/SignedOperationProxy.json"); var EventEmitterRegistry_json_1 = require("../../build/published_contracts/EventEmitterRegistry.json"); var Logs = /** @class */ (function () { function Logs(contracts, web3) { this.contracts = contracts; this.web3 = web3; } Logs.prototype.parseLogs = function (receipt, options) { var _this = this; if (options === void 0) { options = {}; } var logs = this.parseAllLogs(receipt); if (options.skipAdminLogs) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, AdminImpl_json_1.abi); }); } if (options.skipOperationLogs) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, Events_json_1.abi); }); } if (options.skipPermissionLogs) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, Permission_json_1.abi); }); } if (options.skipSignedOperationProxyLogs) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, SignedOperationProxy_json_1.abi); }); } if (options.skipExpiryLogs) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, Expiry_json_1.abi); }); } if (options.skipEventEmitterRegistry) { logs = logs.filter(function (log) { return !_this.logIsFrom(log, EventEmitterRegistry_json_1.abi); }); } var coveragePrefix = '__'; logs = logs.filter(function (log) { return !log.name.startsWith(coveragePrefix); }); return logs; }; Logs.prototype.logIsFrom = function (log, abi) { return abi.filter(function (e) { return e.name === log.name; }).length !== 0; }; Logs.prototype.parseAllLogs = function (receipt) { var _this = this; var events; if (receipt.logs) { events = JSON.parse(JSON.stringify(receipt.logs)); return events.map(function (e) { return _this.parseLog(e); }).filter(function (l) { return !!l; }); } if (receipt.events) { var tempEvents = JSON.parse(JSON.stringify(receipt.events)); events = []; Object.values(tempEvents).forEach(function (e) { if (Array.isArray(e)) { e.forEach(function (ev) { return events.push(ev); }); } else { events.push(e); } }); events.sort(function (a, b) { return a.logIndex - b.logIndex; }); return events.map(function (e) { return _this.parseEvent(e); }).filter(function (l) { return !!l; }); } throw new Error('Receipt has no logs'); }; Logs.prototype.eventLogToLog = function (event) { return { address: event.address, data: event.raw.data, topics: event.raw.topics, logIndex: event.logIndex, transactionHash: event.transactionHash, transactionIndex: event.transactionIndex, blockHash: event.blockHash, blockNumber: event.blockNumber, }; }; Logs.prototype.parseEvent = function (event) { return this.parseLog(this.eventLogToLog(event)); }; Logs.prototype.parseLog = function (log) { switch (log.address.toLowerCase()) { case this.contracts.dolomiteMargin.options.address.toLowerCase(): { return this.parseLogWithContract(this.contracts.dolomiteMargin, log); } case this.contracts.expiry.options.address.toLowerCase(): { return this.parseLogWithContract(this.contracts.expiry, log); } case this.contracts.signedOperationProxy.options.address.toLowerCase(): { return this.parseLogWithContract(this.contracts.signedOperationProxy, log); } case this.contracts.eventEmitterRegistry.options.address.toLowerCase(): { return this.parseLogWithContract(this.contracts.eventEmitterRegistry, log); } } return null; }; Logs.prototype.parseEventLogWithContract = function (contract, event) { return this.parseLogWithContract(contract, this.eventLogToLog(event)); }; Logs.prototype.parseLogWithContract = function (contract, log) { var events = contract.options.jsonInterface.filter(function (e) { return e.type === 'event'; }); var eventJson = events.find(function (e) { return e.signature.toLowerCase() === log.topics[0].toLowerCase(); }); if (!eventJson && process.env.COVERAGE !== 'true') { throw new Error("Event with topic not found: " + log.topics[0]); } else if (!eventJson) { return null; } var eventArgs = this.web3.eth.abi.decodeLog(eventJson.inputs, log.data, log.topics.slice(1)); return __assign(__assign({}, log), { name: eventJson.name, args: this.parseArgs(eventJson, eventArgs) }); }; Logs.prototype.parseArgs = function (eventJson, eventArgs) { var parsed = {}; eventJson.inputs.forEach(function (input) { var val; if (input.type === 'address') { val = eventArgs[input.name]; } else if (input.type === 'bool') { val = eventArgs[input.name]; } else if (input.type.match(/^bytes[0-9]*$/)) { val = eventArgs[input.name]; } else if (input.type.match(/^uint[0-9]*$/)) { val = new bignumber_js_1.default(eventArgs[input.name]); } else if (input.type.match(/^uint[0-9]*\[]$/)) { val = eventArgs[input.name].map(function (arg) { return new bignumber_js_1.default(arg); }); } else if (input.type === 'tuple') { val = Logs.parseTuple(input, eventArgs[input.name]); } else if (input.type === 'tuple[]') { val = eventArgs[input.name].map(function (arg) { return Logs.parseTuple(input, arg); }); } else if (input.type === 'string') { val = eventArgs[input.name]; } else { throw new Error("Unknown event arg type " + input.type); } parsed[input.name] = val; }); return parsed; }; Logs.parseTuple = function (input, eventArgs) { if (Array.isArray(input.components) && input.components.length === 2 && input.components[0].name === 'owner' && input.components[1].name === 'number') { return Logs.parseAccountInfo(eventArgs); } if (Array.isArray(input.components) && input.components.length === 2 && input.components[0].name === 'deltaWei' && input.components[1].name === 'newPar') { return Logs.parseBalanceUpdate(eventArgs); } if (Array.isArray(input.components) && input.components.length === 3 && input.components[0].name === 'borrow' && input.components[1].name === 'supply' && input.components[2].name === 'lastUpdate') { return Logs.parseIndex(eventArgs); } if (Array.isArray(input.components) && input.components.length === 1 && input.components[0].name === 'value') { if (input.name.toLowerCase().includes('spread') || input.name.toLowerCase().includes('ratio') || input.name.toLowerCase().includes('rate') || input.name.toLowerCase().includes('premium')) { return Logs.parseDecimalValue(eventArgs); } return Logs.parseIntegerValue(eventArgs); } if (Array.isArray(input.components) && input.components.length === 2 && input.components[0].name === 'sign' && input.components[1].name === 'value') { return Logs.parseWei(eventArgs); } if (Array.isArray(input.components) && input.components.length === 4 && input.components[0].name === 'traderType' && input.components[1].name === 'makerAccountIndex' && input.components[2].name === 'trader' && input.components[3].name === 'tradeData') { return Logs.parseTraderParam(eventArgs); } if (Array.isArray(input.components) && input.components.length === 3 && input.components[0].name === 'price' && input.components[1].name === 'fee' && input.components[2].name === 'isNegativeFee') { return Logs.parseFillData(eventArgs); } throw new Error('Unknown tuple type in event'); }; Logs.parseAccountInfo = function (accountInfo) { return { owner: accountInfo.owner, number: new bignumber_js_1.default(accountInfo.number), }; }; Logs.parseIndex = function (index) { return { borrow: Helpers_1.stringToDecimal(index.borrow), supply: Helpers_1.stringToDecimal(index.supply), lastUpdate: new bignumber_js_1.default(index.lastUpdate), }; }; Logs.parseBalanceUpdate = function (update) { return { deltaWei: Helpers_1.valueToInteger(update.deltaWei), newPar: Helpers_1.valueToInteger(update.newPar), }; }; Logs.parseDecimalValue = function (value) { return Helpers_1.stringToDecimal(value.value); }; Logs.parseIntegerValue = function (value) { return new bignumber_js_1.default(value.value); }; Logs.parseWei = function (weiData) { return Helpers_1.valueToInteger({ value: weiData.value, sign: weiData.sign, }); }; Logs.parseTraderParam = function (traderParam) { return { traderType: traderParam.traderType, makerAccountIndex: Helpers_1.stringToDecimal(traderParam.makerAccountIndex).toNumber(), trader: traderParam.trader, tradeData: traderParam.tradeData, }; }; Logs.parseFillData = function (fillData) { return { price: Helpers_1.stringToDecimal(fillData.price), fee: Helpers_1.stringToDecimal(fillData.fee), isNegativeFee: fillData.isNegativeFee, }; }; return Logs; }()); exports.Logs = Logs; //# sourceMappingURL=Logs.js.map