UNPKG

@lit-protocol/access-control-conditions

Version:

A comprehensive toolkit for managing access control conditions within the Lit Protocol ecosystem. This package provides functionalities for formatting, validating, and securing access control rules.

384 lines (383 loc) 13.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.canonicalResourceIdFormatter = exports.canonicalCosmosConditionFormatter = exports.canonicalEVMContractConditionFormatter = exports.canonicalAccessControlConditionFormatter = exports.canonicalSolRpcConditionFormatter = exports.canonicalUnifiedAccessControlConditionFormatter = void 0; const constants_1 = require("@lit-protocol/constants"); /** ---------- Local Functions ---------- */ /** * * Get operator param * * @param { ConditionItem } cond * @returns { AccsOperatorParams } */ const getOperatorParam = (cond) => { const _cond = cond; return { operator: _cond.operator, }; }; /** * * Canonical ABI Params * * @param { Array<ABIParams> } params * @returns { Array<ABIParams> } */ const canonicalAbiParamss = (params) => { return params.map((param) => ({ name: param.name, type: param.type, })); }; /** * * Canonical Unified Access Control Condition Formatter * * @param { UnifiedAccessControlConditions | ConditionItem } cond * @returns { any[] | AccsOperatorParams | any } */ const canonicalUnifiedAccessControlConditionFormatter = (cond) => { // -- if it's an array if (Array.isArray(cond)) { return cond.map((c) => (0, exports.canonicalUnifiedAccessControlConditionFormatter)(c)); } // -- if there's a `operator` key in the object if ('operator' in cond) { return getOperatorParam(cond); } // -- otherwise if ('returnValueTest' in cond) { const _cond = cond; const _conditionType = _cond.conditionType; switch (_conditionType) { case 'solRpc': return (0, exports.canonicalSolRpcConditionFormatter)(cond, true); case 'evmBasic': return (0, exports.canonicalAccessControlConditionFormatter)(cond); case 'evmContract': return (0, exports.canonicalEVMContractConditionFormatter)(cond); case 'cosmos': return (0, exports.canonicalCosmosConditionFormatter)(cond); default: throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition that is missing or has a wrong "conditionType"'); } } throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition'); }; exports.canonicalUnifiedAccessControlConditionFormatter = canonicalUnifiedAccessControlConditionFormatter; /** * * (SOLANA) Canonical Solana RPC Condition Formatter * * need to return in the exact format below: * but make sure we don't include the optional fields: --- #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SolRpcCondition { pub method: String, pub params: Vec<serde_json::Value>, pub pda_params: Option<Vec<serde_json::Value>>, pub pda_interface: Option<SolPdaInterface>, pub chain: String, pub return_value_test: JsonReturnValueTestV2, } #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SolPdaInterface { pub offset: u64, pub fields: serde_json::Value, } --- * * @param { object } cond * @param { boolean } requireV2Conditions * * @returns { any[] | AccsOperatorParams | AccsSOLV2Params | any } */ const canonicalSolRpcConditionFormatter = (cond, requireV2Conditions = false) => { // -- if is array if (Array.isArray(cond)) { return cond.map((c) => (0, exports.canonicalSolRpcConditionFormatter)(c, requireV2Conditions)); } // -- if there's a `operator` key in the object if ('operator' in cond) { return getOperatorParam(cond); } // -- if it has a return value if ('returnValueTest' in cond) { const { returnValueTest } = cond; const canonicalReturnValueTest = { // @ts-ignore key: returnValueTest.key, comparator: returnValueTest.comparator, value: returnValueTest.value, }; // -- check if this is a sol v1 or v2 condition // -- v1 conditions didn't have any pda params or pda interface or pda key // -- SOL version 1:: return V2 must have params if ('pdaParams' in cond || requireV2Conditions) { const _assumedV2Cond = cond; if (!('pdaInterface' in _assumedV2Cond) || !('pdaKey' in _assumedV2Cond) || !('offset' in _assumedV2Cond.pdaInterface) || !('fields' in _assumedV2Cond.pdaInterface)) { throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'Solana RPC Conditions have changed and there are some new fields you must include in your condition. Check the docs here: https://developer.litprotocol.com/AccessControlConditions/solRpcConditions'); } // -- else const canonicalPdaInterface = { offset: _assumedV2Cond.pdaInterface.offset, fields: _assumedV2Cond.pdaInterface.fields, }; const _solV2Cond = cond; const _requiredParams = { method: _solV2Cond.method, params: _solV2Cond.params, pdaParams: _solV2Cond.pdaParams, pdaInterface: canonicalPdaInterface, pdaKey: _solV2Cond.pdaKey, chain: _solV2Cond.chain, returnValueTest: canonicalReturnValueTest, }; return _requiredParams; // -- SOL version 2:: return default params } else { const _solV1Cond = cond; const _requiredParams = { // @ts-ignore method: _solV1Cond.method, // @ts-ignore params: _solV1Cond.params, chain: _solV1Cond.chain, returnValueTest: canonicalReturnValueTest, }; return _requiredParams; } } // -- else throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition'); }; exports.canonicalSolRpcConditionFormatter = canonicalSolRpcConditionFormatter; /** * * (DEFAULT) Canonical Access Control Condition Formatter * * need to return in the exact format below: --- pub struct JsonAccessControlCondition { pub contract_address: String, pub chain: String, pub standard_contract_type: String, pub method: String, pub parameters: Vec<String>, pub return_value_test: JsonReturnValueTest, } --- * * @param { AccsDefaultParams | AccsOperatorParams | AccessControlConditions } cond * * @returns { any[] | AccsOperatorParams | AccsDefaultParams | any } */ const canonicalAccessControlConditionFormatter = (cond) => { // -- if it's an array if (Array.isArray(cond)) { return cond.map((c) => (0, exports.canonicalAccessControlConditionFormatter)(c)); } // -- if there's a `operator` key in the object if ('operator' in cond) { return getOperatorParam(cond); } if ('returnValueTest' in cond) { const _cond = cond; const _return = { contractAddress: _cond.contractAddress, chain: _cond.chain, standardContractType: _cond.standardContractType, method: _cond.method, parameters: _cond.parameters, returnValueTest: { comparator: _cond.returnValueTest.comparator, value: _cond.returnValueTest.value, }, }; return _return; } throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition'); }; exports.canonicalAccessControlConditionFormatter = canonicalAccessControlConditionFormatter; /** * * (EVM) Canonical EVM Contract Condition Formatter * * need to return in the exact format below: --- pub struct JsonAccessControlCondition { pub contract_address: String, pub chain: String, pub standard_contract_type: String, pub method: String, pub parameters: Vec<String>, pub return_value_test: JsonReturnValueTest, } --- * * @param { AccsEVMParams | AccsOperatorParams | EvmContractConditions } cond * * @returns */ const canonicalEVMContractConditionFormatter = (cond) => { // -- if it's an array if (Array.isArray(cond)) { return cond.map((c) => (0, exports.canonicalEVMContractConditionFormatter)(c)); } // -- if there's a `operator` key in the object if ('operator' in cond) { const _cond = cond; return { operator: _cond.operator, }; } if ('returnValueTest' in cond) { /* abi needs to match: pub name: String, /// Function input. pub inputs: Vec<Param>, /// Function output. pub outputs: Vec<Param>, #[deprecated(note = "The constant attribute was removed in Solidity 0.5.0 and has been \ replaced with stateMutability. If parsing a JSON AST created with \ this version or later this value will always be false, which may be wrong.")] /// Constant function. #[cfg_attr(feature = "full-serde", serde(default))] pub constant: bool, /// Whether the function reads or modifies blockchain state #[cfg_attr(feature = "full-serde", serde(rename = "stateMutability", default))] pub state_mutability: StateMutability, */ const evmCond = cond; const { functionAbi, returnValueTest } = evmCond; const canonicalAbi = { name: functionAbi.name, inputs: canonicalAbiParamss(functionAbi.inputs), outputs: canonicalAbiParamss(functionAbi.outputs), constant: typeof functionAbi.constant === 'undefined' ? false : functionAbi.constant, stateMutability: functionAbi.stateMutability, }; const canonicalReturnValueTest = { key: returnValueTest.key, comparator: returnValueTest.comparator, value: returnValueTest.value, }; const _return = { contractAddress: evmCond.contractAddress, functionName: evmCond.functionName, functionParams: evmCond.functionParams, functionAbi: canonicalAbi, chain: evmCond.chain, returnValueTest: canonicalReturnValueTest, }; return _return; } throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition'); }; exports.canonicalEVMContractConditionFormatter = canonicalEVMContractConditionFormatter; /** * * (COSMOS) Canonical Condition Formmater for Cosmos * * need to return in the exact format below: --- pub struct CosmosCondition { pub path: String, pub chain: String, pub return_value_test: JsonReturnValueTestV2, } --- * * * @param { ConditionItem } cond * @returns */ const canonicalCosmosConditionFormatter = (cond) => { // -- if it's an array if (Array.isArray(cond)) { return cond.map((c) => (0, exports.canonicalCosmosConditionFormatter)(c)); } // -- if there's a `operator` key in the object if ('operator' in cond) { const _cond = cond; return { operator: _cond.operator, }; } if ('returnValueTest' in cond) { const _cosmosCond = cond; const { returnValueTest } = _cosmosCond; const canonicalReturnValueTest = { key: returnValueTest.key, comparator: returnValueTest.comparator, value: returnValueTest.value, }; return { path: _cosmosCond.path, chain: _cosmosCond.chain, method: _cosmosCond?.method, parameters: _cosmosCond?.parameters, returnValueTest: canonicalReturnValueTest, }; } throw new constants_1.InvalidAccessControlConditions({ info: { cond, }, }, 'You passed an invalid access control condition'); }; exports.canonicalCosmosConditionFormatter = canonicalCosmosConditionFormatter; /** * * Canonical ResourceId Formatter returning JSON signing resource id * * @param { JsonSigningResourceId } resId * * @returns { JsonSigningResourceId } * */ const canonicalResourceIdFormatter = (resId) => { // need to return in the exact format below: return { baseUrl: resId.baseUrl, path: resId.path, orgId: resId.orgId, role: resId.role, extraData: resId.extraData, }; }; exports.canonicalResourceIdFormatter = canonicalResourceIdFormatter; //# sourceMappingURL=canonicalFormatter.js.map