Skip to content

Commit 05387b5

Browse files
committed
Add caveat building logic for remaining permission types
1 parent 271db59 commit 05387b5

15 files changed

Lines changed: 653 additions & 19 deletions

packages/7715-permission-types/src/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,21 @@ export type {
2121

2222
export type { PayeeRule, RedeemerRule, ExpiryRule } from './permissions';
2323
export {
24+
createErc20TokenAllowanceCaveats,
25+
type Erc20TokenAllowanceEnforcers,
26+
createErc20TokenPeriodicCaveats,
27+
type Erc20TokenPeriodicEnforcers,
2428
makePermissionDecoderConfigs,
2529
createErc20TokenStreamCaveats,
2630
type Erc20TokenStreamEnforcers,
27-
type Erc20TokenStreamDecoderEnforcers,
31+
createNativeTokenAllowanceCaveats,
32+
type NativeTokenAllowanceEnforcers,
33+
createNativeTokenPeriodicCaveats,
34+
type NativeTokenPeriodicEnforcers,
35+
createNativeTokenStreamCaveats,
36+
type NativeTokenStreamEnforcers,
37+
createTokenApprovalRevocationCaveats,
38+
type TokenApprovalRevocationEnforcers,
2839
type DeployedContractsByName,
2940
type PermissionDecoderConfig,
3041
} from './permissions';

packages/7715-permission-types/src/permissions/caveats/erc20TokenAllowance.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import type { Caveat } from '@metamask/delegation-core';
2+
import {
3+
createERC20TokenPeriodTransferTerms,
4+
createValueLteTerms,
5+
} from '@metamask/delegation-core';
16
import { hexToNumber } from '@metamask/utils';
27

38
import type { Erc20TokenAllowancePermission } from '../../types';
@@ -8,6 +13,7 @@ import type {
813
ChecksumCaveat,
914
ChecksumEnforcersByChainId,
1015
DecodedPermissionData,
16+
DeepRequired,
1117
MakePermissionDecoderConfig,
1218
} from '../types';
1319
import {
@@ -111,3 +117,49 @@ function validateAndDecodeData(
111117

112118
return { tokenAddress, allowanceAmount, startTime };
113119
}
120+
121+
/**
122+
* Enforcers required to build ERC-20 token allowance caveats.
123+
*/
124+
export type Erc20TokenAllowanceEnforcers = Pick<
125+
ChecksumEnforcersByChainId,
126+
'erc20PeriodicEnforcer' | 'valueLteEnforcer'
127+
>;
128+
129+
/**
130+
* Builds the erc20-token-allowance caveats required for this permission type.
131+
*
132+
* @param options0 - Caveat builder arguments.
133+
* @param options0.permission - Fully populated erc20-token-allowance permission data.
134+
* @param options0.contracts - Enforcer addresses used to construct caveats.
135+
* @returns The ERC-20 allowance and zero-value caveats.
136+
*/
137+
export async function createErc20TokenAllowanceCaveats({
138+
permission,
139+
contracts,
140+
}: {
141+
permission: DeepRequired<Erc20TokenAllowancePermission>;
142+
contracts: Erc20TokenAllowanceEnforcers;
143+
}): Promise<Caveat[]> {
144+
const { tokenAddress, allowanceAmount, startTime } = permission.data;
145+
146+
const erc20PeriodCaveat: Caveat = {
147+
enforcer: contracts.erc20PeriodicEnforcer,
148+
terms: createERC20TokenPeriodTransferTerms({
149+
tokenAddress,
150+
periodAmount: BigInt(allowanceAmount),
151+
// delegation-core accepts bigint for encoding although the type is `number`.
152+
periodDuration: BigInt(UINT256_MAX) as unknown as number,
153+
startDate: startTime,
154+
}),
155+
args: '0x',
156+
};
157+
158+
const valueLteCaveat: Caveat = {
159+
enforcer: contracts.valueLteEnforcer,
160+
terms: createValueLteTerms({ maxValue: 0n }),
161+
args: '0x',
162+
};
163+
164+
return [erc20PeriodCaveat, valueLteCaveat];
165+
}

packages/7715-permission-types/src/permissions/caveats/erc20TokenPeriodic.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { decodeERC20TokenPeriodTransferTerms } from '@metamask/delegation-core';
1+
import type { Caveat } from '@metamask/delegation-core';
2+
import {
3+
createERC20TokenPeriodTransferTerms,
4+
createValueLteTerms,
5+
decodeERC20TokenPeriodTransferTerms,
6+
} from '@metamask/delegation-core';
27
import { bigIntToHex } from '@metamask/utils';
38

49
import type { Erc20TokenPeriodicPermission } from '../../types';
@@ -9,6 +14,7 @@ import type {
914
ChecksumCaveat,
1015
ChecksumEnforcersByChainId,
1116
DecodedPermissionData,
17+
DeepRequired,
1218
MakePermissionDecoderConfig,
1319
} from '../types';
1420
import {
@@ -117,3 +123,49 @@ function validateAndDecodeData(
117123
startTime,
118124
};
119125
}
126+
127+
/**
128+
* Enforcers required to build ERC-20 token periodic caveats.
129+
*/
130+
export type Erc20TokenPeriodicEnforcers = Pick<
131+
ChecksumEnforcersByChainId,
132+
'erc20PeriodicEnforcer' | 'valueLteEnforcer'
133+
>;
134+
135+
/**
136+
* Builds the erc20-token-periodic caveats required for this permission type.
137+
*
138+
* @param options0 - Caveat builder arguments.
139+
* @param options0.permission - Fully populated erc20-token-periodic permission data.
140+
* @param options0.contracts - Enforcer addresses used to construct caveats.
141+
* @returns The ERC-20 periodic and zero-value caveats.
142+
*/
143+
export async function createErc20TokenPeriodicCaveats({
144+
permission,
145+
contracts,
146+
}: {
147+
permission: DeepRequired<Erc20TokenPeriodicPermission>;
148+
contracts: Erc20TokenPeriodicEnforcers;
149+
}): Promise<Caveat[]> {
150+
const { tokenAddress, periodAmount, periodDuration, startTime } =
151+
permission.data;
152+
153+
const erc20PeriodCaveat: Caveat = {
154+
enforcer: contracts.erc20PeriodicEnforcer,
155+
terms: createERC20TokenPeriodTransferTerms({
156+
tokenAddress,
157+
periodAmount: BigInt(periodAmount),
158+
periodDuration,
159+
startDate: startTime,
160+
}),
161+
args: '0x',
162+
};
163+
164+
const valueLteCaveat: Caveat = {
165+
enforcer: contracts.valueLteEnforcer,
166+
terms: createValueLteTerms({ maxValue: 0n }),
167+
args: '0x',
168+
};
169+
170+
return [erc20PeriodCaveat, valueLteCaveat];
171+
}

packages/7715-permission-types/src/permissions/caveats/nativeTokenAllowance.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import type { Caveat } from '@metamask/delegation-core';
2+
import {
3+
createExactCalldataTerms,
4+
createNativeTokenPeriodTransferTerms,
5+
} from '@metamask/delegation-core';
16
import { hexToNumber } from '@metamask/utils';
27

38
import type { NativeTokenAllowancePermission } from '../../types';
@@ -8,6 +13,7 @@ import type {
813
ChecksumCaveat,
914
ChecksumEnforcersByChainId,
1015
DecodedPermissionData,
16+
DeepRequired,
1117
MakePermissionDecoderConfig,
1218
} from '../types';
1319
import {
@@ -115,3 +121,48 @@ function validateAndDecodeData(
115121

116122
return { allowanceAmount, startTime };
117123
}
124+
125+
/**
126+
* Enforcers required to build native token allowance caveats.
127+
*/
128+
export type NativeTokenAllowanceEnforcers = Pick<
129+
ChecksumEnforcersByChainId,
130+
'nativeTokenPeriodicEnforcer' | 'exactCalldataEnforcer'
131+
>;
132+
133+
/**
134+
* Builds the native-token-allowance caveats required for this permission type.
135+
*
136+
* @param options0 - Caveat builder arguments.
137+
* @param options0.permission - Fully populated native-token-allowance permission data.
138+
* @param options0.contracts - Enforcer addresses used to construct caveats.
139+
* @returns The native token allowance and exact-calldata caveats.
140+
*/
141+
export async function createNativeTokenAllowanceCaveats({
142+
permission,
143+
contracts,
144+
}: {
145+
permission: DeepRequired<NativeTokenAllowancePermission>;
146+
contracts: NativeTokenAllowanceEnforcers;
147+
}): Promise<Caveat[]> {
148+
const { allowanceAmount, startTime } = permission.data;
149+
150+
const nativeTokenPeriodTransferCaveat: Caveat = {
151+
enforcer: contracts.nativeTokenPeriodicEnforcer,
152+
terms: createNativeTokenPeriodTransferTerms({
153+
periodAmount: BigInt(allowanceAmount),
154+
// delegation-core accepts bigint for encoding although the type is `number`.
155+
periodDuration: BigInt(UINT256_MAX) as unknown as number,
156+
startDate: startTime,
157+
}),
158+
args: '0x',
159+
};
160+
161+
const exactCalldataCaveat: Caveat = {
162+
enforcer: contracts.exactCalldataEnforcer,
163+
terms: createExactCalldataTerms({ calldata: '0x' }),
164+
args: '0x',
165+
};
166+
167+
return [nativeTokenPeriodTransferCaveat, exactCalldataCaveat];
168+
}

packages/7715-permission-types/src/permissions/caveats/nativeTokenPeriodic.ts

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { decodeNativeTokenPeriodTransferTerms } from '@metamask/delegation-core';
1+
import type { Caveat } from '@metamask/delegation-core';
2+
import {
3+
createExactCalldataTerms,
4+
createNativeTokenPeriodTransferTerms,
5+
decodeNativeTokenPeriodTransferTerms,
6+
} from '@metamask/delegation-core';
27
import { bigIntToHex } from '@metamask/utils';
38

49
import type { NativeTokenPeriodicPermission } from '../../types';
@@ -9,6 +14,7 @@ import type {
914
ChecksumCaveat,
1015
ChecksumEnforcersByChainId,
1116
DecodedPermissionData,
17+
DeepRequired,
1218
MakePermissionDecoderConfig,
1319
} from '../types';
1420
import { getTermsByEnforcer, MAX_PERIOD_DURATION } from '../utils';
@@ -112,3 +118,47 @@ function validateAndDecodeData(
112118
startTime,
113119
};
114120
}
121+
122+
/**
123+
* Enforcers required to build native token periodic caveats.
124+
*/
125+
export type NativeTokenPeriodicEnforcers = Pick<
126+
ChecksumEnforcersByChainId,
127+
'nativeTokenPeriodicEnforcer' | 'exactCalldataEnforcer'
128+
>;
129+
130+
/**
131+
* Builds the native-token-periodic caveats required for this permission type.
132+
*
133+
* @param options0 - Caveat builder arguments.
134+
* @param options0.permission - Fully populated native-token-periodic permission data.
135+
* @param options0.contracts - Enforcer addresses used to construct caveats.
136+
* @returns The native token periodic and exact-calldata caveats.
137+
*/
138+
export async function createNativeTokenPeriodicCaveats({
139+
permission,
140+
contracts,
141+
}: {
142+
permission: DeepRequired<NativeTokenPeriodicPermission>;
143+
contracts: NativeTokenPeriodicEnforcers;
144+
}): Promise<Caveat[]> {
145+
const { periodAmount, periodDuration, startTime } = permission.data;
146+
147+
const nativeTokenPeriodTransferCaveat: Caveat = {
148+
enforcer: contracts.nativeTokenPeriodicEnforcer,
149+
terms: createNativeTokenPeriodTransferTerms({
150+
periodAmount: BigInt(periodAmount),
151+
periodDuration,
152+
startDate: startTime,
153+
}),
154+
args: '0x',
155+
};
156+
157+
const exactCalldataCaveat: Caveat = {
158+
enforcer: contracts.exactCalldataEnforcer,
159+
terms: createExactCalldataTerms({ calldata: '0x' }),
160+
args: '0x',
161+
};
162+
163+
return [nativeTokenPeriodTransferCaveat, exactCalldataCaveat];
164+
}

packages/7715-permission-types/src/permissions/caveats/nativeTokenStream.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { decodeNativeTokenStreamingTerms } from '@metamask/delegation-core';
1+
import type { Caveat } from '@metamask/delegation-core';
2+
import {
3+
createExactCalldataTerms,
4+
createNativeTokenStreamingTerms,
5+
decodeNativeTokenStreamingTerms,
6+
} from '@metamask/delegation-core';
27
import { bigIntToHex } from '@metamask/utils';
38

49
import type { NativeTokenStreamPermission } from '../../types';
@@ -9,6 +14,7 @@ import type {
914
ChecksumCaveat,
1015
ChecksumEnforcersByChainId,
1116
DecodedPermissionData,
17+
DeepRequired,
1218
MakePermissionDecoderConfig,
1319
} from '../types';
1420
import { getTermsByEnforcer } from '../utils';
@@ -104,3 +110,49 @@ function validateAndDecodeData(
104110
startTime,
105111
};
106112
}
113+
114+
/**
115+
* Enforcers required to build native token stream caveats.
116+
*/
117+
export type NativeTokenStreamEnforcers = Pick<
118+
ChecksumEnforcersByChainId,
119+
'nativeTokenStreamingEnforcer' | 'exactCalldataEnforcer'
120+
>;
121+
122+
/**
123+
* Builds the native-token-stream caveats required for this permission type.
124+
*
125+
* @param options0 - Caveat builder arguments.
126+
* @param options0.permission - Fully populated native-token-stream permission data.
127+
* @param options0.contracts - Enforcer addresses used to construct caveats.
128+
* @returns The native token streaming and exact-calldata caveats.
129+
*/
130+
export async function createNativeTokenStreamCaveats({
131+
permission,
132+
contracts,
133+
}: {
134+
permission: DeepRequired<NativeTokenStreamPermission>;
135+
contracts: NativeTokenStreamEnforcers;
136+
}): Promise<Caveat[]> {
137+
const { initialAmount, maxAmount, amountPerSecond, startTime } =
138+
permission.data;
139+
140+
const nativeTokenStreamingCaveat: Caveat = {
141+
enforcer: contracts.nativeTokenStreamingEnforcer,
142+
terms: createNativeTokenStreamingTerms({
143+
initialAmount: BigInt(initialAmount),
144+
maxAmount: BigInt(maxAmount),
145+
amountPerSecond: BigInt(amountPerSecond),
146+
startTime,
147+
}),
148+
args: '0x',
149+
};
150+
151+
const exactCalldataCaveat: Caveat = {
152+
enforcer: contracts.exactCalldataEnforcer,
153+
terms: createExactCalldataTerms({ calldata: '0x' }),
154+
args: '0x',
155+
};
156+
157+
return [nativeTokenStreamingCaveat, exactCalldataCaveat];
158+
}

0 commit comments

Comments
 (0)