Skip to content

Commit 0444189

Browse files
authored
chore: Allow scope type to be specified either as ScopeType enum, or string literal (#133)
1 parent c4d0d6a commit 0444189

25 files changed

Lines changed: 171 additions & 100 deletions

packages/smart-accounts-kit/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Allow scope type to be specified either as `ScopeType` enum, or string literal ([#133](https://github.com/MetaMask/smart-accounts-kit/pull/133))
13+
1014
## [0.4.0-beta.1]
1115

1216
### Added

packages/smart-accounts-kit/src/caveatBuilder/scope/erc20PeriodicScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import { createCaveatBuilder } from '../coreCaveatBuilder';
34
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
4-
import type {
5-
erc20PeriodTransfer,
6-
Erc20PeriodTransferBuilderConfig,
7-
} from '../erc20PeriodTransferBuilder';
5+
import type { Erc20PeriodTransferBuilderConfig } from '../erc20PeriodTransferBuilder';
86

97
export type Erc20PeriodicScopeConfig = {
10-
type: typeof erc20PeriodTransfer;
8+
type: ScopeType.Erc20PeriodTransfer;
119
} & Erc20PeriodTransferBuilderConfig;
1210

1311
/**

packages/smart-accounts-kit/src/caveatBuilder/scope/erc20StreamingScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import { createCaveatBuilder } from '../coreCaveatBuilder';
34
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
4-
import type {
5-
erc20Streaming,
6-
Erc20StreamingBuilderConfig,
7-
} from '../erc20StreamingBuilder';
5+
import type { Erc20StreamingBuilderConfig } from '../erc20StreamingBuilder';
86

97
export type Erc20StreamingScopeConfig = {
10-
type: typeof erc20Streaming;
8+
type: ScopeType.Erc20Streaming;
119
} & Erc20StreamingBuilderConfig;
1210

1311
/**

packages/smart-accounts-kit/src/caveatBuilder/scope/erc20TransferScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import { createCaveatBuilder } from '../coreCaveatBuilder';
34
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
4-
import type {
5-
erc20TransferAmount,
6-
Erc20TransferAmountBuilderConfig,
7-
} from '../erc20TransferAmountBuilder';
5+
import type { Erc20TransferAmountBuilderConfig } from '../erc20TransferAmountBuilder';
86

97
export type Erc20TransferScopeConfig = {
10-
type: typeof erc20TransferAmount;
8+
type: ScopeType.Erc20TransferAmount;
119
} & Erc20TransferAmountBuilderConfig;
1210

1311
/**

packages/smart-accounts-kit/src/caveatBuilder/scope/erc721Scope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import { hasProperties } from '../../utils';
34
import { createCaveatBuilder } from '../coreCaveatBuilder';
45
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
5-
import type {
6-
erc721Transfer,
7-
Erc721TransferBuilderConfig,
8-
} from '../erc721TransferBuilder';
6+
import type { Erc721TransferBuilderConfig } from '../erc721TransferBuilder';
97

108
export type Erc721ScopeBaseConfig = {
11-
type: typeof erc721Transfer;
9+
type: ScopeType.Erc721Transfer;
1210
};
1311

1412
export type Erc721ScopeConfig = Erc721ScopeBaseConfig &

packages/smart-accounts-kit/src/caveatBuilder/scope/functionCallScope.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import { hasProperties } from '../../utils';
34
import type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';
@@ -9,7 +10,7 @@ import type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';
910
import type { ValueLteBuilderConfig } from '../valueLteBuilder';
1011

1112
type FunctionCallScopeBaseConfig = {
12-
type: 'functionCall';
13+
type: ScopeType.FunctionCall;
1314
allowedCalldata?: AllowedCalldataBuilderConfig[];
1415
exactCalldata?: ExactCalldataBuilderConfig;
1516
valueLte?: ValueLteBuilderConfig;

packages/smart-accounts-kit/src/caveatBuilder/scope/index.ts

Lines changed: 65 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,20 @@ import {
3434
createOwnershipCaveatBuilder,
3535
type OwnershipScopeConfig,
3636
} from './ownershipScope';
37+
import { ScopeType } from '../../constants';
3738
import 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+
5970
export 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
);

packages/smart-accounts-kit/src/caveatBuilder/scope/nativeTokenPeriodicScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';
34
import { createCaveatBuilder } from '../coreCaveatBuilder';
45
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
56
import type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';
6-
import type {
7-
nativeTokenPeriodTransfer,
8-
NativeTokenPeriodTransferBuilderConfig,
9-
} from '../nativeTokenPeriodTransferBuilder';
7+
import type { NativeTokenPeriodTransferBuilderConfig } from '../nativeTokenPeriodTransferBuilder';
108

119
export type NativeTokenPeriodicScopeConfig = {
12-
type: typeof nativeTokenPeriodTransfer;
10+
type: ScopeType.NativeTokenPeriodTransfer;
1311
allowedCalldata?: AllowedCalldataBuilderConfig[];
1412
exactCalldata?: ExactCalldataBuilderConfig;
1513
} & NativeTokenPeriodTransferBuilderConfig;

packages/smart-accounts-kit/src/caveatBuilder/scope/nativeTokenStreamingScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';
34
import { createCaveatBuilder } from '../coreCaveatBuilder';
45
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
56
import type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';
6-
import type {
7-
nativeTokenStreaming,
8-
NativeTokenStreamingBuilderConfig,
9-
} from '../nativeTokenStreamingBuilder';
7+
import type { NativeTokenStreamingBuilderConfig } from '../nativeTokenStreamingBuilder';
108

119
export type NativeTokenStreamingScopeConfig = {
12-
type: typeof nativeTokenStreaming;
10+
type: ScopeType.NativeTokenStreaming;
1311
allowedCalldata?: AllowedCalldataBuilderConfig[];
1412
exactCalldata?: ExactCalldataBuilderConfig;
1513
} & NativeTokenStreamingBuilderConfig;

packages/smart-accounts-kit/src/caveatBuilder/scope/nativeTokenTransferScope.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1+
import type { ScopeType } from '../../constants';
12
import type { SmartAccountsEnvironment } from '../../types';
23
import type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';
34
import { createCaveatBuilder } from '../coreCaveatBuilder';
45
import type { CoreCaveatBuilder } from '../coreCaveatBuilder';
56
import type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';
6-
import type {
7-
nativeTokenTransferAmount,
8-
NativeTokenTransferAmountBuilderConfig,
9-
} from '../nativeTokenTransferAmountBuilder';
7+
import type { NativeTokenTransferAmountBuilderConfig } from '../nativeTokenTransferAmountBuilder';
108

119
export type NativeTokenTransferScopeConfig = {
12-
type: typeof nativeTokenTransferAmount;
10+
type: ScopeType.NativeTokenTransferAmount;
1311
allowedCalldata?: AllowedCalldataBuilderConfig[];
1412
exactCalldata?: ExactCalldataBuilderConfig;
1513
} & NativeTokenTransferAmountBuilderConfig;

0 commit comments

Comments
 (0)