UNPKG

blub-sdk

Version:

A modular SDK for interacting with the BLUB ecosystem on the Sui blockchain.

131 lines (130 loc) 4.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isSortedSymbols = isSortedSymbols; exports.composeType = composeType; exports.extractAddressFromType = extractAddressFromType; exports.extractStructTagFromType = extractStructTagFromType; exports.normalizeCoinType = normalizeCoinType; exports.fixSuiObjectId = fixSuiObjectId; exports.patchFixSuiObjectId = patchFixSuiObjectId; exports.createTarget = createTarget; const utils_1 = require("@mysten/sui/utils"); const sui_1 = require("./sui"); const CoinAssist_1 = require("./CoinAssist"); const EQUAL = 0; const LESS_THAN = 1; const GREATER_THAN = 2; function cmp(a, b) { if (a === b) { return EQUAL; } if (a < b) { return LESS_THAN; } return GREATER_THAN; } function compare(symbolX, symbolY) { let i = 0; const len = symbolX.length <= symbolY.length ? symbolX.length : symbolY.length; const lenCmp = cmp(symbolX.length, symbolY.length); while (i < len) { const elemCmp = cmp(symbolX.charCodeAt(i), symbolY.charCodeAt(i)); i += 1; if (elemCmp !== 0) { return elemCmp; } } return lenCmp; } function isSortedSymbols(symbolX, symbolY) { return compare(symbolX, symbolY) === LESS_THAN; } function composeType(address, ...args) { const generics = Array.isArray(args[args.length - 1]) ? args.pop() : []; const chains = [address, ...args].filter(Boolean); let result = chains.join("::"); if (generics && generics.length) { result += `<${generics.join(", ")}>`; } return result; } function extractAddressFromType(type) { return type.split("::")[0]; } function extractStructTagFromType(type) { try { let _type = type.replace(/\s/g, ""); const genericsString = _type.match(/(<.+>)$/); const generics = genericsString?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g); if (generics) { _type = _type.slice(0, _type.indexOf("<")); const tag = extractStructTagFromType(_type); const structTag = { ...tag, type_arguments: generics.map((item) => extractStructTagFromType(item).source_address), }; structTag.type_arguments = structTag.type_arguments.map((item) => { return CoinAssist_1.CoinUtils.isSuiCoin(item) ? item : extractStructTagFromType(item).source_address; }); structTag.source_address = composeType(structTag.full_address, structTag.type_arguments); return structTag; } const parts = _type.split("::"); const isSuiCoin = _type === sui_1.GAS_TYPE_ARG || _type === sui_1.GAS_TYPE_ARG_LONG; const structTag = { full_address: _type, address: isSuiCoin ? "0x2" : (0, utils_1.normalizeSuiObjectId)(parts[0]), module: parts[1], name: parts[2], type_arguments: [], source_address: "", }; structTag.full_address = `${structTag.address}::${structTag.module}::${structTag.name}`; structTag.source_address = composeType(structTag.full_address, structTag.type_arguments); return structTag; } catch { return { full_address: type, address: "", module: "", name: "", type_arguments: [], source_address: type, }; } } function normalizeCoinType(coinType) { return extractStructTagFromType(coinType).source_address; } function fixSuiObjectId(value) { if (value.toLowerCase().startsWith("0x")) { return (0, utils_1.normalizeSuiObjectId)(value); } return value; } /** * Recursively traverses the given data object and patches any string values that represent Sui object IDs. * * @param {any} data - The data object to be patched. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function patchFixSuiObjectId(data) { for (const key in data) { const type = typeof data[key]; if (type === "object") { patchFixSuiObjectId(data[key]); } else if (type === "string") { const value = data[key]; data[key] = fixSuiObjectId(value); } } } function createTarget(packageName, moduleName, functionName) { return `${packageName}::${moduleName}::${functionName}`; }