@metamask/delegation-toolkit
Version:
The Delegation Toolkit built on top of Viem - a library for interacting with DeleGator Smart Accounts
285 lines (264 loc) • 9.81 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
var _chunkXV2EBM2Hcjs = require('./chunk-XV2EBM2H.cjs');
var _chunkSEFYSAJDcjs = require('./chunk-SEFYSAJD.cjs');
// src/actions/index.ts
var actions_exports = {};
_chunkSEFYSAJDcjs.__export.call(void 0, actions_exports, {
caveatEnforcerActions: () => caveatEnforcerActions,
getErc20PeriodTransferEnforcerAvailableAmount: () => getErc20PeriodTransferEnforcerAvailableAmount,
getErc20StreamingEnforcerAvailableAmount: () => getErc20StreamingEnforcerAvailableAmount,
getMultiTokenPeriodEnforcerAvailableAmount: () => getMultiTokenPeriodEnforcerAvailableAmount,
getNativeTokenPeriodTransferEnforcerAvailableAmount: () => getNativeTokenPeriodTransferEnforcerAvailableAmount,
getNativeTokenStreamingEnforcerAvailableAmount: () => getNativeTokenStreamingEnforcerAvailableAmount,
isValid7702Implementation: () => isValid7702Implementation
});
// src/actions/getCaveatAvailableAmount.ts
function findMatchingCaveat({
delegation,
enforcerAddress,
enforcerName
}) {
const matchingCaveats = delegation.caveats.filter(
(caveat) => caveat.enforcer.toLowerCase() === enforcerAddress.toLowerCase()
);
if (matchingCaveats.length === 0) {
throw new Error(`No caveat found with enforcer matching ${enforcerName}`);
}
if (matchingCaveats.length > 1) {
throw new Error(
`Multiple caveats found with enforcer matching ${enforcerName}`
);
}
const [{ terms, args }] = matchingCaveats;
return {
terms,
args
};
}
function getDelegationManager(environment) {
if (!environment.DelegationManager) {
throw new Error("Delegation manager address not found");
}
return environment.DelegationManager;
}
function getEnforcerAddress({
enforcerName,
environment
}) {
const enforcerAddress = environment.caveatEnforcers[enforcerName];
if (!enforcerAddress) {
throw new Error(`${enforcerName} not found in environment`);
}
return enforcerAddress;
}
async function getErc20PeriodTransferEnforcerAvailableAmount(client, environment, params) {
const enforcerName = "ERC20PeriodTransferEnforcer";
const delegationManager = getDelegationManager(environment);
const enforcerAddress = getEnforcerAddress({
enforcerName,
environment
});
const delegationHash = _chunkSEFYSAJDcjs.getDelegationHashOffchain.call(void 0, params.delegation);
const { terms } = findMatchingCaveat({
delegation: params.delegation,
enforcerAddress,
enforcerName
});
return _chunkXV2EBM2Hcjs.read_exports.getAvailableAmount({
client,
contractAddress: enforcerAddress,
delegationHash,
delegationManager,
terms
});
}
async function getErc20StreamingEnforcerAvailableAmount(client, environment, params) {
const enforcerName = "ERC20StreamingEnforcer";
const delegationManager = getDelegationManager(environment);
const enforcerAddress = getEnforcerAddress({
enforcerName,
environment
});
const delegationHash = _chunkSEFYSAJDcjs.getDelegationHashOffchain.call(void 0, params.delegation);
const { terms } = findMatchingCaveat({
delegation: params.delegation,
enforcerAddress,
enforcerName
});
return _chunkXV2EBM2Hcjs.read_exports2.getAvailableAmount({
client,
contractAddress: enforcerAddress,
delegationManager,
delegationHash,
terms
});
}
async function getMultiTokenPeriodEnforcerAvailableAmount(client, environment, params) {
const enforcerName = "MultiTokenPeriodEnforcer";
const delegationManager = getDelegationManager(environment);
const enforcerAddress = getEnforcerAddress({
enforcerName,
environment
});
const delegationHash = _chunkSEFYSAJDcjs.getDelegationHashOffchain.call(void 0, params.delegation);
const { terms, args } = findMatchingCaveat({
delegation: params.delegation,
enforcerAddress,
enforcerName
});
return _chunkXV2EBM2Hcjs.read_exports3.getAvailableAmount({
client,
contractAddress: enforcerAddress,
delegationHash,
delegationManager,
terms,
args
});
}
async function getNativeTokenPeriodTransferEnforcerAvailableAmount(client, environment, params) {
const enforcerName = "NativeTokenPeriodTransferEnforcer";
const delegationManager = getDelegationManager(environment);
const enforcerAddress = getEnforcerAddress({
enforcerName,
environment
});
const delegationHash = _chunkSEFYSAJDcjs.getDelegationHashOffchain.call(void 0, params.delegation);
const { terms } = findMatchingCaveat({
delegation: params.delegation,
enforcerAddress,
enforcerName
});
return _chunkXV2EBM2Hcjs.read_exports4.getAvailableAmount({
client,
contractAddress: enforcerAddress,
delegationHash,
delegationManager,
terms
});
}
async function getNativeTokenStreamingEnforcerAvailableAmount(client, environment, params) {
const enforcerName = "NativeTokenStreamingEnforcer";
const delegationManager = getDelegationManager(environment);
const enforcerAddress = getEnforcerAddress({
enforcerName,
environment
});
const delegationHash = _chunkSEFYSAJDcjs.getDelegationHashOffchain.call(void 0, params.delegation);
const { terms } = findMatchingCaveat({
delegation: params.delegation,
enforcerAddress,
enforcerName
});
return _chunkXV2EBM2Hcjs.read_exports5.getAvailableAmount({
client,
contractAddress: enforcerAddress,
delegationManager,
delegationHash,
terms
});
}
var caveatEnforcerActions = ({ environment }) => (client) => ({
/**
* Get available amount for ERC20 period transfer enforcer.
*
* @param params - The parameters for the ERC20 period transfer enforcer.
* @returns Promise resolving to the period transfer result.
*/
getErc20PeriodTransferEnforcerAvailableAmount: async (params) => {
return getErc20PeriodTransferEnforcerAvailableAmount(
client,
environment,
params
);
},
/**
* Get available amount for ERC20 streaming enforcer.
*
* @param params - The parameters for the ERC20 streaming enforcer.
* @returns Promise resolving to the streaming result.
*/
getErc20StreamingEnforcerAvailableAmount: async (params) => {
return getErc20StreamingEnforcerAvailableAmount(
client,
environment,
params
);
},
/**
* Get available amount for multi-token period enforcer.
*
* @param params - The parameters for the multi-token period enforcer.
* @returns Promise resolving to the period transfer result.
*/
getMultiTokenPeriodEnforcerAvailableAmount: async (params) => {
return getMultiTokenPeriodEnforcerAvailableAmount(
client,
environment,
params
);
},
/**
* Get available amount for native token period transfer enforcer.
*
* @param params - The parameters for the native token period transfer enforcer.
* @returns Promise resolving to the period transfer result.
*/
getNativeTokenPeriodTransferEnforcerAvailableAmount: async (params) => {
return getNativeTokenPeriodTransferEnforcerAvailableAmount(
client,
environment,
params
);
},
/**
* Get available amount for native token streaming enforcer.
*
* @param params - The parameters for the native token streaming enforcer.
* @returns Promise resolving to the streaming result.
*/
getNativeTokenStreamingEnforcerAvailableAmount: async (params) => {
return getNativeTokenStreamingEnforcerAvailableAmount(
client,
environment,
params
);
}
});
// src/actions/isValid7702Implementation.ts
var _viem = require('viem');
var _actions = require('viem/actions');
var DELEGATION_PREFIX = "0xef0100";
function extractDelegatedAddress(code) {
if (_optionalChain([code, 'optionalAccess', _ => _.length]) !== 48) {
return null;
}
if (!code.toLowerCase().startsWith(DELEGATION_PREFIX.toLowerCase())) {
return null;
}
const addressHex = code.slice(8);
return `0x${addressHex}`;
}
async function isValid7702Implementation({
client,
accountAddress,
environment
}) {
try {
const code = await _actions.getCode.call(void 0, client, {
address: accountAddress
});
const delegatedAddress = extractDelegatedAddress(code);
if (!delegatedAddress) {
return false;
}
const expectedImplementation = environment.implementations.EIP7702StatelessDeleGatorImpl;
if (!expectedImplementation) {
return false;
}
return _viem.isAddressEqual.call(void 0, delegatedAddress, expectedImplementation);
} catch (error) {
return false;
}
}
exports.isValid7702Implementation = isValid7702Implementation; exports.getErc20PeriodTransferEnforcerAvailableAmount = getErc20PeriodTransferEnforcerAvailableAmount; exports.getErc20StreamingEnforcerAvailableAmount = getErc20StreamingEnforcerAvailableAmount; exports.getMultiTokenPeriodEnforcerAvailableAmount = getMultiTokenPeriodEnforcerAvailableAmount; exports.getNativeTokenPeriodTransferEnforcerAvailableAmount = getNativeTokenPeriodTransferEnforcerAvailableAmount; exports.getNativeTokenStreamingEnforcerAvailableAmount = getNativeTokenStreamingEnforcerAvailableAmount; exports.caveatEnforcerActions = caveatEnforcerActions; exports.actions_exports = actions_exports;
//# sourceMappingURL=chunk-TJMYQ3DC.cjs.map