UNPKG

@kiroboio/fct-core

Version:

Kirobo.io FCT Core library

95 lines 2.84 kB
function getArray(type) { const matches = type.match(/^(.*)\[(\d+)?\]$/); return matches ? // Return `null` if the array is dynamic. [matches[2] ? Number(matches[2]) : null, matches[1]] : undefined; } function prepareParam(param) { const isArray = getArray(param.type); if (isArray) { const [length] = isArray; if (!param.components) { throw Error("Should not happen"); } const components = param.components.map((p) => ({ ...p, name: `${param.name}.${p.name}` })); const dynamic = length === null; let data; if (dynamic) { data = encodeAsArray(components); } else { data = components .map(prepareParam) .map((p) => p.data) .flat(); } return { dynamic, data: data, }; } if (param.type === "address") { return { dynamic: false, data: [`VALUE: Address (${param.name})`], }; } if (param.type === "bool") { return { dynamic: false, data: [`VALUE: Bool (${param.name})`], }; } if (param.type.startsWith("uint") || param.type.startsWith("int")) { return { dynamic: false, data: [`VALUE: Number (${param.name})`], }; } if (param.type === "bytes") { if (!param.components) { throw Error("Should not happen"); } const components = param.components.map((p) => ({ ...p, name: `${param.name}.${p.name}` })); const data = ["Offset of " + param.name, "Length of " + param.name, ...encodeAsArray(components)]; return { dynamic: true, data: data, }; } return { dynamic: false, data: [], }; } function encodeAsArray(params) { const staticData = []; const dynamicData = []; for (const param of params) { const { dynamic, data } = prepareParam(param); if (dynamic) { staticData.push("Offset of " + param.name); dynamicData.push("Length of " + param.name); dynamicData.push(...data); } else { staticData.push(...data); } } return [...staticData, ...dynamicData]; } export function getOutputMap(params) { const data = encodeAsArray(params); // We want to return a map of the output values and the index of the output value const outputMap = {}; for (let i = 0; i < data.length; i++) { // If output data doesnt have a VALUE: prefix, we skip it if (!data[i].startsWith("VALUE: ")) { continue; } outputMap[data[i]] = i; } return outputMap; } //# sourceMappingURL=outputMap.js.map