@funded-labs/plug-controller
Version:
Internet Computer Plug wallet's controller
122 lines (121 loc) • 5.99 kB
JavaScript
;
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 = {};