blub-sdk
Version:
A modular SDK for interacting with the BLUB ecosystem on the Sui blockchain.
131 lines (130 loc) • 4.46 kB
JavaScript
;
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}`;
}