Skip to content

Commit 64af729

Browse files
committed
makeUpgradeable helper
1 parent a44081a commit 64af729

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

packages/core/solidity/src/account.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ContractBuilder } from './contract';
22
import type { Contract } from './contract';
33
import { defineFunctions } from './utils/define-functions';
44
import { printContract } from './print';
5+
import { makeUpgradeable } from './helpers';
56
import { defaults as commonDefaults, withCommonDefaults, type CommonOptions } from './common-options';
67
import { setInfo } from './set-info';
78
import {
@@ -160,18 +161,17 @@ function addBatchedExecution(c: ContractBuilder, opts: AccountOptions): void {
160161
function addERC7579Modules(c: ContractBuilder, opts: AccountOptions): void {
161162
if (!opts.ERC7579Modules) return;
162163

163-
const baseERC7579AccountName = opts.upgradeable ? 'AccountERC7579Upgradeable' : 'AccountERC7579';
164-
const fullERC7579AccountName = opts.upgradeable ? `${opts.ERC7579Modules}Upgradeable` : opts.ERC7579Modules;
165-
const packageName = opts.upgradeable ? 'contracts-upgradeable' : 'contracts';
164+
// Base AccountERC7579 account (upgradeable or not)
165+
const name = makeUpgradeable('AccountERC7579', opts.upgradeable);
166166

167167
c.addParent({
168-
name: fullERC7579AccountName,
169-
path: `@openzeppelin/${packageName}/account/extensions/draft-${fullERC7579AccountName}.sol`,
168+
name: makeUpgradeable(opts.ERC7579Modules, opts.upgradeable),
169+
path: makeUpgradeable(`@openzeppelin/contracts/account/extensions/draft-${opts.ERC7579Modules}.sol`, opts.upgradeable),
170170
});
171-
if (baseERC7579AccountName !== fullERC7579AccountName) {
171+
if (opts.ERC7579Modules !== 'AccountERC7579') {
172172
c.addImportOnly({
173-
name: baseERC7579AccountName,
174-
path: `@openzeppelin/${packageName}/account/extensions/draft-${baseERC7579AccountName}.sol`,
173+
name: makeUpgradeable('AccountERC7579', opts.upgradeable),
174+
path: makeUpgradeable('@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol', opts.upgradeable),
175175
});
176176
}
177177

@@ -203,22 +203,22 @@ function addERC7579Modules(c: ContractBuilder, opts: AccountOptions): void {
203203
}
204204

205205
// isValidSignature override
206-
c.addOverride({ name: baseERC7579AccountName }, functions.isValidSignature);
206+
c.addOverride({ name }, functions.isValidSignature);
207207
if (opts.signatureValidation === 'ERC7739') {
208208
c.addOverride({ name: 'ERC7739' }, functions.isValidSignature);
209209
c.setFunctionBody(
210210
[
211211
'// ERC-7739 can return the ERC-1271 magic value, 0xffffffff (invalid) or 0x77390001 (detection).',
212212
'// If the returned value is 0xffffffff, fallback to ERC-7579 validation.',
213213
'bytes4 erc7739magic = ERC7739.isValidSignature(hash, signature);',
214-
`return erc7739magic == bytes4(0xffffffff) ? ${baseERC7579AccountName}.isValidSignature(hash, signature) : erc7739magic;`,
214+
`return erc7739magic == bytes4(0xffffffff) ? ${name}.isValidSignature(hash, signature) : erc7739magic;`,
215215
],
216216
functions.isValidSignature,
217217
);
218218
}
219219

220220
// _validateUserOp override
221-
c.addOverride({ name: baseERC7579AccountName }, functions._validateUserOp);
221+
c.addOverride({ name }, functions._validateUserOp);
222222
}
223223

224224
function addSignerInitializer(c: ContractBuilder, opts: AccountOptions): void {
@@ -312,8 +312,8 @@ function overrideRawSignatureValidation(c: ContractBuilder, opts: AccountOptions
312312

313313
// Disambiguate between Signer and AccountERC7579
314314
if (opts.signer && opts.ERC7579Modules) {
315-
const accountName = opts.upgradeable ? 'AccountERC7579Upgradeable' : 'AccountERC7579';
316-
const signerName = opts.upgradeable ? `Signer${opts.signer}Upgradeable` : `Signer${opts.signer}`;
315+
const accountName = makeUpgradeable('AccountERC7579', opts.upgradeable);
316+
const signerName = makeUpgradeable(`Signer${opts.signer}`, opts.upgradeable);
317317

318318
c.addImportOnly({
319319
name: 'AbstractSigner',
@@ -334,10 +334,8 @@ function overrideRawSignatureValidation(c: ContractBuilder, opts: AccountOptions
334334
// Base override for `_rawSignatureValidation` given MultiSignerERC7913Weighted is MultiSignerERC7913
335335
if (opts.signer === 'MultisigWeighted') {
336336
c.addImportOnly({
337-
name: opts.upgradeable ? `${signers.Multisig.name}Upgradeable` : `${signers.Multisig.name}`,
338-
path: opts.upgradeable
339-
? signers.Multisig.path.replace('.sol', 'Upgradeable.sol').replace(`/contracts/`, `/contracts-upgradeable/`)
340-
: signers.Multisig.path,
337+
name: makeUpgradeable(signers.Multisig.name, opts.upgradeable),
338+
path: makeUpgradeable(signers.Multisig.path, opts.upgradeable),
341339
});
342340
}
343341
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import path from "path";
2+
import type { CommonOptions } from "./common-options";
3+
4+
// If upgradeable is true-ish, translate a contract name or contract path into its corresponding upgradeable variant.
5+
// Otherwise, return the input unmodified.
6+
//
7+
// Example:
8+
// - makeUpgradeable('AccountERC7579', false) == 'AccountERC7579'
9+
// - makeUpgradeable('AccountERC7579', 'uups') == 'AccountERC7579Upgradeable'
10+
// - makeUpgradeable('@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol', false) == '@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol'
11+
// - makeUpgradeable('@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol', 'uups') == '@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol'
12+
export function makeUpgradeable(input: string, upgradeable: CommonOptions['upgradeable'] = false): string {
13+
switch (upgradeable) {
14+
case false:
15+
return input;
16+
case 'uups':
17+
case 'transparent':
18+
const { dir, name, ext } = path.parse(input);
19+
return path.format({
20+
dir: dir.replace('/contracts/', '/contracts-upgradeable/'),
21+
name: name + 'Upgradeable',
22+
ext,
23+
});
24+
}
25+
}

packages/core/solidity/src/signer.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { ContractBuilder } from './contract';
22
import { OptionsError } from './error';
33
import type { Upgradeable } from './set-upgradeable';
4+
import { makeUpgradeable } from './helpers';
45
import { defineFunctions } from './utils/define-functions';
56

67
export const SignerOptions = [false, 'ERC7702', 'ECDSA', 'P256', 'RSA', 'Multisig', 'MultisigWeighted'] as const;
@@ -11,7 +12,7 @@ export function addSigner(c: ContractBuilder, signer: SignerOptions, upgradeable
1112

1213
const signerName = signer === 'MultisigWeighted' ? signers.Multisig.name : signers[signer].name;
1314
c.addOverride(
14-
{ name: upgradeable ? `${signerName}Upgradeable` : signerName },
15+
{ name: makeUpgradeable(signerName, upgradeable) },
1516
signerFunctions._rawSignatureValidation,
1617
);
1718

@@ -42,9 +43,7 @@ export function addSigner(c: ContractBuilder, signer: SignerOptions, upgradeable
4243
c.addFunctionCode(`__${signers[signer].name}_init(${signerArgs[signer].map(arg => arg.name).join(', ')});`, fn);
4344
c.addParent({
4445
name: `${signers[signer].name}Upgradeable`,
45-
path: signers[signer].path
46-
.replace('.sol', 'Upgradeable.sol')
47-
.replace('/contracts/', '/contracts-upgradeable/'),
46+
path: makeUpgradeable(signers[signer].path, upgradeable),
4847
});
4948
} else {
5049
signerArgs[signer].forEach(arg => c.addConstructorArgument(arg));

0 commit comments

Comments
 (0)