@@ -34,18 +34,20 @@ import {
3434 createOwnershipCaveatBuilder ,
3535 type OwnershipScopeConfig ,
3636} from './ownershipScope' ;
37+ import { ScopeType } from '../../constants' ;
3738import type { SmartAccountsEnvironment } from '../../types' ;
38- // Import caveat builder name constants
39- import { erc20PeriodTransfer } from '../erc20PeriodTransferBuilder' ;
40- import { erc20Streaming } from '../erc20StreamingBuilder' ;
41- import { erc20TransferAmount } from '../erc20TransferAmountBuilder' ;
42- import { erc721Transfer } from '../erc721TransferBuilder' ;
43- import { nativeTokenPeriodTransfer } from '../nativeTokenPeriodTransferBuilder' ;
44- import { nativeTokenStreaming } from '../nativeTokenStreamingBuilder' ;
45- import { nativeTokenTransferAmount } from '../nativeTokenTransferAmountBuilder' ;
46- import { ownershipTransfer } from '../ownershipTransferBuilder' ;
39+ import type { CoreCaveatBuilder } from '../coreCaveatBuilder' ;
4740
48- export type ScopeConfig =
41+ // We want to allow the scope `type` to be passed as either an enum reference,
42+ // or the enum's string value this generic accepts a union of scope configs, and
43+ // converts them to an identical union except the `type` parameter is converted
44+ // to a union of `ScopeType.XXXX | `${ScopeType.XXXX}`.
45+ export type ConvertScopeConfigsToInputs < T extends { type : ScopeType } > =
46+ T extends { type : ScopeType }
47+ ? Omit < T , 'type' > & { type : T [ 'type' ] | `${T [ 'type' ] } ` }
48+ : never ;
49+
50+ type ScopeConfigBase =
4951 | Erc20TransferScopeConfig
5052 | Erc20StreamingScopeConfig
5153 | Erc20PeriodicScopeConfig
@@ -56,32 +58,64 @@ export type ScopeConfig =
5658 | OwnershipScopeConfig
5759 | FunctionCallScopeConfig ;
5860
61+ export type ScopeConfig = ConvertScopeConfigsToInputs < ScopeConfigBase > ;
62+
63+ const normalizeScopeConfig = ( config : ScopeConfig ) : ScopeConfigBase => {
64+ return {
65+ ...config ,
66+ type : config . type as ScopeType ,
67+ } as ScopeConfigBase ;
68+ } ;
69+
5970export const createCaveatBuilderFromScope = (
6071 environment : SmartAccountsEnvironment ,
6172 scopeConfig : ScopeConfig ,
62- ) => {
63- switch ( scopeConfig . type ) {
64- case erc20TransferAmount :
65- return createErc20TransferCaveatBuilder ( environment , scopeConfig ) ;
66- case erc20Streaming :
67- return createErc20StreamingCaveatBuilder ( environment , scopeConfig ) ;
68- case erc20PeriodTransfer :
69- return createErc20PeriodicCaveatBuilder ( environment , scopeConfig ) ;
70- case nativeTokenTransferAmount :
71- return createNativeTokenTransferCaveatBuilder ( environment , scopeConfig ) ;
72- case nativeTokenStreaming :
73- return createNativeTokenStreamingCaveatBuilder ( environment , scopeConfig ) ;
74- case nativeTokenPeriodTransfer :
75- return createNativeTokenPeriodicCaveatBuilder ( environment , scopeConfig ) ;
76- case erc721Transfer :
77- return createErc721CaveatBuilder ( environment , scopeConfig ) ;
78- case ownershipTransfer :
79- return createOwnershipCaveatBuilder ( environment , scopeConfig ) ;
80- case 'functionCall' :
81- return createFunctionCallCaveatBuilder ( environment , scopeConfig ) ;
73+ ) : CoreCaveatBuilder => {
74+ const normalizedScopeConfig = normalizeScopeConfig ( scopeConfig ) ;
75+
76+ switch ( normalizedScopeConfig . type ) {
77+ case ScopeType . Erc20TransferAmount :
78+ return createErc20TransferCaveatBuilder (
79+ environment ,
80+ normalizedScopeConfig ,
81+ ) ;
82+ case ScopeType . Erc20Streaming :
83+ return createErc20StreamingCaveatBuilder (
84+ environment ,
85+ normalizedScopeConfig ,
86+ ) ;
87+ case ScopeType . Erc20PeriodTransfer :
88+ return createErc20PeriodicCaveatBuilder (
89+ environment ,
90+ normalizedScopeConfig ,
91+ ) ;
92+ case ScopeType . NativeTokenTransferAmount :
93+ return createNativeTokenTransferCaveatBuilder (
94+ environment ,
95+ normalizedScopeConfig ,
96+ ) ;
97+ case ScopeType . NativeTokenStreaming :
98+ return createNativeTokenStreamingCaveatBuilder (
99+ environment ,
100+ normalizedScopeConfig ,
101+ ) ;
102+ case ScopeType . NativeTokenPeriodTransfer :
103+ return createNativeTokenPeriodicCaveatBuilder (
104+ environment ,
105+ normalizedScopeConfig ,
106+ ) ;
107+ case ScopeType . Erc721Transfer :
108+ return createErc721CaveatBuilder ( environment , normalizedScopeConfig ) ;
109+ case ScopeType . OwnershipTransfer :
110+ return createOwnershipCaveatBuilder ( environment , normalizedScopeConfig ) ;
111+ case ScopeType . FunctionCall :
112+ return createFunctionCallCaveatBuilder (
113+ environment ,
114+ normalizedScopeConfig ,
115+ ) ;
82116 default :
83117 // eslint-disable-next-line no-case-declarations
84- const exhaustivenessCheck : never = scopeConfig ;
118+ const exhaustivenessCheck : never = normalizedScopeConfig ;
85119 throw new Error (
86120 `Invalid scope type: ${ ( exhaustivenessCheck as { type : string } ) . type } ` ,
87121 ) ;
0 commit comments