js-moi-providers
Version:
Module to connect and interact with MOI network
344 lines • 15.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processIxObject = exports.serializePayload = exports.validateLogicActionPayload = exports.validateLogicDeployPayload = exports.validateAssetTransferPayload = exports.validateAssetSupplyPayload = exports.validateAssetCreatePayload = exports.validateParticipantCreatePayload = void 0;
const js_moi_utils_1 = require("js-moi-utils");
const js_polo_1 = require("js-polo");
const js_moi_constants_1 = require("js-moi-constants");
/**
* Validates the payload for PARTICIPANT_CREATE operation type.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {AssetActionPayload} - The validated payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateParticipantCreatePayload = (payload) => {
if ('address' in payload && 'amount' in payload) {
return payload;
}
throw new Error("Invalid participant create payload");
};
exports.validateParticipantCreatePayload = validateParticipantCreatePayload;
/**
* Validates the payload for ASSET_CREATE operation type.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {AssetCreatePayload} - The validated payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateAssetCreatePayload = (payload) => {
if ('symbol' in payload && 'supply' in payload && 'standard' in payload) {
return payload;
}
throw new Error("Invalid asset create payload");
};
exports.validateAssetCreatePayload = validateAssetCreatePayload;
/**
* Validates the payload for ASSET_MINT and ASSET_BURN operation types.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {AssetSupplyPayload} - The validated payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateAssetSupplyPayload = (payload) => {
if ('asset_id' in payload && 'amount' in payload) {
return payload;
}
throw new Error("Invalid asset mint or burn payload");
};
exports.validateAssetSupplyPayload = validateAssetSupplyPayload;
/**
* Validates the payload for ASSET_TRANSFER operation type.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {AssetActionPayload} - The validated logic action payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateAssetTransferPayload = (payload) => {
if ('beneficiary' in payload && 'asset_id' in payload && 'amount' in payload) {
return payload;
}
throw new Error("Invalid asset transfer payload");
};
exports.validateAssetTransferPayload = validateAssetTransferPayload;
/**
* Validates the payload for LOGIC_DEPLOY operation type.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {LogicDeployPayload} - The validated logic deploy payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateLogicDeployPayload = (payload) => {
if ('manifest' in payload && 'callsite' in payload) {
return payload;
}
throw new Error("Invalid logic deploy payload");
};
exports.validateLogicDeployPayload = validateLogicDeployPayload;
/**
* Validates the payload for LOGIC_INVOKE and LOGIC_ENLIST operation types.
*
* @param {OperationPayload} payload - The operation payload.
* @returns {LogicActionPayload} - The validated logic action payload.
* @throws {Error} - Throws an error if the payload is invalid.
*/
const validateLogicActionPayload = (payload) => {
if ('logic_id' in payload && 'callsite' in payload) {
return payload;
}
throw new Error("Invalid logic invoke or enlist payload");
};
exports.validateLogicActionPayload = validateLogicActionPayload;
/**
* Processes the payload based on the operation type.
*
* @param {OpType} opType - The operation type.
* @param {OperationPayload} payload - The operation payload.
* @returns {OperationPayload} - The processed operation payload.
* @throws {Error} - Throws an error if the operation type is unsupported.
*/
const processPayload = (opType, payload) => {
switch (opType) {
case js_moi_utils_1.OpType.PARTICIPANT_CREATE: {
const participantPayload = (0, exports.validateParticipantCreatePayload)(payload);
return {
...participantPayload,
address: (0, js_moi_utils_1.hexToBytes)(participantPayload.address),
};
}
case js_moi_utils_1.OpType.ASSET_CREATE: {
const createPayload = (0, exports.validateAssetCreatePayload)(payload);
return { ...createPayload };
}
case js_moi_utils_1.OpType.ASSET_MINT:
case js_moi_utils_1.OpType.ASSET_BURN: {
const supplyPayload = (0, exports.validateAssetSupplyPayload)(payload);
return {
...supplyPayload,
asset_id: (0, js_moi_utils_1.trimHexPrefix)(supplyPayload.asset_id),
};
}
case js_moi_utils_1.OpType.ASSET_TRANSFER: {
const actionPayload = (0, exports.validateAssetTransferPayload)(payload);
return {
...actionPayload,
benefactor: (0, js_moi_utils_1.hexToBytes)(actionPayload.benefactor ?? js_moi_constants_1.ZERO_ADDRESS),
beneficiary: (0, js_moi_utils_1.hexToBytes)(actionPayload.beneficiary),
asset_id: (0, js_moi_utils_1.trimHexPrefix)(actionPayload.asset_id),
};
}
case js_moi_utils_1.OpType.LOGIC_DEPLOY: {
const logicPayload = (0, exports.validateLogicDeployPayload)(payload);
return {
manifest: (0, js_moi_utils_1.hexToBytes)(logicPayload.manifest),
callsite: logicPayload.callsite,
calldata: logicPayload.calldata ? (0, js_moi_utils_1.hexToBytes)(logicPayload.calldata) : null,
};
}
case js_moi_utils_1.OpType.LOGIC_INVOKE:
case js_moi_utils_1.OpType.LOGIC_ENLIST: {
const logicPayload = (0, exports.validateLogicActionPayload)(payload);
return {
logic_id: (0, js_moi_utils_1.trimHexPrefix)(logicPayload.logic_id),
callsite: logicPayload.callsite,
calldata: logicPayload.calldata ? (0, js_moi_utils_1.hexToBytes)(logicPayload.calldata) : null,
};
}
default:
js_moi_utils_1.ErrorUtils.throwError(`Unsupported operation type: ${opType}`, js_moi_utils_1.ErrorCode.UNSUPPORTED_OPERATION);
}
};
/**
* Serializes the payload of a operation based on its type.
* This function polorizes (serializes) the payload using the appropriate schema
* based on the operation type and returns it as a byte array.
*
* @param {OpType} opType - The type of the operation (e.g., ASSET_TRANSFER, ASSET_CREATE).
* @param {OperationPayload} payload - The payload of the operation to be serialized.
* @returns {Uint8Array} - A serialized byte array representing the processed payload.
* @throws {Error} - Throws an error if the operation type is unsupported.
*/
const serializePayload = (opType, payload) => {
const polorizer = new js_polo_1.Polorizer();
const processedPayload = processPayload(opType, payload);
switch (opType) {
case js_moi_utils_1.OpType.PARTICIPANT_CREATE:
polorizer.polorize(processedPayload, js_moi_utils_1.participantCreateSchema);
return polorizer.bytes();
case js_moi_utils_1.OpType.ASSET_TRANSFER:
polorizer.polorize(processedPayload, js_moi_utils_1.assetActionSchema);
return polorizer.bytes();
case js_moi_utils_1.OpType.ASSET_CREATE:
polorizer.polorize(processedPayload, js_moi_utils_1.assetCreateSchema);
return polorizer.bytes();
case js_moi_utils_1.OpType.ASSET_MINT:
case js_moi_utils_1.OpType.ASSET_BURN:
polorizer.polorize(processedPayload, js_moi_utils_1.assetSupplySchema);
return polorizer.bytes();
case js_moi_utils_1.OpType.LOGIC_DEPLOY:
case js_moi_utils_1.OpType.LOGIC_INVOKE:
case js_moi_utils_1.OpType.LOGIC_ENLIST:
polorizer.polorize(processedPayload, js_moi_utils_1.logicSchema);
return polorizer.bytes();
default:
js_moi_utils_1.ErrorUtils.throwError(`Unsupported operation type: ${opType}`, js_moi_utils_1.ErrorCode.UNSUPPORTED_OPERATION);
}
};
exports.serializePayload = serializePayload;
/**
* Processes the interaction object to extract and consolidate asset funds from
* ix_operations and asset funds.
*
* @param {InteractionObject} ixObject - The interaction object containing ix_operations and asset funds.
* @returns {ProcessedIxAssetFund[]} - The consolidated list of processed asset funds.
*/
const processFunds = (ixObject) => {
const assetFunds = new Map();
ixObject.ix_operations.forEach(operation => {
switch (operation.type) {
case js_moi_utils_1.OpType.ASSET_TRANSFER:
case js_moi_utils_1.OpType.ASSET_BURN: {
const payload = operation.payload;
const amount = assetFunds.get(payload.asset_id) ?? 0;
if (typeof payload.amount === "bigint" || typeof amount === "bigint") {
assetFunds.set(payload.asset_id, (0, js_moi_utils_1.toQuantity)(BigInt(payload.amount) + BigInt(amount)));
return;
}
assetFunds.set(payload.asset_id, (0, js_moi_utils_1.toQuantity)(Number(payload.amount) + Number(amount)));
}
}
});
if (ixObject.funds != null) {
// Add additional asset funds to the list if not present
ixObject.funds.forEach(assetFund => {
if (!assetFunds.has(assetFund.asset_id)) {
assetFunds.set(assetFund.asset_id, (0, js_moi_utils_1.toQuantity)(assetFund.amount));
}
});
}
return Array.from(assetFunds, ([asset_id, amount]) => ({ asset_id, amount }));
};
/**
* Processes a series of ix_operations and returns an array of processed participants.
* Each participant is derived based on the type of operation and its associated payload.
*
* @param {IxOperation[]} steps - The array of operation steps to process.
* @returns {IxParticipant[]} - The array of processed participants.
* @throws {Error} - Throws an error if an unsupported operation type is encountered.
*/
const processParticipants = (ixObject) => {
const participants = new Map();
// Add sender to participants
participants.set((0, js_moi_utils_1.trimHexPrefix)(ixObject.sender), {
address: ixObject.sender,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
// Add payer if it exists
if (ixObject.payer != null) {
participants.set((0, js_moi_utils_1.trimHexPrefix)(ixObject.payer), {
address: ixObject.payer,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
}
// Process ix_operations and add participants
ixObject.ix_operations.forEach((operation) => {
switch (operation.type) {
case js_moi_utils_1.OpType.PARTICIPANT_CREATE: {
const participantCreatePayload = operation.payload;
participants.set(participantCreatePayload.address, {
address: participantCreatePayload.address,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
break;
}
case js_moi_utils_1.OpType.ASSET_CREATE:
break;
case js_moi_utils_1.OpType.ASSET_MINT:
case js_moi_utils_1.OpType.ASSET_BURN: {
const assetSupplyPayload = operation.payload;
const address = "0x" + (0, js_moi_utils_1.trimHexPrefix)(assetSupplyPayload.asset_id).slice(8);
participants.set(address, {
address: address,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
break;
}
case js_moi_utils_1.OpType.ASSET_TRANSFER: {
const assetActionPayload = operation.payload;
participants.set(assetActionPayload.beneficiary, {
address: assetActionPayload.beneficiary,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
break;
}
case js_moi_utils_1.OpType.LOGIC_DEPLOY:
break;
case js_moi_utils_1.OpType.LOGIC_ENLIST:
case js_moi_utils_1.OpType.LOGIC_INVOKE: {
const logicPayload = operation.payload;
const address = "0x" + (0, js_moi_utils_1.trimHexPrefix)(logicPayload.logic_id).slice(6);
participants.set(address, {
address: address,
lock_type: js_moi_utils_1.LockType.MUTATE_LOCK
});
break;
}
default:
js_moi_utils_1.ErrorUtils.throwError("Unsupported Ix type", js_moi_utils_1.ErrorCode.INVALID_ARGUMENT);
}
});
// Add additional participants if they exist
if (ixObject.participants != null) {
ixObject.participants.forEach((participant) => {
const address = (0, js_moi_utils_1.trimHexPrefix)(participant.address);
if (!participants.has(address)) {
participants.set(address, {
address: participant.address,
lock_type: participant.lock_type
});
}
});
}
return Array.from(participants.values());
};
/**
* Processes an array of ix_operations by serializing their payloads into byte form
* and returns the processed ix_operations.
*
* @param {IxOperation[]} ix_operations - Operations to process.
* @returns {ProcessedIxOperation[]} - Processed ix_operations with serialized payloads.
* @throws {Error} - If the payload is missing or operation type is unsupported.
*/
const processOperations = (ix_operations) => {
return ix_operations.map(operation => {
if (!operation.payload) {
js_moi_utils_1.ErrorUtils.throwError("Payload is missing!", js_moi_utils_1.ErrorCode.MISSING_ARGUMENT);
}
const payload = (0, exports.serializePayload)(operation.type, operation.payload);
return { ...operation, payload: "0x" + (0, js_moi_utils_1.bytesToHex)(payload) };
});
};
/**
* Processes the interaction object based on its type and returns the processed object.
*
* @param {CallorEstimateIxObject} ixObject - The interaction object to be processed.
* @returns {ProcessedCallorEstimateIxObject} - The processed interaction object.
* @throws {Error} - Throws an error if the interaction type is unsupported or if there is a missing payload.
*/
const processIxObject = (ixObject) => {
try {
return {
nonce: (0, js_moi_utils_1.toQuantity)(ixObject.nonce),
sender: ixObject.sender,
fuel_price: (0, js_moi_utils_1.toQuantity)(ixObject.fuel_price),
fuel_limit: (0, js_moi_utils_1.toQuantity)(ixObject.fuel_limit),
funds: processFunds(ixObject),
ix_operations: processOperations(ixObject.ix_operations),
participants: processParticipants(ixObject)
};
}
catch (err) {
js_moi_utils_1.ErrorUtils.throwError("Failed to process interaction object", js_moi_utils_1.ErrorCode.UNKNOWN_ERROR, { originalError: err });
}
};
exports.processIxObject = processIxObject;
//# sourceMappingURL=interaction.js.map