@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.
182 lines • 6.91 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.hashSolRpcConditions = exports.hashEVMContractConditions = exports.hashAccessControlConditions = exports.hashResourceIdForSigning = exports.hashResourceId = exports.hashUnifiedAccessControlConditions = void 0;
const constants_1 = require("@lit-protocol/constants");
const misc_1 = require("@lit-protocol/misc");
const uint8arrays_1 = require("@lit-protocol/uint8arrays");
const canonicalFormatter_1 = require("./canonicalFormatter");
// Same as:
// const unifiedAccs = [
// {
// conditionType: 'evmBasic',
// contractAddress: '',
// standardContractType: '',
// chain: 'ethereum',
// method: '',
// parameters: [':userAddress'],
// returnValueTest: {
// comparator: '=',
// value: '0xBD4701851e9C9a22f448860A78872A00Da87899e',
// },
// },
// { operator: 'or' },
// {
// conditionType: 'evmBasic',
// contractAddress: '',
// standardContractType: '',
// chain: 'ethereum',
// method: '',
// parameters: [':userAddress'],
// returnValueTest: {
// comparator: '=',
// value: '0x93E47A604BA72899a5f8dF986cF26C97AfdaE2A0',
// },
// },
// ];
// export const generateUnifiedAccsForRLIDelegation = async (
// ethAddresses: string[]
// ): Promise<string> => {
// const unifiedAccs: any[] = [];
// ethAddresses.forEach((address, index) => {
// const condition = {
// conditionType: 'evmBasic',
// contractAddress: '',
// standardContractType: '',
// chain: 'ethereum',
// method: '',
// parameters: [':userAddress'],
// returnValueTest: {
// comparator: '=',
// value: address,
// },
// };
// unifiedAccs.push(condition);
// // Add the operator for all but the last address
// if (index < ethAddresses.length - 1) {
// unifiedAccs.push({ operator: 'or' });
// }
// });
// const hash = await hashUnifiedAccessControlConditions(unifiedAccs);
// return uint8arrayToString(new Uint8Array(hash), 'base16');
// };
/**
*
* Hash the unified access control conditions using SHA-256 in a deterministic way.
*
* @param { UnifiedAccessControlConditions } unifiedAccessControlConditions - The unified access control conditions to hash.
* @returns { Promise<ArrayBuffer> } A promise that resolves to an ArrayBuffer that contains the hash
*/
const hashUnifiedAccessControlConditions = (unifiedAccessControlConditions) => {
(0, misc_1.log)('unifiedAccessControlConditions:', unifiedAccessControlConditions);
const conditions = unifiedAccessControlConditions.map((condition) => {
return (0, canonicalFormatter_1.canonicalUnifiedAccessControlConditionFormatter)(condition);
});
(0, misc_1.log)('conditions:', conditions);
// check if there's any undefined in the conditions
const hasUndefined = conditions.some((c) => c === undefined);
if (hasUndefined) {
throw new constants_1.InvalidAccessControlConditions({
info: {
conditions,
},
}, 'Invalid access control conditions');
}
if (conditions.length === 0) {
throw new constants_1.InvalidAccessControlConditions({
info: {
conditions,
},
}, 'No conditions provided');
}
const toHash = JSON.stringify(conditions);
(0, misc_1.log)('Hashing unified access control conditions: ', toHash);
const encoder = new TextEncoder();
const data = encoder.encode(toHash);
return crypto.subtle.digest('SHA-256', data);
};
exports.hashUnifiedAccessControlConditions = hashUnifiedAccessControlConditions;
/**
*
* Hash resource id
*
* @param { JsonSigningResourceId } resourceId
*
* @returns { Promise<ArrayBuffer> }
*
*/
const hashResourceId = (resourceId) => {
const resId = (0, canonicalFormatter_1.canonicalResourceIdFormatter)(resourceId);
const toHash = JSON.stringify(resId);
const encoder = new TextEncoder();
const data = encoder.encode(toHash);
return crypto.subtle.digest('SHA-256', data);
};
exports.hashResourceId = hashResourceId;
/**
*
* Hash resourceId for signing
*
* @param { JSONSigningResourceId } resourceId
*
* @returns { string } example: "5b36d72f2145af3617e5da2a8a626f9f42e64ed14340622bdfe1a6f0702b9e8d"
*/
const hashResourceIdForSigning = async (resourceId) => {
const hashed = await (0, exports.hashResourceId)(resourceId);
return (0, uint8arrays_1.uint8arrayToString)(new Uint8Array(hashed), 'base16');
};
exports.hashResourceIdForSigning = hashResourceIdForSigning;
/**
*
* Hash access control conditions
*
* @param { AccessControlConditions } accessControlConditions
*
* @returns { Promise<ArrayBuffer> } example: {"data": [83, 176, 31, 130, 12, 130, 232, 109, 126, 76, 216, 4, 184, 166, 246, 134, 130, 34, 30, 235, 125, 247, 111, 212, 62, 231, 119, 200, 202, 171, 86, 40], "type": "Buffer"}
*
*/
const hashAccessControlConditions = (accessControlConditions) => {
const conds = accessControlConditions.map((c) => (0, canonicalFormatter_1.canonicalAccessControlConditionFormatter)(c));
const toHash = JSON.stringify(conds);
(0, misc_1.log)('Hashing access control conditions: ', toHash);
const encoder = new TextEncoder();
const data = encoder.encode(toHash);
return crypto.subtle.digest('SHA-256', data);
};
exports.hashAccessControlConditions = hashAccessControlConditions;
/**
*
* Hash EVM access control conditions
*
* @param { EvmContractConditions } evmContractConditions
*
* @returns { Promise<ArrayBuffer> } {"data": [216, 92, 128, 31, 171, 114, 74, 115, 133, 44, 234, 171, 214, 205, 228, 137, 117, 238, 14, 229, 254, 239, 97, 126, 1, 20, 166, 144, 176, 147, 217, 32], "type": "Buffer"}
*
*/
const hashEVMContractConditions = (evmContractConditions) => {
const conds = evmContractConditions.map((c) => (0, canonicalFormatter_1.canonicalEVMContractConditionFormatter)(c));
const toHash = JSON.stringify(conds);
(0, misc_1.log)('Hashing evm contract conditions: ', toHash);
const encoder = new TextEncoder();
const data = encoder.encode(toHash);
return crypto.subtle.digest('SHA-256', data);
};
exports.hashEVMContractConditions = hashEVMContractConditions;
/**
*
* Hash SOL access control conditions
*
* @param { SolRpcConditions } solRpcConditions
*
* @returns { Promise<ArrayBuffer> }
*
*/
const hashSolRpcConditions = (solRpcConditions) => {
const conds = solRpcConditions.map((c) => (0, canonicalFormatter_1.canonicalSolRpcConditionFormatter)(c));
const toHash = JSON.stringify(conds);
(0, misc_1.log)('Hashing sol rpc conditions: ', toHash);
const encoder = new TextEncoder();
const data = encoder.encode(toHash);
return crypto.subtle.digest('SHA-256', data);
};
exports.hashSolRpcConditions = hashSolRpcConditions;
//# sourceMappingURL=hashing.js.map
;