UNPKG

@funded-labs/plug-controller

Version:

Internet Computer Plug wallet's controller

122 lines (121 loc) 5.99 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 }); exports.getCapTransactions = void 0; /* eslint-disable camelcase */ /* eslint-disable no-underscore-dangle */ const axios_1 = __importDefault(require("axios")); const cap_js_1 = require("@funded-labs/cap-js"); const dab_js_1 = require("@funded-labs/dab-js"); const dab_1 = require("../../../dab"); const object_1 = require("../../../object"); const sonic_1 = require("./sonic"); const capTransactionFormatter_1 = require("../../../formatter/transaction/capTransactionFormatter"); const parseUnderscoreNumber = value => value ? Number(value.replace('_', '')) : null; const getTransactionCanister = (contract) => { var _a; return (_a = contract === null || contract === void 0 ? void 0 : contract.split('#')) === null || _a === void 0 ? void 0 : _a[1]; }; const metadataArrayToObject = metadata => metadata.reduce((acum, item) => (Object.assign(Object.assign({}, acum), { [item.principal_id.toString()]: item })), {}); const getCanistersInfo = (canisterIds, agent) => __awaiter(void 0, void 0, void 0, function* () { const dabTokensInfo = metadataArrayToObject(yield (0, dab_js_1.getTokens)({ agent })); const dabNFTsInfo = metadataArrayToObject(yield (0, dab_js_1.getAllNFTS)({ agent })); const dabInfo = yield Promise.all(canisterIds.map((canisterId) => __awaiter(void 0, void 0, void 0, function* () { let canisterInfo = { canisterId }; // First check if present in nft or token registries if (dabTokensInfo[canisterId]) canisterInfo['tokenRegistryInfo'] = dabTokensInfo[canisterId]; if (dabNFTsInfo[canisterId]) canisterInfo['nftRegistryInfo'] = dabNFTsInfo[canisterId]; try { // Fetch extra metadata from canister registry const fetchedCanisterInfo = yield (0, dab_1.getCanisterInfo)(canisterId, agent); canisterInfo = Object.assign(Object.assign({}, canisterInfo), fetchedCanisterInfo); } catch (error) { /* eslint-disable-next-line */ console.error('DAB error: ', error); } return canisterInfo; }))); const canistersInfo = dabInfo.reduce((acum, info) => (Object.assign(Object.assign({}, acum), { [info.canisterId]: info })), {}); return canistersInfo; }); const getCanisterIdsFromSonicTx = details => { const { to, from, token0, token1, token, token_id, token_identifier } = details || {}; const tokenId = (details === null || details === void 0 ? void 0 : details.tokenId) || token || token_id || parseUnderscoreNumber(token_identifier) || undefined; return [to, from, token0, token1, tokenId]; }; const getCanisterIds = (prettyEvents) => { const canisterIds = prettyEvents.reduce((acum, { canisterId, prettyEvent }) => { if (canisterId === sonic_1.SONIC_SWAP_CANISTER_ID) { return acum .concat([canisterId]) .concat(getCanisterIdsFromSonicTx(prettyEvent.details)); } else { return acum.concat([canisterId]); } }, []); return [...new Set(canisterIds.map(id => (0, object_1.parsePrincipal)(id)))].filter(value => value); }; const getCapTransactions = ({ principalId, lastEvaluatedKey, agent, }) => __awaiter(void 0, void 0, void 0, function* () { let total = 0; let events = []; let LastEvaluatedKey = lastEvaluatedKey; try { do { const options = Object.assign({ method: 'get', url: `https://kyasshu.plugwallet.ooo/cap/user/txns/${principalId}` }, (LastEvaluatedKey ? { params: { LastEvaluatedKey, }, } : {})); const response = yield (0, axios_1.default)(options); const prettifyEvents = response.data.Items.map(item => ({ sk: item.sk, canisterId: getTransactionCanister(item.contractId), prettyEvent: (0, cap_js_1.prettifyCapTransactions)(item.event), })); LastEvaluatedKey = response.data.LastEvaluatedKey; total += response.data.Count; events = [...events, ...prettifyEvents]; } while (LastEvaluatedKey); } catch (e) { console.error('CAP transactions error:', e); return { total: 0, transactions: [], }; } // Keep only last 50 txs by timestamp const lastEvents = events .sort((a, b) => a.prettyEvent.time < b.prettyEvent.time ? -1 : a.prettyEvent.time > b.prettyEvent.time ? 1 : 0) .slice(-50); const canistersInfo = yield getCanistersInfo(getCanisterIds(lastEvents), agent); const transactions = yield Promise.all(lastEvents.map((prettyEvent) => __awaiter(void 0, void 0, void 0, function* () { return (0, capTransactionFormatter_1.formatCapTransaction)(prettyEvent, canistersInfo); }))); return { total: total >= 50 ? 50 : total, transactions, }; }); exports.getCapTransactions = getCapTransactions; exports.default = {};