@metamask-previews/gator-permissions-controller 2.0.0-preview-384cfdfef → 2.0.0-preview-15dd7d63f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,6 +58,9 @@ function validateAndDecodeData(caveats, enforcers) {
58
58
  const periodDuration = (0, utils_1.hexToNumber)(periodDurationRaw);
59
59
  const periodAmountBigInt = (0, utils_1.hexToBigInt)(periodAmount);
60
60
  const startTime = (0, utils_1.hexToNumber)(startTimeRaw);
61
+ if (!(0, utils_1.isHexAddress)(tokenAddress)) {
62
+ throw new Error('Invalid erc20-token-periodic terms: tokenAddress must be a valid hex string');
63
+ }
61
64
  if (periodAmountBigInt === 0n) {
62
65
  throw new Error('Invalid erc20-token-periodic terms: periodAmount must be a positive number');
63
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"erc20TokenPeriodic.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenPeriodic.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAE3D,iEAA0D;AAO1D,wCAKkB;AAElB;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,IAAA,uCAAkB,EAAC;QACxB,cAAc,EAAE,sBAAsB;QACtC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,qBAAqB;YACrB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAxBD,gEAwBC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAE9D,MAAM,aAAa,GAAG,IAAA,0BAAkB,EAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,qBAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,qBAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,qBAAqB;KAChC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,oBAAoB;IAE3D,IAAI,IAAA,qBAAa,EAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,GACjE,IAAA,gBAAQ,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-periodic permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-periodic permission rule.\n */\nexport function makeErc20TokenPeriodicRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-periodic',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20PeriodicEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-periodic permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20PeriodicEnforcer - Address of the ERC20PeriodicEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded periodic terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20PeriodicEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20PeriodicEnforcer, valueLteEnforcer } = enforcers;\n\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20PeriodicEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 116; // 20 + 32 + 32 + 32\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-periodic terms: expected 116 bytes');\n }\n\n const [tokenAddress, periodAmount, periodDurationRaw, startTimeRaw] =\n splitHex(terms, [20, 32, 32, 32]);\n const periodDuration = hexToNumber(periodDurationRaw);\n const periodAmountBigInt = hexToBigInt(periodAmount);\n const startTime = hexToNumber(startTimeRaw);\n\n if (periodAmountBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodAmount must be a positive number',\n );\n }\n\n if (periodDuration === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodDuration must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: startTime must be a positive number',\n );\n }\n\n return { tokenAddress, periodAmount, periodDuration, startTime };\n}\n"]}
1
+ {"version":3,"file":"erc20TokenPeriodic.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenPeriodic.ts"],"names":[],"mappings":";;;AAAA,2CAAyE;AAEzE,iEAA0D;AAO1D,wCAKkB;AAElB;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,IAAA,uCAAkB,EAAC;QACxB,cAAc,EAAE,sBAAsB;QACtC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,qBAAqB;YACrB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAxBD,gEAwBC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAE9D,MAAM,aAAa,GAAG,IAAA,0BAAkB,EAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,qBAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,qBAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,qBAAqB;KAChC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,oBAAoB;IAE3D,IAAI,IAAA,qBAAa,EAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,GACjE,IAAA,gBAAQ,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC,IAAA,oBAAY,EAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber, isHexAddress } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-periodic permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-periodic permission rule.\n */\nexport function makeErc20TokenPeriodicRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-periodic',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20PeriodicEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-periodic permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20PeriodicEnforcer - Address of the ERC20PeriodicEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded periodic terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20PeriodicEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20PeriodicEnforcer, valueLteEnforcer } = enforcers;\n\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20PeriodicEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 116; // 20 + 32 + 32 + 32\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-periodic terms: expected 116 bytes');\n }\n\n const [tokenAddress, periodAmount, periodDurationRaw, startTimeRaw] =\n splitHex(terms, [20, 32, 32, 32]);\n const periodDuration = hexToNumber(periodDurationRaw);\n const periodAmountBigInt = hexToBigInt(periodAmount);\n const startTime = hexToNumber(startTimeRaw);\n\n if (!isHexAddress(tokenAddress)) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: tokenAddress must be a valid hex string',\n );\n }\n\n if (periodAmountBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodAmount must be a positive number',\n );\n }\n\n if (periodDuration === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodDuration must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: startTime must be a positive number',\n );\n }\n\n return { tokenAddress, periodAmount, periodDuration, startTime };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { hexToBigInt, hexToNumber } from "@metamask/utils";
1
+ import { hexToBigInt, hexToNumber, isHexAddress } from "@metamask/utils";
2
2
  import { makePermissionRule } from "./makePermissionRule.mjs";
3
3
  import { getByteLength, getTermsByEnforcer, splitHex, ZERO_32_BYTES } from "../utils.mjs";
4
4
  /**
@@ -54,6 +54,9 @@ function validateAndDecodeData(caveats, enforcers) {
54
54
  const periodDuration = hexToNumber(periodDurationRaw);
55
55
  const periodAmountBigInt = hexToBigInt(periodAmount);
56
56
  const startTime = hexToNumber(startTimeRaw);
57
+ if (!isHexAddress(tokenAddress)) {
58
+ throw new Error('Invalid erc20-token-periodic terms: tokenAddress must be a valid hex string');
59
+ }
57
60
  if (periodAmountBigInt === 0n) {
58
61
  throw new Error('Invalid erc20-token-periodic terms: periodAmount must be a positive number');
59
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"erc20TokenPeriodic.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenPeriodic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB;AAE3D,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAO1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACd,qBAAiB;AAElB;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,kBAAkB,CAAC;QACxB,cAAc,EAAE,sBAAsB;QACtC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,qBAAqB;YACrB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAE9D,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,qBAAqB;KAChC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,oBAAoB;IAE3D,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,GACjE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-periodic permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-periodic permission rule.\n */\nexport function makeErc20TokenPeriodicRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-periodic',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20PeriodicEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-periodic permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20PeriodicEnforcer - Address of the ERC20PeriodicEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded periodic terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20PeriodicEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20PeriodicEnforcer, valueLteEnforcer } = enforcers;\n\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20PeriodicEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 116; // 20 + 32 + 32 + 32\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-periodic terms: expected 116 bytes');\n }\n\n const [tokenAddress, periodAmount, periodDurationRaw, startTimeRaw] =\n splitHex(terms, [20, 32, 32, 32]);\n const periodDuration = hexToNumber(periodDurationRaw);\n const periodAmountBigInt = hexToBigInt(periodAmount);\n const startTime = hexToNumber(startTimeRaw);\n\n if (periodAmountBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodAmount must be a positive number',\n );\n }\n\n if (periodDuration === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodDuration must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: startTime must be a positive number',\n );\n }\n\n return { tokenAddress, periodAmount, periodDuration, startTime };\n}\n"]}
1
+ {"version":3,"file":"erc20TokenPeriodic.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenPeriodic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,wBAAwB;AAEzE,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAO1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACd,qBAAiB;AAElB;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,kBAAkB,CAAC;QACxB,cAAc,EAAE,sBAAsB;QACtC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,qBAAqB;YACrB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAE9D,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IACH,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,qBAAqB;KAChC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,oBAAoB;IAE3D,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,GACjE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber, isHexAddress } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-periodic permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-periodic permission rule.\n */\nexport function makeErc20TokenPeriodicRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-periodic',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20PeriodicEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20PeriodicEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-periodic permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20PeriodicEnforcer - Address of the ERC20PeriodicEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded periodic terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20PeriodicEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20PeriodicEnforcer, valueLteEnforcer } = enforcers;\n\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20PeriodicEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 116; // 20 + 32 + 32 + 32\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-periodic terms: expected 116 bytes');\n }\n\n const [tokenAddress, periodAmount, periodDurationRaw, startTimeRaw] =\n splitHex(terms, [20, 32, 32, 32]);\n const periodDuration = hexToNumber(periodDurationRaw);\n const periodAmountBigInt = hexToBigInt(periodAmount);\n const startTime = hexToNumber(startTimeRaw);\n\n if (!isHexAddress(tokenAddress)) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: tokenAddress must be a valid hex string',\n );\n }\n\n if (periodAmountBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodAmount must be a positive number',\n );\n }\n\n if (periodDuration === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: periodDuration must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-periodic terms: startTime must be a positive number',\n );\n }\n\n return { tokenAddress, periodAmount, periodDuration, startTime };\n}\n"]}
@@ -59,6 +59,9 @@ function validateAndDecodeData(caveats, enforcers) {
59
59
  const initialAmountBigInt = (0, utils_1.hexToBigInt)(initialAmount);
60
60
  const maxAmountBigInt = (0, utils_1.hexToBigInt)(maxAmount);
61
61
  const amountPerSecondBigInt = (0, utils_1.hexToBigInt)(amountPerSecond);
62
+ if (!(0, utils_1.isHexAddress)(tokenAddress)) {
63
+ throw new Error('Invalid erc20-token-stream terms: tokenAddress must be a valid hex string');
64
+ }
62
65
  if (maxAmountBigInt <= initialAmountBigInt) {
63
66
  throw new Error('Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount');
64
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"erc20TokenStream.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenStream.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAE3D,iEAA0D;AAO1D,wCAKkB;AAElB;;;;;GAKG;AACH,SAAgB,wBAAwB,CACtC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,IAAA,uCAAkB,EAAC;QACxB,cAAc,EAAE,oBAAoB;QACpC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,sBAAsB;YACtB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAxBD,4DAwBC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,0BAAkB,EAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,IAAI,aAAa,KAAK,qBAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,qBAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC;IAEtC,IAAI,IAAA,qBAAa,EAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CACJ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,YAAY,EACb,GAAG,IAAA,gBAAQ,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,mBAAmB,GAAG,IAAA,mBAAW,EAAC,aAAa,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,IAAA,mBAAW,EAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY;QACZ,aAAa;QACb,SAAS;QACT,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-stream permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-stream permission rule.\n */\nexport function makeErc20TokenStreamRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20StreamingEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-stream',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20StreamingEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20StreamingEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-stream permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20StreamingEnforcer - Address of the ERC20StreamingEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded stream terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20StreamingEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20StreamingEnforcer, valueLteEnforcer } = enforcers;\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20StreamingEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 148;\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-stream terms: expected 148 bytes');\n }\n\n const [\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTimeRaw,\n ] = splitHex(terms, [20, 32, 32, 32, 32]);\n\n const startTime = hexToNumber(startTimeRaw);\n const initialAmountBigInt = hexToBigInt(initialAmount);\n const maxAmountBigInt = hexToBigInt(maxAmount);\n const amountPerSecondBigInt = hexToBigInt(amountPerSecond);\n\n if (maxAmountBigInt <= initialAmountBigInt) {\n throw new Error(\n 'Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount',\n );\n }\n\n if (amountPerSecondBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-stream terms: amountPerSecond must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-stream terms: startTime must be a positive number',\n );\n }\n\n return {\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n };\n}\n"]}
1
+ {"version":3,"file":"erc20TokenStream.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenStream.ts"],"names":[],"mappings":";;;AAAA,2CAAyE;AAEzE,iEAA0D;AAO1D,wCAKkB;AAElB;;;;;GAKG;AACH,SAAgB,wBAAwB,CACtC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,IAAA,uCAAkB,EAAC;QACxB,cAAc,EAAE,oBAAoB;QACpC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,sBAAsB;YACtB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAxBD,4DAwBC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,0BAAkB,EAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,IAAI,aAAa,KAAK,qBAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,qBAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC;IAEtC,IAAI,IAAA,qBAAa,EAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CACJ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,YAAY,EACb,GAAG,IAAA,gBAAQ,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,mBAAmB,GAAG,IAAA,mBAAW,EAAC,aAAa,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,IAAA,mBAAW,EAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAA,oBAAY,EAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY;QACZ,aAAa;QACb,SAAS;QACT,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber, isHexAddress } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-stream permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-stream permission rule.\n */\nexport function makeErc20TokenStreamRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20StreamingEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-stream',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20StreamingEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20StreamingEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-stream permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20StreamingEnforcer - Address of the ERC20StreamingEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded stream terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20StreamingEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20StreamingEnforcer, valueLteEnforcer } = enforcers;\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20StreamingEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 148;\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-stream terms: expected 148 bytes');\n }\n\n const [\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTimeRaw,\n ] = splitHex(terms, [20, 32, 32, 32, 32]);\n\n const startTime = hexToNumber(startTimeRaw);\n const initialAmountBigInt = hexToBigInt(initialAmount);\n const maxAmountBigInt = hexToBigInt(maxAmount);\n const amountPerSecondBigInt = hexToBigInt(amountPerSecond);\n\n if (!isHexAddress(tokenAddress)) {\n throw new Error(\n 'Invalid erc20-token-stream terms: tokenAddress must be a valid hex string',\n );\n }\n\n if (maxAmountBigInt <= initialAmountBigInt) {\n throw new Error(\n 'Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount',\n );\n }\n\n if (amountPerSecondBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-stream terms: amountPerSecond must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-stream terms: startTime must be a positive number',\n );\n }\n\n return {\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { hexToBigInt, hexToNumber } from "@metamask/utils";
1
+ import { hexToBigInt, hexToNumber, isHexAddress } from "@metamask/utils";
2
2
  import { makePermissionRule } from "./makePermissionRule.mjs";
3
3
  import { getByteLength, getTermsByEnforcer, splitHex, ZERO_32_BYTES } from "../utils.mjs";
4
4
  /**
@@ -55,6 +55,9 @@ function validateAndDecodeData(caveats, enforcers) {
55
55
  const initialAmountBigInt = hexToBigInt(initialAmount);
56
56
  const maxAmountBigInt = hexToBigInt(maxAmount);
57
57
  const amountPerSecondBigInt = hexToBigInt(amountPerSecond);
58
+ if (!isHexAddress(tokenAddress)) {
59
+ throw new Error('Invalid erc20-token-stream terms: tokenAddress must be a valid hex string');
60
+ }
58
61
  if (maxAmountBigInt <= initialAmountBigInt) {
59
62
  throw new Error('Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount');
60
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"erc20TokenStream.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB;AAE3D,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAO1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACd,qBAAiB;AAElB;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,kBAAkB,CAAC;QACxB,cAAc,EAAE,oBAAoB;QACpC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,sBAAsB;YACtB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC;IAEtC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CACJ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,YAAY,EACb,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,mBAAmB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY;QACZ,aAAa;QACb,SAAS;QACT,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-stream permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-stream permission rule.\n */\nexport function makeErc20TokenStreamRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20StreamingEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-stream',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20StreamingEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20StreamingEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-stream permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20StreamingEnforcer - Address of the ERC20StreamingEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded stream terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20StreamingEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20StreamingEnforcer, valueLteEnforcer } = enforcers;\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20StreamingEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 148;\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-stream terms: expected 148 bytes');\n }\n\n const [\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTimeRaw,\n ] = splitHex(terms, [20, 32, 32, 32, 32]);\n\n const startTime = hexToNumber(startTimeRaw);\n const initialAmountBigInt = hexToBigInt(initialAmount);\n const maxAmountBigInt = hexToBigInt(maxAmount);\n const amountPerSecondBigInt = hexToBigInt(amountPerSecond);\n\n if (maxAmountBigInt <= initialAmountBigInt) {\n throw new Error(\n 'Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount',\n );\n }\n\n if (amountPerSecondBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-stream terms: amountPerSecond must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-stream terms: startTime must be a positive number',\n );\n }\n\n return {\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n };\n}\n"]}
1
+ {"version":3,"file":"erc20TokenStream.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/erc20TokenStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,wBAAwB;AAEzE,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAO1D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACd,qBAAiB;AAElB;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAqC;IAErC,MAAM,EACJ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GACd,GAAG,SAAS,CAAC;IACd,OAAO,kBAAkB,CAAC;QACxB,cAAc,EAAE,oBAAoB;QACpC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;QACtC,iBAAiB;QACjB,iBAAiB,EAAE;YACjB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrB,CAAC,aAAa,CAAC,EAAE,CAAC;SACnB;QACD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,qBAAqB,CAAC,OAAO,EAAE;YAC7B,sBAAsB;YACtB,gBAAgB;SACjB,CAAC;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,SAGC;IAED,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACvC,OAAO;QACP,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO;QACP,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,GAAG,CAAC;IAEtC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CACJ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,YAAY,EACb,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,mBAAmB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY;QACZ,aAAa;QACb,SAAS;QACT,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC","sourcesContent":["import { hexToBigInt, hexToNumber, isHexAddress } from '@metamask/utils';\n\nimport { makePermissionRule } from './makePermissionRule';\nimport type {\n ChecksumCaveat,\n ChecksumEnforcersByChainId,\n DecodedPermission,\n PermissionRule,\n} from '../types';\nimport {\n getByteLength,\n getTermsByEnforcer,\n splitHex,\n ZERO_32_BYTES,\n} from '../utils';\n\n/**\n * Creates the erc20-token-stream permission rule.\n *\n * @param enforcers - Checksummed enforcer addresses for the chain.\n * @returns The erc20-token-stream permission rule.\n */\nexport function makeErc20TokenStreamRule(\n enforcers: ChecksumEnforcersByChainId,\n): PermissionRule {\n const {\n timestampEnforcer,\n erc20StreamingEnforcer,\n valueLteEnforcer,\n nonceEnforcer,\n } = enforcers;\n return makePermissionRule({\n permissionType: 'erc20-token-stream',\n optionalEnforcers: [timestampEnforcer],\n timestampEnforcer,\n requiredEnforcers: {\n [erc20StreamingEnforcer]: 1,\n [valueLteEnforcer]: 1,\n [nonceEnforcer]: 1,\n },\n validateAndDecodeData: (caveats) =>\n validateAndDecodeData(caveats, {\n erc20StreamingEnforcer,\n valueLteEnforcer,\n }),\n });\n}\n\n/**\n * Decodes erc20-token-stream permission data from caveats; throws on invalid.\n *\n * @param caveats - Caveats from the permission context (checksummed).\n * @param enforcers - Addresses of the enforcers.\n * @param enforcers.erc20StreamingEnforcer - Address of the ERC20StreamingEnforcer.\n * @param enforcers.valueLteEnforcer - Address of the ValueLteEnforcer.\n * @returns Decoded stream terms.\n */\nfunction validateAndDecodeData(\n caveats: ChecksumCaveat[],\n enforcers: Pick<\n ChecksumEnforcersByChainId,\n 'erc20StreamingEnforcer' | 'valueLteEnforcer'\n >,\n): DecodedPermission['permission']['data'] {\n const { erc20StreamingEnforcer, valueLteEnforcer } = enforcers;\n const valueLteTerms = getTermsByEnforcer({\n caveats,\n enforcer: valueLteEnforcer,\n });\n\n if (valueLteTerms !== ZERO_32_BYTES) {\n throw new Error(`Invalid value-lte terms: must be ${ZERO_32_BYTES}`);\n }\n\n const terms = getTermsByEnforcer({\n caveats,\n enforcer: erc20StreamingEnforcer,\n });\n\n const EXPECTED_TERMS_BYTELENGTH = 148;\n\n if (getByteLength(terms) !== EXPECTED_TERMS_BYTELENGTH) {\n throw new Error('Invalid erc20-token-stream terms: expected 148 bytes');\n }\n\n const [\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTimeRaw,\n ] = splitHex(terms, [20, 32, 32, 32, 32]);\n\n const startTime = hexToNumber(startTimeRaw);\n const initialAmountBigInt = hexToBigInt(initialAmount);\n const maxAmountBigInt = hexToBigInt(maxAmount);\n const amountPerSecondBigInt = hexToBigInt(amountPerSecond);\n\n if (!isHexAddress(tokenAddress)) {\n throw new Error(\n 'Invalid erc20-token-stream terms: tokenAddress must be a valid hex string',\n );\n }\n\n if (maxAmountBigInt <= initialAmountBigInt) {\n throw new Error(\n 'Invalid erc20-token-stream terms: maxAmount must be greater than initialAmount',\n );\n }\n\n if (amountPerSecondBigInt === 0n) {\n throw new Error(\n 'Invalid erc20-token-stream terms: amountPerSecond must be a positive number',\n );\n }\n\n if (startTime === 0) {\n throw new Error(\n 'Invalid erc20-token-stream terms: startTime must be a positive number',\n );\n }\n\n return {\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n };\n}\n"]}
@@ -32,12 +32,6 @@ function makePermissionRule({ optionalEnforcers, timestampEnforcer, permissionTy
32
32
  enforcer: (0, utils_1.getChecksumAddress)(caveat.enforcer),
33
33
  }));
34
34
  try {
35
- const invalidTerms = checksumCaveats.filter(
36
- // isStrictHexString rejects '0x' which is a valid terms value
37
- ({ terms }) => terms !== '0x' && !(0, utils_1.isStrictHexString)(terms));
38
- if (invalidTerms.length > 0) {
39
- throw new Error('Invalid terms: must be a hex string');
40
- }
41
35
  let expiry = null;
42
36
  const expiryTerms = (0, utils_2.getTermsByEnforcer)({
43
37
  caveats: checksumCaveats,
@@ -1 +1 @@
1
- {"version":3,"file":"makePermissionRule.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":";;;AACA,2CAAwE;AAUxE,wCAKkB;AAElB;;;;;;;;;;;GAWG;AACH,SAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAStB;IACC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CACd,CAAC;IAEtB,OAAO;QACL,cAAc;QACd,iBAAiB,EAAE,oBAAoB;QACvC,iBAAiB,EAAE,oBAAoB;QACvC,oBAAoB,CAAC,eAAsB;YACzC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC5B,IAAA,iCAAyB,EAAC,eAAe,CAAC,CAAC;YAE7C,OAAO,IAAA,0BAAkB,EACvB,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;QACJ,CAAC;QACD,2BAA2B,CACzB,OAAsB;YAEtB,MAAM,eAAe,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjE,GAAG,MAAM;gBACT,QAAQ,EAAE,IAAA,0BAAkB,EAAC,MAAM,CAAC,QAAQ,CAAC;aAC9C,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM;gBACzC,8DAA8D;gBAC9D,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,CAC3D,CAAC;gBAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;gBAED,IAAI,MAAM,GAAkB,IAAI,CAAC;gBAEjC,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;oBACrC,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;gBAEH,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,GAAG,IAAA,oCAA4B,EAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAoB,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAxED,gDAwEC","sourcesContent":["import type { Caveat } from '@metamask/delegation-core';\nimport { getChecksumAddress, isStrictHexString } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n ChecksumCaveat,\n DecodedPermission,\n PermissionRule,\n PermissionType,\n ValidateAndDecodeResult,\n} from '../types';\nimport {\n buildEnforcerCountsAndSet,\n enforcersMatchRule,\n extractExpiryFromCaveatTerms,\n getTermsByEnforcer,\n} from '../utils';\n\n/**\n * Creates a single permission rule with the given type, enforcer sets, and\n * decode/validate callbacks.\n *\n * @param args - The arguments to this function.\n * @param args.optionalEnforcers - Enforcer addresses that may appear in addition to required.\n * @param args.timestampEnforcer - Address of the TimestampEnforcer used to extract expiry.\n * @param args.permissionType - The permission type identifier.\n * @param args.requiredEnforcers - Map of required enforcer address to required count.\n * @param args.validateAndDecodeData - Callback to decode caveats into permission data; may throw.\n * @returns A permission rule with caveatAddressesMatch and validateAndDecodePermission.\n */\nexport function makePermissionRule({\n optionalEnforcers,\n timestampEnforcer,\n permissionType,\n requiredEnforcers,\n validateAndDecodeData,\n}: {\n optionalEnforcers: Hex[];\n timestampEnforcer: Hex;\n permissionType: PermissionType;\n requiredEnforcers: Record<Hex, number>;\n validateAndDecodeData: (\n caveats: ChecksumCaveat[],\n ) => DecodedPermission['permission']['data'];\n}): PermissionRule {\n const optionalEnforcersSet = new Set(optionalEnforcers);\n const requiredEnforcersMap = new Map(\n Object.entries(requiredEnforcers),\n ) as Map<Hex, number>;\n\n return {\n permissionType,\n requiredEnforcers: requiredEnforcersMap,\n optionalEnforcers: optionalEnforcersSet,\n caveatAddressesMatch(caveatAddresses: Hex[]): boolean {\n const { counts, enforcersSet } =\n buildEnforcerCountsAndSet(caveatAddresses);\n\n return enforcersMatchRule(\n counts,\n enforcersSet,\n requiredEnforcersMap,\n optionalEnforcersSet,\n );\n },\n validateAndDecodePermission(\n caveats: Caveat<Hex>[],\n ): ValidateAndDecodeResult {\n const checksumCaveats: ChecksumCaveat[] = caveats.map((caveat) => ({\n ...caveat,\n enforcer: getChecksumAddress(caveat.enforcer),\n }));\n try {\n const invalidTerms = checksumCaveats.filter(\n // isStrictHexString rejects '0x' which is a valid terms value\n ({ terms }) => terms !== '0x' && !isStrictHexString(terms),\n );\n\n if (invalidTerms.length > 0) {\n throw new Error('Invalid terms: must be a hex string');\n }\n\n let expiry: number | null = null;\n\n const expiryTerms = getTermsByEnforcer({\n caveats: checksumCaveats,\n enforcer: timestampEnforcer,\n throwIfNotFound: false,\n });\n\n if (expiryTerms) {\n expiry = extractExpiryFromCaveatTerms(expiryTerms);\n }\n\n const data = validateAndDecodeData(checksumCaveats);\n\n return { isValid: true, expiry, data };\n } catch (caughtError) {\n return { isValid: false, error: caughtError as Error };\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"makePermissionRule.cjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":";;;AACA,2CAAqD;AAUrD,wCAKkB;AAElB;;;;;;;;;;;GAWG;AACH,SAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAStB;IACC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CACd,CAAC;IAEtB,OAAO;QACL,cAAc;QACd,iBAAiB,EAAE,oBAAoB;QACvC,iBAAiB,EAAE,oBAAoB;QACvC,oBAAoB,CAAC,eAAsB;YACzC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC5B,IAAA,iCAAyB,EAAC,eAAe,CAAC,CAAC;YAE7C,OAAO,IAAA,0BAAkB,EACvB,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;QACJ,CAAC;QACD,2BAA2B,CACzB,OAAsB;YAEtB,MAAM,eAAe,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjE,GAAG,MAAM;gBACT,QAAQ,EAAE,IAAA,0BAAkB,EAAC,MAAM,CAAC,QAAQ,CAAC;aAC9C,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC;gBACH,IAAI,MAAM,GAAkB,IAAI,CAAC;gBAEjC,MAAM,WAAW,GAAG,IAAA,0BAAkB,EAAC;oBACrC,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;gBAEH,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,GAAG,IAAA,oCAA4B,EAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAoB,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AA/DD,gDA+DC","sourcesContent":["import type { Caveat } from '@metamask/delegation-core';\nimport { getChecksumAddress } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n ChecksumCaveat,\n DecodedPermission,\n PermissionRule,\n PermissionType,\n ValidateAndDecodeResult,\n} from '../types';\nimport {\n buildEnforcerCountsAndSet,\n enforcersMatchRule,\n extractExpiryFromCaveatTerms,\n getTermsByEnforcer,\n} from '../utils';\n\n/**\n * Creates a single permission rule with the given type, enforcer sets, and\n * decode/validate callbacks.\n *\n * @param args - The arguments to this function.\n * @param args.optionalEnforcers - Enforcer addresses that may appear in addition to required.\n * @param args.timestampEnforcer - Address of the TimestampEnforcer used to extract expiry.\n * @param args.permissionType - The permission type identifier.\n * @param args.requiredEnforcers - Map of required enforcer address to required count.\n * @param args.validateAndDecodeData - Callback to decode caveats into permission data; may throw.\n * @returns A permission rule with caveatAddressesMatch and validateAndDecodePermission.\n */\nexport function makePermissionRule({\n optionalEnforcers,\n timestampEnforcer,\n permissionType,\n requiredEnforcers,\n validateAndDecodeData,\n}: {\n optionalEnforcers: Hex[];\n timestampEnforcer: Hex;\n permissionType: PermissionType;\n requiredEnforcers: Record<Hex, number>;\n validateAndDecodeData: (\n caveats: ChecksumCaveat[],\n ) => DecodedPermission['permission']['data'];\n}): PermissionRule {\n const optionalEnforcersSet = new Set(optionalEnforcers);\n const requiredEnforcersMap = new Map(\n Object.entries(requiredEnforcers),\n ) as Map<Hex, number>;\n\n return {\n permissionType,\n requiredEnforcers: requiredEnforcersMap,\n optionalEnforcers: optionalEnforcersSet,\n caveatAddressesMatch(caveatAddresses: Hex[]): boolean {\n const { counts, enforcersSet } =\n buildEnforcerCountsAndSet(caveatAddresses);\n\n return enforcersMatchRule(\n counts,\n enforcersSet,\n requiredEnforcersMap,\n optionalEnforcersSet,\n );\n },\n validateAndDecodePermission(\n caveats: Caveat<Hex>[],\n ): ValidateAndDecodeResult {\n const checksumCaveats: ChecksumCaveat[] = caveats.map((caveat) => ({\n ...caveat,\n enforcer: getChecksumAddress(caveat.enforcer),\n }));\n try {\n let expiry: number | null = null;\n\n const expiryTerms = getTermsByEnforcer({\n caveats: checksumCaveats,\n enforcer: timestampEnforcer,\n throwIfNotFound: false,\n });\n\n if (expiryTerms) {\n expiry = extractExpiryFromCaveatTerms(expiryTerms);\n }\n\n const data = validateAndDecodeData(checksumCaveats);\n\n return { isValid: true, expiry, data };\n } catch (caughtError) {\n return { isValid: false, error: caughtError as Error };\n }\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"makePermissionRule.d.cts","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EAEf,qBAAiB;AAQlB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACtB,EAAE;IACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,iBAAiB,EAAE,GAAG,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,EAAE,CACrB,OAAO,EAAE,cAAc,EAAE,KACtB,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;CAC9C,GAAG,cAAc,CA0DjB"}
1
+ {"version":3,"file":"makePermissionRule.d.cts","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EAEf,qBAAiB;AAQlB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACtB,EAAE;IACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,iBAAiB,EAAE,GAAG,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,EAAE,CACrB,OAAO,EAAE,cAAc,EAAE,KACtB,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;CAC9C,GAAG,cAAc,CAiDjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"makePermissionRule.d.mts","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EAEf,qBAAiB;AAQlB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACtB,EAAE;IACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,iBAAiB,EAAE,GAAG,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,EAAE,CACrB,OAAO,EAAE,cAAc,EAAE,KACtB,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;CAC9C,GAAG,cAAc,CA0DjB"}
1
+ {"version":3,"file":"makePermissionRule.d.mts","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EAEf,qBAAiB;AAQlB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GACtB,EAAE;IACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;IACzB,iBAAiB,EAAE,GAAG,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,EAAE,CACrB,OAAO,EAAE,cAAc,EAAE,KACtB,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;CAC9C,GAAG,cAAc,CAiDjB"}
@@ -1,4 +1,4 @@
1
- import { getChecksumAddress, isStrictHexString } from "@metamask/utils";
1
+ import { getChecksumAddress } from "@metamask/utils";
2
2
  import { buildEnforcerCountsAndSet, enforcersMatchRule, extractExpiryFromCaveatTerms, getTermsByEnforcer } from "../utils.mjs";
3
3
  /**
4
4
  * Creates a single permission rule with the given type, enforcer sets, and
@@ -29,12 +29,6 @@ export function makePermissionRule({ optionalEnforcers, timestampEnforcer, permi
29
29
  enforcer: getChecksumAddress(caveat.enforcer),
30
30
  }));
31
31
  try {
32
- const invalidTerms = checksumCaveats.filter(
33
- // isStrictHexString rejects '0x' which is a valid terms value
34
- ({ terms }) => terms !== '0x' && !isStrictHexString(terms));
35
- if (invalidTerms.length > 0) {
36
- throw new Error('Invalid terms: must be a hex string');
37
- }
38
32
  let expiry = null;
39
33
  const expiryTerms = getTermsByEnforcer({
40
34
  caveats: checksumCaveats,
@@ -1 +1 @@
1
- {"version":3,"file":"makePermissionRule.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,wBAAwB;AAUxE,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC5B,kBAAkB,EACnB,qBAAiB;AAElB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAStB;IACC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CACd,CAAC;IAEtB,OAAO;QACL,cAAc;QACd,iBAAiB,EAAE,oBAAoB;QACvC,iBAAiB,EAAE,oBAAoB;QACvC,oBAAoB,CAAC,eAAsB;YACzC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC5B,yBAAyB,CAAC,eAAe,CAAC,CAAC;YAE7C,OAAO,kBAAkB,CACvB,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;QACJ,CAAC;QACD,2BAA2B,CACzB,OAAsB;YAEtB,MAAM,eAAe,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjE,GAAG,MAAM;gBACT,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC9C,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM;gBACzC,8DAA8D;gBAC9D,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAC3D,CAAC;gBAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;gBAED,IAAI,MAAM,GAAkB,IAAI,CAAC;gBAEjC,MAAM,WAAW,GAAG,kBAAkB,CAAC;oBACrC,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;gBAEH,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAoB,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { Caveat } from '@metamask/delegation-core';\nimport { getChecksumAddress, isStrictHexString } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n ChecksumCaveat,\n DecodedPermission,\n PermissionRule,\n PermissionType,\n ValidateAndDecodeResult,\n} from '../types';\nimport {\n buildEnforcerCountsAndSet,\n enforcersMatchRule,\n extractExpiryFromCaveatTerms,\n getTermsByEnforcer,\n} from '../utils';\n\n/**\n * Creates a single permission rule with the given type, enforcer sets, and\n * decode/validate callbacks.\n *\n * @param args - The arguments to this function.\n * @param args.optionalEnforcers - Enforcer addresses that may appear in addition to required.\n * @param args.timestampEnforcer - Address of the TimestampEnforcer used to extract expiry.\n * @param args.permissionType - The permission type identifier.\n * @param args.requiredEnforcers - Map of required enforcer address to required count.\n * @param args.validateAndDecodeData - Callback to decode caveats into permission data; may throw.\n * @returns A permission rule with caveatAddressesMatch and validateAndDecodePermission.\n */\nexport function makePermissionRule({\n optionalEnforcers,\n timestampEnforcer,\n permissionType,\n requiredEnforcers,\n validateAndDecodeData,\n}: {\n optionalEnforcers: Hex[];\n timestampEnforcer: Hex;\n permissionType: PermissionType;\n requiredEnforcers: Record<Hex, number>;\n validateAndDecodeData: (\n caveats: ChecksumCaveat[],\n ) => DecodedPermission['permission']['data'];\n}): PermissionRule {\n const optionalEnforcersSet = new Set(optionalEnforcers);\n const requiredEnforcersMap = new Map(\n Object.entries(requiredEnforcers),\n ) as Map<Hex, number>;\n\n return {\n permissionType,\n requiredEnforcers: requiredEnforcersMap,\n optionalEnforcers: optionalEnforcersSet,\n caveatAddressesMatch(caveatAddresses: Hex[]): boolean {\n const { counts, enforcersSet } =\n buildEnforcerCountsAndSet(caveatAddresses);\n\n return enforcersMatchRule(\n counts,\n enforcersSet,\n requiredEnforcersMap,\n optionalEnforcersSet,\n );\n },\n validateAndDecodePermission(\n caveats: Caveat<Hex>[],\n ): ValidateAndDecodeResult {\n const checksumCaveats: ChecksumCaveat[] = caveats.map((caveat) => ({\n ...caveat,\n enforcer: getChecksumAddress(caveat.enforcer),\n }));\n try {\n const invalidTerms = checksumCaveats.filter(\n // isStrictHexString rejects '0x' which is a valid terms value\n ({ terms }) => terms !== '0x' && !isStrictHexString(terms),\n );\n\n if (invalidTerms.length > 0) {\n throw new Error('Invalid terms: must be a hex string');\n }\n\n let expiry: number | null = null;\n\n const expiryTerms = getTermsByEnforcer({\n caveats: checksumCaveats,\n enforcer: timestampEnforcer,\n throwIfNotFound: false,\n });\n\n if (expiryTerms) {\n expiry = extractExpiryFromCaveatTerms(expiryTerms);\n }\n\n const data = validateAndDecodeData(checksumCaveats);\n\n return { isValid: true, expiry, data };\n } catch (caughtError) {\n return { isValid: false, error: caughtError as Error };\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"makePermissionRule.mjs","sourceRoot":"","sources":["../../../src/decodePermission/rules/makePermissionRule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAUrD,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC5B,kBAAkB,EACnB,qBAAiB;AAElB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,GAStB;IACC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAClC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CACd,CAAC;IAEtB,OAAO;QACL,cAAc;QACd,iBAAiB,EAAE,oBAAoB;QACvC,iBAAiB,EAAE,oBAAoB;QACvC,oBAAoB,CAAC,eAAsB;YACzC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAC5B,yBAAyB,CAAC,eAAe,CAAC,CAAC;YAE7C,OAAO,kBAAkB,CACvB,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;QACJ,CAAC;QACD,2BAA2B,CACzB,OAAsB;YAEtB,MAAM,eAAe,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjE,GAAG,MAAM;gBACT,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC9C,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC;gBACH,IAAI,MAAM,GAAkB,IAAI,CAAC;gBAEjC,MAAM,WAAW,GAAG,kBAAkB,CAAC;oBACrC,OAAO,EAAE,eAAe;oBACxB,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;gBAEH,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;gBAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAoB,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { Caveat } from '@metamask/delegation-core';\nimport { getChecksumAddress } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type {\n ChecksumCaveat,\n DecodedPermission,\n PermissionRule,\n PermissionType,\n ValidateAndDecodeResult,\n} from '../types';\nimport {\n buildEnforcerCountsAndSet,\n enforcersMatchRule,\n extractExpiryFromCaveatTerms,\n getTermsByEnforcer,\n} from '../utils';\n\n/**\n * Creates a single permission rule with the given type, enforcer sets, and\n * decode/validate callbacks.\n *\n * @param args - The arguments to this function.\n * @param args.optionalEnforcers - Enforcer addresses that may appear in addition to required.\n * @param args.timestampEnforcer - Address of the TimestampEnforcer used to extract expiry.\n * @param args.permissionType - The permission type identifier.\n * @param args.requiredEnforcers - Map of required enforcer address to required count.\n * @param args.validateAndDecodeData - Callback to decode caveats into permission data; may throw.\n * @returns A permission rule with caveatAddressesMatch and validateAndDecodePermission.\n */\nexport function makePermissionRule({\n optionalEnforcers,\n timestampEnforcer,\n permissionType,\n requiredEnforcers,\n validateAndDecodeData,\n}: {\n optionalEnforcers: Hex[];\n timestampEnforcer: Hex;\n permissionType: PermissionType;\n requiredEnforcers: Record<Hex, number>;\n validateAndDecodeData: (\n caveats: ChecksumCaveat[],\n ) => DecodedPermission['permission']['data'];\n}): PermissionRule {\n const optionalEnforcersSet = new Set(optionalEnforcers);\n const requiredEnforcersMap = new Map(\n Object.entries(requiredEnforcers),\n ) as Map<Hex, number>;\n\n return {\n permissionType,\n requiredEnforcers: requiredEnforcersMap,\n optionalEnforcers: optionalEnforcersSet,\n caveatAddressesMatch(caveatAddresses: Hex[]): boolean {\n const { counts, enforcersSet } =\n buildEnforcerCountsAndSet(caveatAddresses);\n\n return enforcersMatchRule(\n counts,\n enforcersSet,\n requiredEnforcersMap,\n optionalEnforcersSet,\n );\n },\n validateAndDecodePermission(\n caveats: Caveat<Hex>[],\n ): ValidateAndDecodeResult {\n const checksumCaveats: ChecksumCaveat[] = caveats.map((caveat) => ({\n ...caveat,\n enforcer: getChecksumAddress(caveat.enforcer),\n }));\n try {\n let expiry: number | null = null;\n\n const expiryTerms = getTermsByEnforcer({\n caveats: checksumCaveats,\n enforcer: timestampEnforcer,\n throwIfNotFound: false,\n });\n\n if (expiryTerms) {\n expiry = extractExpiryFromCaveatTerms(expiryTerms);\n }\n\n const data = validateAndDecodeData(checksumCaveats);\n\n return { isValid: true, expiry, data };\n } catch (caughtError) {\n return { isValid: false, error: caughtError as Error };\n }\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/gator-permissions-controller",
3
- "version": "2.0.0-preview-384cfdfef",
3
+ "version": "2.0.0-preview-15dd7d63f",
4
4
  "description": "Controller for managing gator permissions with profile sync integration",
5
5
  "keywords": [
6
6
  "MetaMask",