33 createRedeemerTerms ,
44 decodeRedeemerTerms ,
55} from '@metamask/delegation-core' ;
6- import type { Account , Address , Hex } from 'viem' ;
6+ import type { Address , Hex } from 'viem' ;
77
88import type { Caveats } from '../caveatBuilder' ;
99import { resolveCaveats } from '../caveatBuilder' ;
@@ -16,62 +16,46 @@ import type {
1616 PermissionContext ,
1717 SmartAccountsEnvironment ,
1818} from '../types' ;
19+ import type {
20+ MaybeDeferred ,
21+ PaymentRequirements ,
22+ x402DelegationProviderConfig ,
23+ } from './x402DelegationProviderTypes' ;
1924import { generateSalt } from '../utils/' ;
2025
26+ /**
27+ * Inputs for redeemer constraint enforcement.
28+ */
2129type EnsureRedeemerSufficientlyConstrainedParams = {
2230 redeemerEnforcer : Hex ;
2331 caveats : Caveat [ ] ;
2432 existingDelegations : Delegation [ ] ;
2533 facilitatorAddresses : Hex [ ] | undefined ;
2634} ;
2735
36+ /**
37+ * Inputs for payee constraint enforcement.
38+ */
2839type EnsurePayeeSufficientlyConstrainedParams = {
2940 allowedCalldataEnforcer : Hex ;
3041 caveats : Caveat [ ] ;
3142 existingDelegations : Delegation [ ] ;
3243 payee : Hex ;
3344} ;
3445
35- type Deferred < TResult , TRequirements > = (
36- requirements : TRequirements ,
37- ) => TResult ;
38-
39- type MaybeDeferred < TResult , TRequirements > =
40- | TResult
41- | Deferred < TResult , TRequirements > ;
42-
43- type ResolveDelegationCreationContextRequirements = {
44- scheme : string ;
45- network : string ;
46- asset : string ;
47- amount : string ;
48- payTo : string ;
49- maxTimeoutSeconds : number ;
50- extra ?: Record < string , unknown > ;
51- } ;
52-
53- type ResolveDelegationCreationContextConfig = {
54- account : Account ;
55- environment : SmartAccountsEnvironment ;
56- from ?: Hex ;
57- salt ?: Hex ;
58- caveats ?: MaybeDeferred <
59- Caveats | undefined ,
60- ResolveDelegationCreationContextRequirements
61- > ;
62- parentPermissionContext ?: MaybeDeferred <
63- PermissionContext | undefined ,
64- ResolveDelegationCreationContextRequirements
65- > ;
66- } ;
67-
46+ /**
47+ * Resolved context required to build and sign an x402 delegation.
48+ */
6849export type DelegationCreationContext = {
69- account : Account ;
50+ account : x402DelegationProviderConfig [ 'account' ] ;
7051 delegationManager : Address ;
7152 existingDelegations : Delegation [ ] ;
7253 createDelegationConfig : Parameters < typeof createOpenDelegation > [ 0 ] ;
7354} ;
7455
56+ /**
57+ * Inputs for resolving delegation caveats with x402-specific constraints.
58+ */
7559export type Resolvex402DelegationCaveatsParams = {
7660 environment : SmartAccountsEnvironment ;
7761 caveatsConfig : Caveats | undefined ;
@@ -80,25 +64,58 @@ export type Resolvex402DelegationCaveatsParams = {
8064 payee : Hex ;
8165} ;
8266
83- const resolveMaybeDeferred = async < TResult , TRequirements > (
84- maybeDeferred : MaybeDeferred < TResult , TRequirements > | undefined ,
85- requirements : TRequirements ,
67+ /**
68+ * Resolves eager or deferred values against payment requirements.
69+ *
70+ * @param maybeDeferred - Value or async resolver function.
71+ * @param requirements - Payment requirements passed to deferred resolvers.
72+ * @returns The resolved value, or undefined when no value is provided.
73+ */
74+ const resolveMaybeDeferred = async < TResult > (
75+ maybeDeferred : MaybeDeferred < TResult > | undefined ,
76+ requirements : PaymentRequirements ,
8677) : Promise < TResult | undefined > => {
8778 if ( typeof maybeDeferred === 'function' ) {
88- return ( maybeDeferred as Deferred < TResult , TRequirements > ) ( requirements ) ;
79+ const deferred = maybeDeferred as (
80+ deferredRequirements : PaymentRequirements ,
81+ ) => Promise < TResult > ;
82+ return await deferred ( requirements ) ;
8983 }
9084
9185 return maybeDeferred ;
9286} ;
9387
94- // ERC-20 transfer(to, value), `to` parameter starts at index 4
88+ /**
89+ * ERC-20 `transfer(address to, uint256 value)` calldata index for `to`.
90+ */
9591const TRANSFER_PAYEE_INDEX = 4 ;
9692
93+ /**
94+ * Normalizes an address-like hex string for case-insensitive comparisons.
95+ *
96+ * @param address - Address value to normalize.
97+ * @returns Lowercased hex string.
98+ */
9799const normalizeAddress = ( address : Hex ) : string => address . toLowerCase ( ) ;
98100
101+ /**
102+ * Checks whether every item in `subset` appears in `superset`.
103+ *
104+ * @param subset - Candidate subset values.
105+ * @param superset - Candidate superset values.
106+ * @returns True when `subset` is fully contained in `superset`.
107+ */
99108const isSubset = ( subset : string [ ] , superset : string [ ] ) : boolean =>
100109 subset . every ( ( item ) => superset . includes ( item ) ) ;
101110
111+ /**
112+ * Returns whether any caveat in local or inherited delegations matches a predicate.
113+ *
114+ * @param caveats - Current caveat list.
115+ * @param delegations - Existing delegations whose caveats should also be searched.
116+ * @param match - Predicate used to match caveats.
117+ * @returns True when at least one caveat satisfies `match`.
118+ */
102119const hasMatchingCaveats = (
103120 caveats : Caveat [ ] ,
104121 delegations : Delegation [ ] ,
@@ -298,17 +315,15 @@ export const resolvex402DelegationCaveats = ({
298315 * @returns The resolved context used to create and sign a delegation.
299316 */
300317export const resolveDelegationCreationContext = async (
301- config : ResolveDelegationCreationContextConfig ,
302- requirements : ResolveDelegationCreationContextRequirements ,
318+ config : x402DelegationProviderConfig ,
319+ requirements : PaymentRequirements ,
303320) : Promise < DelegationCreationContext > => {
304- const caveatsConfig = await resolveMaybeDeferred (
321+ const caveatsConfig : Caveats | undefined = await resolveMaybeDeferred (
305322 config . caveats ,
306323 requirements ,
307324 ) ;
308- const parentPermissionContext = await resolveMaybeDeferred (
309- config . parentPermissionContext ,
310- requirements ,
311- ) ;
325+ const parentPermissionContext : PermissionContext | undefined =
326+ await resolveMaybeDeferred ( config . parentPermissionContext , requirements ) ;
312327
313328 const { account } = config ;
314329 const from = config . from ?? account . address ;
0 commit comments