@dolomite-exchange/dolomite-margin
Version:
Ethereum Smart Contracts and TypeScript library used for the DolomiteMargin trading protocol
268 lines • 11.7 kB
JavaScript
"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