@alchemy/smart-accounts 0.0.0-alpha.9 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +36 -0
- package/dist/esm/index.d.ts +2 -4
- package/dist/esm/index.js +2 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/light-account/accounts/account.d.ts +7 -3
- package/dist/esm/light-account/accounts/account.js +20 -10
- package/dist/esm/light-account/accounts/account.js.map +1 -1
- package/dist/esm/light-account/accounts/base.js +50 -23
- package/dist/esm/light-account/accounts/base.js.map +1 -1
- package/dist/esm/light-account/accounts/calldataCodec.js +3 -2
- package/dist/esm/light-account/accounts/calldataCodec.js.map +1 -1
- package/dist/esm/light-account/accounts/multi-owner-account.d.ts +6 -2
- package/dist/esm/light-account/accounts/multi-owner-account.js +14 -6
- package/dist/esm/light-account/accounts/multi-owner-account.js.map +1 -1
- package/dist/esm/light-account/lightAccountStaticImpl.d.ts +3 -1
- package/dist/esm/light-account/lightAccountStaticImpl.js +57 -7
- package/dist/esm/light-account/lightAccountStaticImpl.js.map +1 -1
- package/dist/esm/light-account/predictAddress.d.ts +40 -2
- package/dist/esm/light-account/predictAddress.js +83 -3
- package/dist/esm/light-account/predictAddress.js.map +1 -1
- package/dist/esm/light-account/registry.d.ts +3410 -0
- package/dist/esm/light-account/registry.js +33 -1
- package/dist/esm/light-account/registry.js.map +1 -1
- package/dist/esm/logger.d.ts +1 -1
- package/dist/esm/logger.js +1 -1
- package/dist/esm/logger.js.map +1 -1
- package/dist/esm/ma-v1/accounts/multi-owner-account.d.ts +6 -2
- package/dist/esm/ma-v1/accounts/multi-owner-account.js +18 -7
- package/dist/esm/ma-v1/accounts/multi-owner-account.js.map +1 -1
- package/dist/esm/ma-v1/predictAddress.d.ts +20 -1
- package/dist/esm/ma-v1/predictAddress.js +38 -2
- package/dist/esm/ma-v1/predictAddress.js.map +1 -1
- package/dist/esm/ma-v2/accounts/account.d.ts +8 -5
- package/dist/esm/ma-v2/accounts/account.js +23 -42
- package/dist/esm/ma-v2/accounts/account.js.map +1 -1
- package/dist/esm/ma-v2/accounts/base.d.ts +2 -2
- package/dist/esm/ma-v2/accounts/base.js +12 -59
- package/dist/esm/ma-v2/accounts/base.js.map +1 -1
- package/dist/esm/ma-v2/mav2StaticImpl.d.ts +1 -15
- package/dist/esm/ma-v2/mav2StaticImpl.js +0 -33
- package/dist/esm/ma-v2/mav2StaticImpl.js.map +1 -1
- package/dist/esm/ma-v2/modules/time-range-module/module.js +3 -2
- package/dist/esm/ma-v2/modules/time-range-module/module.js.map +1 -1
- package/dist/esm/ma-v2/predictAddress.d.ts +22 -6
- package/dist/esm/ma-v2/predictAddress.js +46 -12
- package/dist/esm/ma-v2/predictAddress.js.map +1 -1
- package/dist/esm/ma-v2/utils/account.d.ts +0 -3
- package/dist/esm/ma-v2/utils/account.js +0 -3
- package/dist/esm/ma-v2/utils/account.js.map +1 -1
- package/dist/esm/ma-v2/utils/signature.d.ts +1 -16
- package/dist/esm/ma-v2/utils/signature.js +1 -38
- package/dist/esm/ma-v2/utils/signature.js.map +1 -1
- package/dist/esm/utils.d.ts +24 -11
- package/dist/esm/utils.js +67 -21
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/types/index.d.ts +2 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/light-account/accounts/account.d.ts +7 -3
- package/dist/types/light-account/accounts/account.d.ts.map +1 -1
- package/dist/types/light-account/accounts/base.d.ts.map +1 -1
- package/dist/types/light-account/accounts/calldataCodec.d.ts.map +1 -1
- package/dist/types/light-account/accounts/multi-owner-account.d.ts +6 -2
- package/dist/types/light-account/accounts/multi-owner-account.d.ts.map +1 -1
- package/dist/types/light-account/lightAccountStaticImpl.d.ts +3 -1
- package/dist/types/light-account/lightAccountStaticImpl.d.ts.map +1 -1
- package/dist/types/light-account/predictAddress.d.ts +40 -2
- package/dist/types/light-account/predictAddress.d.ts.map +1 -1
- package/dist/types/light-account/registry.d.ts +3410 -0
- package/dist/types/light-account/registry.d.ts.map +1 -1
- package/dist/types/logger.d.ts +1 -1
- package/dist/types/logger.d.ts.map +1 -1
- package/dist/types/ma-v1/accounts/multi-owner-account.d.ts +6 -2
- package/dist/types/ma-v1/accounts/multi-owner-account.d.ts.map +1 -1
- package/dist/types/ma-v1/predictAddress.d.ts +20 -1
- package/dist/types/ma-v1/predictAddress.d.ts.map +1 -1
- package/dist/types/ma-v2/accounts/account.d.ts +8 -5
- package/dist/types/ma-v2/accounts/account.d.ts.map +1 -1
- package/dist/types/ma-v2/accounts/base.d.ts +2 -2
- package/dist/types/ma-v2/accounts/base.d.ts.map +1 -1
- package/dist/types/ma-v2/mav2StaticImpl.d.ts +1 -15
- package/dist/types/ma-v2/mav2StaticImpl.d.ts.map +1 -1
- package/dist/types/ma-v2/modules/time-range-module/module.d.ts.map +1 -1
- package/dist/types/ma-v2/predictAddress.d.ts +22 -6
- package/dist/types/ma-v2/predictAddress.d.ts.map +1 -1
- package/dist/types/ma-v2/utils/account.d.ts +0 -3
- package/dist/types/ma-v2/utils/account.d.ts.map +1 -1
- package/dist/types/ma-v2/utils/signature.d.ts +1 -16
- package/dist/types/ma-v2/utils/signature.d.ts.map +1 -1
- package/dist/types/utils.d.ts +24 -11
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/index.ts +0 -6
- package/src/light-account/accounts/account.ts +30 -16
- package/src/light-account/accounts/base.ts +62 -23
- package/src/light-account/accounts/calldataCodec.ts +3 -2
- package/src/light-account/accounts/multi-owner-account.ts +22 -9
- package/src/light-account/lightAccountStaticImpl.ts +84 -11
- package/src/light-account/predictAddress.ts +124 -3
- package/src/light-account/registry.ts +44 -0
- package/src/logger.ts +2 -2
- package/src/ma-v1/accounts/multi-owner-account.ts +26 -11
- package/src/ma-v1/predictAddress.ts +60 -3
- package/src/ma-v2/accounts/account.ts +39 -52
- package/src/ma-v2/accounts/base.ts +11 -84
- package/src/ma-v2/mav2StaticImpl.ts +1 -52
- package/src/ma-v2/modules/time-range-module/module.ts +3 -2
- package/src/ma-v2/predictAddress.ts +68 -30
- package/src/ma-v2/utils/account.ts +0 -3
- package/src/ma-v2/utils/signature.ts +2 -57
- package/src/utils.ts +111 -27
- package/src/version.ts +1 -1
- package/dist/esm/ma-v2/abis/webAuthnFactoryAbi.d.ts +0 -330
- package/dist/esm/ma-v2/abis/webAuthnFactoryAbi.js +0 -260
- package/dist/esm/ma-v2/abis/webAuthnFactoryAbi.js.map +0 -1
- package/dist/esm/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.d.ts +0 -287
- package/dist/esm/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.js +0 -374
- package/dist/esm/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.js.map +0 -1
- package/dist/esm/ma-v2/modules/webauthn-validation/module.d.ts +0 -11
- package/dist/esm/ma-v2/modules/webauthn-validation/module.js +0 -16
- package/dist/esm/ma-v2/modules/webauthn-validation/module.js.map +0 -1
- package/dist/types/ma-v2/abis/webAuthnFactoryAbi.d.ts +0 -331
- package/dist/types/ma-v2/abis/webAuthnFactoryAbi.d.ts.map +0 -1
- package/dist/types/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.d.ts +0 -288
- package/dist/types/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.d.ts.map +0 -1
- package/dist/types/ma-v2/modules/webauthn-validation/module.d.ts +0 -12
- package/dist/types/ma-v2/modules/webauthn-validation/module.d.ts.map +0 -1
- package/src/ma-v2/abis/webAuthnFactoryAbi.ts +0 -259
- package/src/ma-v2/modules/webauthn-validation/abis/webauthnValidationAbi.ts +0 -373
- package/src/ma-v2/modules/webauthn-validation/module.ts +0 -28
package/LICENSE
CHANGED
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @alchemy/smart-accounts
|
|
2
|
+
|
|
3
|
+
Viem-compatible smart account implementations for Alchemy's smart contract accounts. Supports LightAccount, Modular Account v1, and Modular Account v2 with EIP-7702.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @alchemy/smart-accounts @alchemy/common viem
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Key Exports
|
|
12
|
+
|
|
13
|
+
### LightAccount
|
|
14
|
+
|
|
15
|
+
- **`toLightAccount`** - Single-owner LightAccount
|
|
16
|
+
- **`toMultiOwnerLightAccount`** - Multi-owner variant
|
|
17
|
+
- **`predictLightAccountAddress`** / **`predictMultiOwnerLightAccountAddress`** - Counterfactual address prediction
|
|
18
|
+
- **`singleOwnerLightAccountActions`** / **`multiOwnerLightAccountActions`** - Client decorators
|
|
19
|
+
|
|
20
|
+
### Modular Account v1 (ERC-6900)
|
|
21
|
+
|
|
22
|
+
- **`toMultiOwnerModularAccountV1`** - Account constructor
|
|
23
|
+
- **`multiOwnerModularAccountV1Actions`** - Client decorator
|
|
24
|
+
- **`predictMultiOwnerModularAccountV1Address`** - Address prediction
|
|
25
|
+
|
|
26
|
+
### Modular Account v2
|
|
27
|
+
|
|
28
|
+
- **`toModularAccountV2`** - Account constructor with EIP-7702 support
|
|
29
|
+
- **`deferralActions`** / **`installValidationActions`** - Client decorators
|
|
30
|
+
- **Modules** - `AllowlistModule`, `NativeTokenLimitModule`, `PaymasterGuardModule`, `SingleSignerValidationModule`, `TimeRangeModule`
|
|
31
|
+
- **`PermissionBuilder`** - Fluent builder for session key permissions
|
|
32
|
+
- **Signature utilities** - `packUOSignature`, `pack1271Signature`, `toReplaySafeTypedData`
|
|
33
|
+
|
|
34
|
+
## License
|
|
35
|
+
|
|
36
|
+
MIT
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export type * from "./types.js";
|
|
2
|
-
export { chainHas7212 } from "./utils.js";
|
|
3
2
|
export type * from "./light-account/accounts/account.js";
|
|
4
3
|
export { toLightAccount } from "./light-account/accounts/account.js";
|
|
5
4
|
export type * from "./light-account/accounts/multi-owner-account.js";
|
|
@@ -32,14 +31,13 @@ export type * from "./ma-v2/decorators/deferralActions.js";
|
|
|
32
31
|
export { deferralActions } from "./ma-v2/decorators/deferralActions.js";
|
|
33
32
|
export type * from "./ma-v2/decorators/installValidation.js";
|
|
34
33
|
export { installValidationActions } from "./ma-v2/decorators/installValidation.js";
|
|
35
|
-
export { semiModularAccountV2StaticImpl, semiModularAccount7702StaticImpl,
|
|
34
|
+
export { semiModularAccountV2StaticImpl, semiModularAccount7702StaticImpl, } from "./ma-v2/mav2StaticImpl.js";
|
|
36
35
|
export type * from "./ma-v2/mav2StaticImpl.js";
|
|
37
36
|
export { AllowlistModule } from "./ma-v2/modules/allowlist-module/module.js";
|
|
38
37
|
export { NativeTokenLimitModule } from "./ma-v2/modules/native-token-limit-module/module.js";
|
|
39
38
|
export { PaymasterGuardModule } from "./ma-v2/modules/paymaster-guard-module/module.js";
|
|
40
39
|
export { SingleSignerValidationModule } from "./ma-v2/modules/single-signer-validation/module.js";
|
|
41
40
|
export { TimeRangeModule } from "./ma-v2/modules/time-range-module/module.js";
|
|
42
|
-
export { WebAuthnValidationModule } from "./ma-v2/modules/webauthn-validation/module.js";
|
|
43
41
|
export type * from "./ma-v2/permissionBuilder.js";
|
|
44
42
|
export { PermissionBuilder, PermissionType, } from "./ma-v2/permissionBuilder.js";
|
|
45
43
|
export type * from "./ma-v2/predictAddress.js";
|
|
@@ -52,7 +50,7 @@ export { parseDeferredAction, buildDeferredActionDigest, } from "./ma-v2/utils/d
|
|
|
52
50
|
export type * from "./ma-v2/utils/hooks.js";
|
|
53
51
|
export { serializeValidationConfig, serializeHookConfig, } from "./ma-v2/utils/hooks.js";
|
|
54
52
|
export type * from "./ma-v2/utils/signature.js";
|
|
55
|
-
export { packUOSignature, pack1271Signature, toReplaySafeTypedData,
|
|
53
|
+
export { packUOSignature, pack1271Signature, toReplaySafeTypedData, } from "./ma-v2/utils/signature.js";
|
|
56
54
|
export { EntityIdOverrideError } from "./errors/EntityIdOverrideError.js";
|
|
57
55
|
export { InvalidDeferredActionNonceError } from "./errors/InvalidDeferredActionNonceError.js";
|
|
58
56
|
export { InvalidEntityIdError } from "./errors/InvalidEntityIdError.js";
|
package/dist/esm/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { chainHas7212 } from "./utils.js";
|
|
2
1
|
export { toLightAccount } from "./light-account/accounts/account.js";
|
|
3
2
|
export { toMultiOwnerLightAccount } from "./light-account/accounts/multi-owner-account.js";
|
|
4
3
|
export { singleOwnerLightAccountActions } from "./light-account/decorators/singleOwner.js";
|
|
@@ -17,20 +16,19 @@ export { toModularAccountV2 } from "./ma-v2/accounts/account.js";
|
|
|
17
16
|
export { toModularAccountV2Base } from "./ma-v2/accounts/base.js";
|
|
18
17
|
export { deferralActions } from "./ma-v2/decorators/deferralActions.js";
|
|
19
18
|
export { installValidationActions } from "./ma-v2/decorators/installValidation.js";
|
|
20
|
-
export { semiModularAccountV2StaticImpl, semiModularAccount7702StaticImpl,
|
|
19
|
+
export { semiModularAccountV2StaticImpl, semiModularAccount7702StaticImpl, } from "./ma-v2/mav2StaticImpl.js";
|
|
21
20
|
// Modules
|
|
22
21
|
export { AllowlistModule } from "./ma-v2/modules/allowlist-module/module.js";
|
|
23
22
|
export { NativeTokenLimitModule } from "./ma-v2/modules/native-token-limit-module/module.js";
|
|
24
23
|
export { PaymasterGuardModule } from "./ma-v2/modules/paymaster-guard-module/module.js";
|
|
25
24
|
export { SingleSignerValidationModule } from "./ma-v2/modules/single-signer-validation/module.js";
|
|
26
25
|
export { TimeRangeModule } from "./ma-v2/modules/time-range-module/module.js";
|
|
27
|
-
export { WebAuthnValidationModule } from "./ma-v2/modules/webauthn-validation/module.js";
|
|
28
26
|
export { PermissionBuilder, PermissionType, } from "./ma-v2/permissionBuilder.js";
|
|
29
27
|
export { predictModularAccountV2Address } from "./ma-v2/predictAddress.js";
|
|
30
28
|
export { DefaultAddress, DefaultModuleAddress, DEFAULT_OWNER_ENTITY_ID, EXECUTE_USER_OP_SELECTOR, getMAV2UpgradeToData, buildFullNonceKey, serializeModuleEntity, isModularAccountV2, } from "./ma-v2/utils/account.js";
|
|
31
29
|
export { parseDeferredAction, buildDeferredActionDigest, } from "./ma-v2/utils/deferredActions.js";
|
|
32
30
|
export { serializeValidationConfig, serializeHookConfig, } from "./ma-v2/utils/hooks.js";
|
|
33
|
-
export { packUOSignature, pack1271Signature, toReplaySafeTypedData,
|
|
31
|
+
export { packUOSignature, pack1271Signature, toReplaySafeTypedData, } from "./ma-v2/utils/signature.js";
|
|
34
32
|
// Errors
|
|
35
33
|
export { EntityIdOverrideError } from "./errors/EntityIdOverrideError.js";
|
|
36
34
|
export { InvalidDeferredActionNonceError } from "./errors/InvalidDeferredActionNonceError.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type * from \"./types.js\";\n\n// LightAccount\nexport type * from \"./light-account/accounts/account.js\";\nexport { toLightAccount } from \"./light-account/accounts/account.js\";\n\nexport type * from \"./light-account/accounts/multi-owner-account.js\";\nexport { toMultiOwnerLightAccount } from \"./light-account/accounts/multi-owner-account.js\";\n\n// TODO(v5): Something to consider for v5 - can we cut the exports for the account-specific actions\n// from the public interface, and just consume these internally with account + rely on the standard\n// bundlerClient actions for performing state writes (i.e. rotating owners)? I'm not sure it's useful\n// to consumers outside of attaching to instances of a client with the right action.\nexport type * from \"./light-account/decorators/singleOwner.js\";\nexport { singleOwnerLightAccountActions } from \"./light-account/decorators/singleOwner.js\";\n\nexport type * from \"./light-account/decorators/multiOwner.js\";\nexport { multiOwnerLightAccountActions } from \"./light-account/decorators/multiOwner.js\";\n\nexport type * from \"./light-account/predictAddress.js\";\nexport {\n predictLightAccountAddress,\n predictMultiOwnerLightAccountAddress,\n} from \"./light-account/predictAddress.js\";\n\nexport { AccountVersionRegistry } from \"./light-account/registry.js\";\nexport type * from \"./light-account/registry.js\";\nexport {\n defaultLightAccountVersion,\n getLightAccountImplAddress,\n LightAccountUnsupported1271Factories,\n LightAccountUnsupported1271Impls,\n} from \"./light-account/utils.js\";\n\nexport {\n lightAccountStaticImplV1_0_1,\n lightAccountStaticImplV1_0_2,\n lightAccountStaticImplV1_1_0,\n lightAccountStaticImplV2_0_0,\n multiOwnerLightAccountStaticImplV2_0_0,\n} from \"./light-account/lightAccountStaticImpl.js\";\n\n// ModularAccountV1\nexport type * from \"./ma-v1/accounts/base.js\";\nexport { toModularAccountV1Base } from \"./ma-v1/accounts/base.js\";\n\nexport type * from \"./ma-v1/accounts/multi-owner-account.js\";\nexport { toMultiOwnerModularAccountV1 } from \"./ma-v1/accounts/multi-owner-account.js\";\n\nexport type * from \"./ma-v1/decorators/multiOwner.js\";\nexport { multiOwnerModularAccountV1Actions } from \"./ma-v1/decorators/multiOwner.js\";\n\nexport type * from \"./ma-v1/predictAddress.js\";\nexport { predictMultiOwnerModularAccountV1Address } from \"./ma-v1/predictAddress.js\";\n\nexport { multiOwnerModularAccountStaticImpl } from \"./ma-v1/mav1StaticImpl.js\";\n\nexport {\n DefaultMaV1Address,\n DefaultMaV1PluginAddress,\n} from \"./ma-v1/account.js\";\n\n// ModularAccountV2\nexport type * from \"./ma-v2/accounts/account.js\";\nexport { toModularAccountV2 } from \"./ma-v2/accounts/account.js\";\n\nexport type * from \"./ma-v2/accounts/base.js\";\nexport { toModularAccountV2Base } from \"./ma-v2/accounts/base.js\";\n\nexport type * from \"./ma-v2/decorators/deferralActions.js\";\nexport { deferralActions } from \"./ma-v2/decorators/deferralActions.js\";\n\nexport type * from \"./ma-v2/decorators/installValidation.js\";\nexport { installValidationActions } from \"./ma-v2/decorators/installValidation.js\";\n\nexport {\n semiModularAccountV2StaticImpl,\n semiModularAccount7702StaticImpl,\n} from \"./ma-v2/mav2StaticImpl.js\";\nexport type * from \"./ma-v2/mav2StaticImpl.js\";\n\n// Modules\nexport { AllowlistModule } from \"./ma-v2/modules/allowlist-module/module.js\";\nexport { NativeTokenLimitModule } from \"./ma-v2/modules/native-token-limit-module/module.js\";\nexport { PaymasterGuardModule } from \"./ma-v2/modules/paymaster-guard-module/module.js\";\nexport { SingleSignerValidationModule } from \"./ma-v2/modules/single-signer-validation/module.js\";\nexport { TimeRangeModule } from \"./ma-v2/modules/time-range-module/module.js\";\n\nexport type * from \"./ma-v2/permissionBuilder.js\";\nexport {\n PermissionBuilder,\n PermissionType,\n} from \"./ma-v2/permissionBuilder.js\";\n\nexport type * from \"./ma-v2/predictAddress.js\";\nexport { predictModularAccountV2Address } from \"./ma-v2/predictAddress.js\";\n\nexport type * from \"./ma-v2/types.js\";\n\nexport type * from \"./ma-v2/utils/account.js\";\nexport {\n DefaultAddress,\n DefaultModuleAddress,\n DEFAULT_OWNER_ENTITY_ID,\n EXECUTE_USER_OP_SELECTOR,\n getMAV2UpgradeToData,\n buildFullNonceKey,\n serializeModuleEntity,\n isModularAccountV2,\n} from \"./ma-v2/utils/account.js\";\n\nexport type * from \"./ma-v2/utils/deferredActions.js\";\nexport {\n parseDeferredAction,\n buildDeferredActionDigest,\n} from \"./ma-v2/utils/deferredActions.js\";\n\nexport type * from \"./ma-v2/utils/hooks.js\";\nexport {\n serializeValidationConfig,\n serializeHookConfig,\n} from \"./ma-v2/utils/hooks.js\";\n\nexport type * from \"./ma-v2/utils/signature.js\";\nexport {\n packUOSignature,\n pack1271Signature,\n toReplaySafeTypedData,\n} from \"./ma-v2/utils/signature.js\";\n\n// Errors\nexport { EntityIdOverrideError } from \"./errors/EntityIdOverrideError.js\";\nexport { InvalidDeferredActionNonceError } from \"./errors/InvalidDeferredActionNonceError.js\";\nexport { InvalidEntityIdError } from \"./errors/InvalidEntityIdError.js\";\nexport { InvalidNonceKeyError } from \"./errors/InvalidNonceKeyError.js\";\nexport { InvalidOwnerError } from \"./errors/InvalidOwnerError.js\";\nexport {\n PermissionBuilderError,\n RootPermissionOnlyError,\n AccountAddressAsTargetError,\n DuplicateTargetAddressError,\n NoFunctionsProvidedError,\n ExpiredDeadlineError,\n DeadlineOverLimitError,\n ValidationConfigUnsetError,\n MultipleNativeTokenTransferError,\n ZeroAddressError,\n MultipleGasLimitError,\n UnsupportedPermissionTypeError,\n SelectorNotAllowed,\n} from \"./errors/permissionBuilderErrors.js\";\n"]}
|
|
@@ -8,12 +8,16 @@ export type LightAccount<TLightAccountVersion extends LightAccountVersion<"Light
|
|
|
8
8
|
export type ToLightAccountParams<TLightAccountVersion extends LightAccountVersion<"LightAccount"> = LightAccountVersion<"LightAccount">> = {
|
|
9
9
|
client: Client<Transport, Chain, JsonRpcAccount | LocalAccount | undefined>;
|
|
10
10
|
owner: JsonRpcAccount | LocalAccount;
|
|
11
|
-
salt?: bigint;
|
|
12
11
|
accountAddress?: Address;
|
|
13
12
|
factory?: Address;
|
|
14
|
-
factoryData?: Hex;
|
|
15
13
|
version?: TLightAccountVersion;
|
|
16
|
-
}
|
|
14
|
+
} & ({
|
|
15
|
+
salt?: bigint;
|
|
16
|
+
factoryData?: never;
|
|
17
|
+
} | {
|
|
18
|
+
salt?: never;
|
|
19
|
+
factoryData?: Hex;
|
|
20
|
+
});
|
|
17
21
|
/**
|
|
18
22
|
* Creates a light account.
|
|
19
23
|
*
|
|
@@ -4,8 +4,8 @@ import { LightAccountAbi_v1 } from "../abis/LightAccountAbi_v1.js";
|
|
|
4
4
|
import { LightAccountAbi_v2 } from "../abis/LightAccountAbi_v2.js";
|
|
5
5
|
import { LightAccountFactoryAbi_v1 } from "../abis/LightAccountFactoryAbi_v1.js";
|
|
6
6
|
import { LightAccountFactoryAbi_v2 } from "../abis/LightAccountFactoryAbi_v2.js";
|
|
7
|
-
import { predictLightAccountAddress } from "../predictAddress.js";
|
|
8
|
-
import { AccountVersionRegistry, } from "../registry.js";
|
|
7
|
+
import { getLightAccountAddressFromFactoryData, predictLightAccountAddress, } from "../predictAddress.js";
|
|
8
|
+
import { AccountVersionRegistry, isLightAccountVersion2, } from "../registry.js";
|
|
9
9
|
import { LightAccountUnsupported1271Factories, defaultLightAccountVersion, } from "../utils.js";
|
|
10
10
|
import { toLightAccountBase } from "./base.js";
|
|
11
11
|
import { BaseError, lowerAddress } from "@alchemy/common";
|
|
@@ -22,20 +22,30 @@ export async function toLightAccount({ client, owner, salt: salt_ = 0n, accountA
|
|
|
22
22
|
version,
|
|
23
23
|
hasAccountAddress: !!accountAddress_,
|
|
24
24
|
});
|
|
25
|
-
const accountAbi = version
|
|
26
|
-
|
|
25
|
+
const accountAbi = isLightAccountVersion2(version)
|
|
26
|
+
? LightAccountAbi_v2
|
|
27
|
+
: LightAccountAbi_v1;
|
|
28
|
+
const factoryAbi = isLightAccountVersion2(version)
|
|
27
29
|
? LightAccountFactoryAbi_v2
|
|
28
30
|
: LightAccountFactoryAbi_v1;
|
|
29
31
|
const salt = LightAccountUnsupported1271Factories.has(lowerAddress(factory))
|
|
30
32
|
? 0n
|
|
31
33
|
: salt_;
|
|
32
34
|
const accountAddress = accountAddress_ ??
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
(factoryData_
|
|
36
|
+
? await getLightAccountAddressFromFactoryData({
|
|
37
|
+
client,
|
|
38
|
+
factoryAddress: factory,
|
|
39
|
+
factoryData: factoryData_,
|
|
40
|
+
entryPoint: AccountVersionRegistry["LightAccount"][version].entryPoint,
|
|
41
|
+
version,
|
|
42
|
+
})
|
|
43
|
+
: predictLightAccountAddress({
|
|
44
|
+
factoryAddress: factory,
|
|
45
|
+
salt,
|
|
46
|
+
ownerAddress: owner.address,
|
|
47
|
+
version,
|
|
48
|
+
}));
|
|
39
49
|
LOGGER.debug("toLightAccount:address-resolved", { accountAddress });
|
|
40
50
|
const getFactoryArgs = async () => {
|
|
41
51
|
const factoryData = factoryData_ ??
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/account.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAQnB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/account.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n encodeFunctionData,\n type Address,\n type Chain,\n type Client,\n type Hex,\n type JsonRpcAccount,\n type LocalAccount,\n type Transport,\n} from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { LightAccountAbi_v1 } from \"../abis/LightAccountAbi_v1.js\";\nimport { LightAccountAbi_v2 } from \"../abis/LightAccountAbi_v2.js\";\nimport { LightAccountFactoryAbi_v1 } from \"../abis/LightAccountFactoryAbi_v1.js\";\nimport { LightAccountFactoryAbi_v2 } from \"../abis/LightAccountFactoryAbi_v2.js\";\nimport {\n getLightAccountAddressFromFactoryData,\n predictLightAccountAddress,\n} from \"../predictAddress.js\";\nimport {\n type LightAccountVersion,\n AccountVersionRegistry,\n isLightAccountVersion2,\n} from \"../registry.js\";\nimport {\n LightAccountUnsupported1271Factories,\n defaultLightAccountVersion,\n} from \"../utils.js\";\nimport { toLightAccountBase, type LightAccountBase } from \"./base.js\";\nimport { BaseError, lowerAddress } from \"@alchemy/common\";\nimport { getAction } from \"viem/utils\";\nimport { LOGGER } from \"../../logger.js\";\n\nexport type LightAccount<\n TLightAccountVersion extends\n LightAccountVersion<\"LightAccount\"> = LightAccountVersion<\"LightAccount\">,\n> = LightAccountBase<\"LightAccount\", TLightAccountVersion> & {\n encodeTransferOwnership: (newOwner: Address) => Hex;\n getOwnerAddress: () => Promise<Address>;\n};\n\nexport type ToLightAccountParams<\n TLightAccountVersion extends\n LightAccountVersion<\"LightAccount\"> = LightAccountVersion<\"LightAccount\">,\n> = {\n client: Client<Transport, Chain, JsonRpcAccount | LocalAccount | undefined>;\n owner: JsonRpcAccount | LocalAccount;\n accountAddress?: Address;\n factory?: Address;\n version?: TLightAccountVersion;\n} & (\n | { salt?: bigint; factoryData?: never }\n | { salt?: never; factoryData?: Hex }\n);\n\n/**\n * Creates a light account.\n *\n * @param {ToLightAccountParams} param0 - The parameters for creating a light account.\n * @returns {Promise<LightAccount<TSigner, TLightAccountVersion>>} A light account.\n */\nexport async function toLightAccount<\n TLightAccountVersion extends\n LightAccountVersion<\"LightAccount\"> = LightAccountVersion<\"LightAccount\">,\n>({\n client,\n owner,\n salt: salt_ = 0n,\n accountAddress: accountAddress_,\n version = defaultLightAccountVersion() as TLightAccountVersion,\n factory = AccountVersionRegistry.LightAccount[version].factoryAddress,\n factoryData: factoryData_,\n}: ToLightAccountParams<TLightAccountVersion>): Promise<\n LightAccount<TLightAccountVersion>\n> {\n LOGGER.debug(\"toLightAccount:start\", {\n version,\n hasAccountAddress: !!accountAddress_,\n });\n\n const accountAbi = isLightAccountVersion2(version)\n ? LightAccountAbi_v2\n : LightAccountAbi_v1;\n const factoryAbi = isLightAccountVersion2(version)\n ? LightAccountFactoryAbi_v2\n : LightAccountFactoryAbi_v1;\n\n const salt = LightAccountUnsupported1271Factories.has(lowerAddress(factory))\n ? 0n\n : salt_;\n\n const accountAddress =\n accountAddress_ ??\n (factoryData_\n ? await getLightAccountAddressFromFactoryData({\n client,\n factoryAddress: factory,\n factoryData: factoryData_,\n entryPoint:\n AccountVersionRegistry[\"LightAccount\"][version].entryPoint,\n version,\n })\n : predictLightAccountAddress({\n factoryAddress: factory,\n salt,\n ownerAddress: owner.address,\n version,\n }));\n\n LOGGER.debug(\"toLightAccount:address-resolved\", { accountAddress });\n\n const getFactoryArgs = async () => {\n const factoryData =\n factoryData_ ??\n encodeFunctionData({\n abi: factoryAbi,\n functionName: \"createAccount\",\n args: [owner.address, salt],\n });\n\n return {\n factory,\n factoryData,\n };\n };\n\n const baseAccount = await toLightAccountBase({\n client,\n owner,\n abi: accountAbi,\n accountAddress,\n type: \"LightAccount\",\n version,\n getFactoryArgs,\n });\n\n return {\n ...baseAccount,\n\n encodeTransferOwnership: (newOwner: Address) => {\n return encodeFunctionData({\n abi: accountAbi,\n functionName: \"transferOwnership\",\n args: [newOwner],\n });\n },\n\n async getOwnerAddress(): Promise<Address> {\n LOGGER.debug(\"getOwnerAddress:start\", { accountAddress });\n const readContractAction = getAction(\n client,\n readContract,\n \"readContract\",\n );\n const owner = await readContractAction({\n address: accountAddress,\n abi: accountAbi,\n functionName: \"owner\",\n });\n\n if (owner == null) {\n LOGGER.error(\"getOwnerAddress:failed\", { accountAddress });\n throw new BaseError(\"could not get on-chain owner\");\n }\n\n LOGGER.debug(\"getOwnerAddress:success\", { owner });\n return owner;\n },\n };\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getUserOperationHash, toSmartAccount, } from "viem/account-abstraction";
|
|
1
|
+
import { concatHex, encodeFunctionData, fromHex, hashMessage, hashTypedData, trim, } from "viem";
|
|
2
|
+
import { getUserOperationHash, getUserOperationTypedData, toSmartAccount, } from "viem/account-abstraction";
|
|
3
3
|
import { getStorageAt, signMessage, signTypedData } from "viem/actions";
|
|
4
4
|
import { EIP1967_PROXY_IMPL_STORAGE_SLOT } from "../utils.js";
|
|
5
|
-
import { AccountVersionRegistry } from "../registry.js";
|
|
5
|
+
import { AccountVersionRegistry, isLightAccountVersion2 } from "../registry.js";
|
|
6
6
|
import { encodeCallsLA as encodeCalls, decodeCallsLA as decodeCalls, } from "./calldataCodec.js";
|
|
7
7
|
import { BaseError, lowerAddress } from "@alchemy/common";
|
|
8
8
|
import { getAction } from "viem/utils";
|
|
@@ -68,6 +68,8 @@ export async function toLightAccountBase({ client, abi, accountAddress, owner, t
|
|
|
68
68
|
data: get1271Wrapper(messageHash, "1"),
|
|
69
69
|
};
|
|
70
70
|
case "v2.0.0":
|
|
71
|
+
case "v2.1.0":
|
|
72
|
+
case "v2.2.0":
|
|
71
73
|
return {
|
|
72
74
|
type: "eth_signTypedData_v4",
|
|
73
75
|
data: get1271Wrapper(messageHash, "2"),
|
|
@@ -77,8 +79,8 @@ export async function toLightAccountBase({ client, abi, accountAddress, owner, t
|
|
|
77
79
|
}
|
|
78
80
|
};
|
|
79
81
|
const formatSignature = async (signature) => {
|
|
80
|
-
return version
|
|
81
|
-
?
|
|
82
|
+
return isLightAccountVersion2(version)
|
|
83
|
+
? concatHex([SignaturePrefix.EOA, signature])
|
|
82
84
|
: signature;
|
|
83
85
|
};
|
|
84
86
|
const entryPoint = AccountVersionRegistry[type][version].entryPoint;
|
|
@@ -103,7 +105,9 @@ export async function toLightAccountBase({ client, abi, accountAddress, owner, t
|
|
|
103
105
|
case "v1.1.0":
|
|
104
106
|
return signature;
|
|
105
107
|
case "v2.0.0":
|
|
106
|
-
|
|
108
|
+
case "v2.1.0":
|
|
109
|
+
case "v2.2.0":
|
|
110
|
+
return concatHex([SignaturePrefix.EOA, signature]);
|
|
107
111
|
default:
|
|
108
112
|
throw new BaseError(`Unknown version ${type} of ${String(version)}`);
|
|
109
113
|
}
|
|
@@ -140,23 +144,46 @@ export async function toLightAccountBase({ client, abi, accountAddress, owner, t
|
|
|
140
144
|
},
|
|
141
145
|
async signUserOperation(parameters) {
|
|
142
146
|
const { chainId = client.chain.id, ...userOperation } = parameters;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
147
|
+
let signature;
|
|
148
|
+
switch (version) {
|
|
149
|
+
case "v1.0.1":
|
|
150
|
+
case "v1.0.2":
|
|
151
|
+
case "v1.1.0":
|
|
152
|
+
case "v2.0.0":
|
|
153
|
+
const userOpHash = getUserOperationHash({
|
|
154
|
+
chainId,
|
|
155
|
+
entryPointAddress: entryPoint.address,
|
|
156
|
+
entryPointVersion: entryPoint.version,
|
|
157
|
+
userOperation: {
|
|
158
|
+
...userOperation,
|
|
159
|
+
sender: accountAddress,
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
const signMessageAction = getAction(client, signMessage, "signMessage");
|
|
163
|
+
signature = await signMessageAction({
|
|
164
|
+
account: owner,
|
|
165
|
+
message: { raw: userOpHash },
|
|
166
|
+
});
|
|
167
|
+
break;
|
|
168
|
+
case "v2.1.0":
|
|
169
|
+
case "v2.2.0":
|
|
170
|
+
const signTypedDataAction = getAction(client, signTypedData, "signTypedData");
|
|
171
|
+
signature = await signTypedDataAction({
|
|
172
|
+
account: owner,
|
|
173
|
+
...getUserOperationTypedData({
|
|
174
|
+
chainId,
|
|
175
|
+
entryPointAddress: entryPoint.address,
|
|
176
|
+
userOperation: {
|
|
177
|
+
...userOperation,
|
|
178
|
+
sender: accountAddress,
|
|
179
|
+
},
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
default:
|
|
184
|
+
throw new BaseError(`Unknown version ${type} of ${String(version)}`);
|
|
185
|
+
}
|
|
186
|
+
return formatSignature(signature);
|
|
160
187
|
},
|
|
161
188
|
extend: {
|
|
162
189
|
smartAccountType: type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n concat,\n concatHex,\n encodeFunctionData,\n fromHex,\n hashMessage,\n hashTypedData,\n trim,\n type Abi,\n type Address,\n type Chain,\n type Client,\n type Hex,\n type JsonRpcAccount,\n type LocalAccount,\n type Transport,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n getUserOperationHash,\n toSmartAccount,\n type SmartAccountImplementation,\n} from \"viem/account-abstraction\";\nimport { getStorageAt, signMessage, signTypedData } from \"viem/actions\";\nimport type {\n EntryPointFromAccountRegistry,\n LightAccountType,\n LightAccountVersion,\n} from \"../registry.js\";\nimport { EIP1967_PROXY_IMPL_STORAGE_SLOT } from \"../utils.js\";\nimport { AccountVersionRegistry } from \"../registry.js\";\nimport {\n encodeCallsLA as encodeCalls,\n decodeCallsLA as decodeCalls,\n} from \"./calldataCodec.js\";\nimport { BaseError, lowerAddress } from \"@alchemy/common\";\nimport type {\n SignatureRequest,\n StaticSmartAccountImplementation,\n SmartAccountWithDecodeCalls,\n} from \"../../types.js\";\nimport { getAction } from \"viem/utils\";\n\nconst SignaturePrefix = {\n EOA: \"0x00\",\n CONTRACT: \"0x01\",\n CONTRACT_WITH_ADDR: \"0x02\",\n} as const;\n\nexport type BaseLightAccountImplementation<\n TLightAccountType extends LightAccountType = LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n> = SmartAccountImplementation<\n EntryPointFromAccountRegistry<TLightAccountType, TLightAccountVersion>[\"abi\"],\n EntryPointFromAccountRegistry<\n TLightAccountType,\n TLightAccountVersion\n >[\"version\"],\n {\n getLightAccountVersion: () => TLightAccountVersion;\n smartAccountType: TLightAccountType;\n encodeUpgradeToAndCall: (params: {\n upgradeToAddress: Address;\n upgradeToInitData: Hex;\n }) => Promise<Hex>;\n prepareSignature: (request: SignatureRequest) => Promise<SignatureRequest>;\n formatSignature: (signature: Hex) => Promise<Hex>;\n },\n false\n>;\n\nexport type LightAccountBase<\n TLightAccountType extends LightAccountType = LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n> = SmartAccountWithDecodeCalls<\n BaseLightAccountImplementation<TLightAccountType, TLightAccountVersion>\n>;\n\nexport type ToLightAccountBaseParams<\n TLightAccountType extends LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n TTransport extends Transport = Transport,\n> = {\n client: Client<TTransport, Chain, JsonRpcAccount | LocalAccount | undefined>;\n abi: Abi;\n accountAddress: Address;\n owner: JsonRpcAccount | LocalAccount;\n type: TLightAccountType;\n version: TLightAccountVersion;\n getFactoryArgs: () => Promise<{\n factory?: Address | undefined;\n factoryData?: Hex | undefined;\n }>;\n};\n\nexport async function toLightAccountBase<\n TLightAccountType extends LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n TTransport extends Transport = Transport,\n>({\n client,\n abi,\n accountAddress,\n owner,\n type,\n version,\n getFactoryArgs,\n}: ToLightAccountBaseParams<\n TLightAccountType,\n TLightAccountVersion,\n TTransport\n>): Promise<LightAccountBase<TLightAccountType, TLightAccountVersion>> {\n const encodeUpgradeToAndCall = async ({\n upgradeToAddress,\n upgradeToInitData,\n }: {\n upgradeToAddress: Address;\n upgradeToInitData: Hex;\n }): Promise<Hex> => {\n const expectedImplAddresses = (\n Object.values(\n AccountVersionRegistry[type],\n ) as StaticSmartAccountImplementation<false>[]\n ).map((x) => x.accountImplementation);\n\n const getStorageAtAction = getAction(client, getStorageAt, \"getStorageAt\");\n // TODO(v5): This is a super fragile workflow, and we should consider not supporting this on the SmartAccount level in v5.\n const storage = await getStorageAtAction({\n address: accountAddress,\n slot: EIP1967_PROXY_IMPL_STORAGE_SLOT,\n });\n\n if (storage == null) {\n throw new BaseError(\n `Failed to get storage slot: ${EIP1967_PROXY_IMPL_STORAGE_SLOT}`,\n );\n }\n\n // Only upgrade undeployed accounts (storage 0) or deployed light accounts, else error.\n if (\n fromHex(storage, \"number\") !== 0 &&\n !expectedImplAddresses.some((x) => x === lowerAddress(trim(storage)))\n ) {\n throw new BaseError(\n `could not determine if smart account implementation is ${type} ${String(\n version,\n )}`,\n );\n }\n\n return encodeFunctionData({\n abi,\n functionName: \"upgradeToAndCall\",\n args: [upgradeToAddress, upgradeToInitData],\n });\n };\n\n const get1271Wrapper = (\n hashedMessage: Hex,\n version: string,\n ): TypedDataDefinition => {\n return {\n // EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\n // https://github.com/alchemyplatform/light-account/blob/main/src/LightAccount.sol#L236\n domain: {\n chainId: client.chain.id,\n name: type,\n verifyingContract: accountAddress,\n version,\n },\n types: {\n LightAccountMessage: [{ name: \"message\", type: \"bytes\" }],\n },\n message: {\n message: hashedMessage,\n },\n primaryType: \"LightAccountMessage\",\n };\n };\n\n const prepareSignature = async (\n params: SignatureRequest,\n ): Promise<SignatureRequest> => {\n const messageHash =\n params.type === \"eth_signTypedData_v4\"\n ? hashTypedData(params.data)\n : hashMessage(params.data);\n\n switch (version) {\n case \"v1.0.1\":\n return params;\n case \"v1.0.2\":\n throw new BaseError(\n `Version ${String(version)} of LightAccount doesn't support 1271`,\n );\n case \"v1.1.0\":\n return {\n type: \"eth_signTypedData_v4\",\n data: get1271Wrapper(messageHash, \"1\"),\n };\n case \"v2.0.0\":\n return {\n type: \"eth_signTypedData_v4\",\n data: get1271Wrapper(messageHash, \"2\"),\n };\n default:\n throw new BaseError(\n `Unknown version ${String(version)} of LightAccount`,\n );\n }\n };\n\n const formatSignature = async (signature: Hex): Promise<Hex> => {\n return version === \"v2.0.0\"\n ? concat([SignaturePrefix.EOA, signature])\n : signature;\n };\n\n const entryPoint = (\n AccountVersionRegistry[type][version] as StaticSmartAccountImplementation\n ).entryPoint;\n\n return await toSmartAccount({\n getFactoryArgs,\n client,\n entryPoint,\n\n async getAddress() {\n return accountAddress;\n },\n\n async encodeCalls(calls) {\n return encodeCalls(calls);\n },\n\n async decodeCalls(data) {\n return decodeCalls(data, accountAddress);\n },\n\n async getStubSignature() {\n const signature =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n\n switch (version) {\n case \"v1.0.1\":\n case \"v1.0.2\":\n case \"v1.1.0\":\n return signature;\n case \"v2.0.0\":\n return concat([SignaturePrefix.EOA, signature]);\n default:\n throw new BaseError(`Unknown version ${type} of ${String(version)}`);\n }\n },\n\n async signMessage({ message }) {\n const signMessageAction = getAction(client, signMessage, \"signMessage\");\n const signTypedDataAction = getAction(\n client,\n signTypedData,\n \"signTypedData\",\n );\n\n const { type, data } = await prepareSignature({\n type: \"personal_sign\",\n data: message,\n });\n\n const sig =\n type === \"eth_signTypedData_v4\"\n ? await signTypedDataAction({\n ...data,\n account: owner,\n })\n : await signMessageAction({ account: owner, message: data });\n\n return formatSignature(sig);\n },\n\n async signTypedData(params) {\n const signMessageAction = getAction(client, signMessage, \"signMessage\");\n const signTypedDataAction = getAction(\n client,\n signTypedData,\n \"signTypedData\",\n );\n\n const { type, data } = await prepareSignature({\n type: \"eth_signTypedData_v4\",\n data: params as TypedDataDefinition,\n });\n\n const sig =\n type === \"eth_signTypedData_v4\"\n ? await signTypedDataAction({\n ...data,\n account: owner,\n })\n : await signMessageAction({ account: owner, message: data });\n\n return formatSignature(sig);\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain.id, ...userOperation } = parameters;\n const userOpHash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...userOperation,\n sender: accountAddress,\n },\n });\n\n const signMessageAction = getAction(client, signMessage, \"signMessage\");\n\n const signature = await signMessageAction({\n account: owner,\n message: { raw: userOpHash },\n });\n\n return version === \"v2.0.0\"\n ? concatHex([SignaturePrefix.EOA, signature])\n : signature;\n },\n\n extend: {\n smartAccountType: type,\n getLightAccountVersion: () => version,\n encodeUpgradeToAndCall,\n prepareSignature,\n formatSignature,\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n concatHex,\n encodeFunctionData,\n fromHex,\n hashMessage,\n hashTypedData,\n trim,\n type Abi,\n type Address,\n type Chain,\n type Client,\n type Hex,\n type JsonRpcAccount,\n type LocalAccount,\n type Transport,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n getUserOperationHash,\n getUserOperationTypedData,\n toSmartAccount,\n type SmartAccountImplementation,\n} from \"viem/account-abstraction\";\nimport { getStorageAt, signMessage, signTypedData } from \"viem/actions\";\nimport type {\n EntryPointFromAccountRegistry,\n LightAccountType,\n LightAccountVersion,\n} from \"../registry.js\";\nimport { EIP1967_PROXY_IMPL_STORAGE_SLOT } from \"../utils.js\";\nimport { AccountVersionRegistry, isLightAccountVersion2 } from \"../registry.js\";\nimport {\n encodeCallsLA as encodeCalls,\n decodeCallsLA as decodeCalls,\n} from \"./calldataCodec.js\";\nimport { BaseError, lowerAddress } from \"@alchemy/common\";\nimport type {\n SignatureRequest,\n StaticSmartAccountImplementation,\n SmartAccountWithDecodeCalls,\n} from \"../../types.js\";\nimport { getAction } from \"viem/utils\";\n\nconst SignaturePrefix = {\n EOA: \"0x00\",\n CONTRACT: \"0x01\",\n CONTRACT_WITH_ADDR: \"0x02\",\n} as const;\n\nexport type BaseLightAccountImplementation<\n TLightAccountType extends LightAccountType = LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n> = SmartAccountImplementation<\n EntryPointFromAccountRegistry<TLightAccountType, TLightAccountVersion>[\"abi\"],\n EntryPointFromAccountRegistry<\n TLightAccountType,\n TLightAccountVersion\n >[\"version\"],\n {\n getLightAccountVersion: () => TLightAccountVersion;\n smartAccountType: TLightAccountType;\n encodeUpgradeToAndCall: (params: {\n upgradeToAddress: Address;\n upgradeToInitData: Hex;\n }) => Promise<Hex>;\n prepareSignature: (request: SignatureRequest) => Promise<SignatureRequest>;\n formatSignature: (signature: Hex) => Promise<Hex>;\n },\n false\n>;\n\nexport type LightAccountBase<\n TLightAccountType extends LightAccountType = LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n> = SmartAccountWithDecodeCalls<\n BaseLightAccountImplementation<TLightAccountType, TLightAccountVersion>\n>;\n\nexport type ToLightAccountBaseParams<\n TLightAccountType extends LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n TTransport extends Transport = Transport,\n> = {\n client: Client<TTransport, Chain, JsonRpcAccount | LocalAccount | undefined>;\n abi: Abi;\n accountAddress: Address;\n owner: JsonRpcAccount | LocalAccount;\n type: TLightAccountType;\n version: TLightAccountVersion;\n getFactoryArgs: () => Promise<{\n factory?: Address | undefined;\n factoryData?: Hex | undefined;\n }>;\n};\n\nexport async function toLightAccountBase<\n TLightAccountType extends LightAccountType,\n TLightAccountVersion extends\n LightAccountVersion<TLightAccountType> = LightAccountVersion<TLightAccountType>,\n TTransport extends Transport = Transport,\n>({\n client,\n abi,\n accountAddress,\n owner,\n type,\n version,\n getFactoryArgs,\n}: ToLightAccountBaseParams<\n TLightAccountType,\n TLightAccountVersion,\n TTransport\n>): Promise<LightAccountBase<TLightAccountType, TLightAccountVersion>> {\n const encodeUpgradeToAndCall = async ({\n upgradeToAddress,\n upgradeToInitData,\n }: {\n upgradeToAddress: Address;\n upgradeToInitData: Hex;\n }): Promise<Hex> => {\n const expectedImplAddresses = (\n Object.values(\n AccountVersionRegistry[type],\n ) as StaticSmartAccountImplementation<false>[]\n ).map((x) => x.accountImplementation);\n\n const getStorageAtAction = getAction(client, getStorageAt, \"getStorageAt\");\n // TODO(v5): This is a super fragile workflow, and we should consider not supporting this on the SmartAccount level in v5.\n const storage = await getStorageAtAction({\n address: accountAddress,\n slot: EIP1967_PROXY_IMPL_STORAGE_SLOT,\n });\n\n if (storage == null) {\n throw new BaseError(\n `Failed to get storage slot: ${EIP1967_PROXY_IMPL_STORAGE_SLOT}`,\n );\n }\n\n // Only upgrade undeployed accounts (storage 0) or deployed light accounts, else error.\n if (\n fromHex(storage, \"number\") !== 0 &&\n !expectedImplAddresses.some((x) => x === lowerAddress(trim(storage)))\n ) {\n throw new BaseError(\n `could not determine if smart account implementation is ${type} ${String(\n version,\n )}`,\n );\n }\n\n return encodeFunctionData({\n abi,\n functionName: \"upgradeToAndCall\",\n args: [upgradeToAddress, upgradeToInitData],\n });\n };\n\n const get1271Wrapper = (\n hashedMessage: Hex,\n version: string,\n ): TypedDataDefinition => {\n return {\n // EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\n // https://github.com/alchemyplatform/light-account/blob/main/src/LightAccount.sol#L236\n domain: {\n chainId: client.chain.id,\n name: type,\n verifyingContract: accountAddress,\n version,\n },\n types: {\n LightAccountMessage: [{ name: \"message\", type: \"bytes\" }],\n },\n message: {\n message: hashedMessage,\n },\n primaryType: \"LightAccountMessage\",\n };\n };\n\n const prepareSignature = async (\n params: SignatureRequest,\n ): Promise<SignatureRequest> => {\n const messageHash =\n params.type === \"eth_signTypedData_v4\"\n ? hashTypedData(params.data)\n : hashMessage(params.data);\n\n switch (version) {\n case \"v1.0.1\":\n return params;\n case \"v1.0.2\":\n throw new BaseError(\n `Version ${String(version)} of LightAccount doesn't support 1271`,\n );\n case \"v1.1.0\":\n return {\n type: \"eth_signTypedData_v4\",\n data: get1271Wrapper(messageHash, \"1\"),\n };\n case \"v2.0.0\":\n case \"v2.1.0\":\n case \"v2.2.0\":\n return {\n type: \"eth_signTypedData_v4\",\n data: get1271Wrapper(messageHash, \"2\"),\n };\n default:\n throw new BaseError(\n `Unknown version ${String(version)} of LightAccount`,\n );\n }\n };\n\n const formatSignature = async (signature: Hex): Promise<Hex> => {\n return isLightAccountVersion2(\n version as LightAccountVersion<\"LightAccount\">,\n )\n ? concatHex([SignaturePrefix.EOA, signature])\n : signature;\n };\n\n const entryPoint = (\n AccountVersionRegistry[type][version] as StaticSmartAccountImplementation\n ).entryPoint;\n\n return await toSmartAccount({\n getFactoryArgs,\n client,\n entryPoint,\n\n async getAddress() {\n return accountAddress;\n },\n\n async encodeCalls(calls) {\n return encodeCalls(calls);\n },\n\n async decodeCalls(data) {\n return decodeCalls(data, accountAddress);\n },\n\n async getStubSignature() {\n const signature =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n\n switch (version) {\n case \"v1.0.1\":\n case \"v1.0.2\":\n case \"v1.1.0\":\n return signature;\n case \"v2.0.0\":\n case \"v2.1.0\":\n case \"v2.2.0\":\n return concatHex([SignaturePrefix.EOA, signature]);\n default:\n throw new BaseError(`Unknown version ${type} of ${String(version)}`);\n }\n },\n\n async signMessage({ message }) {\n const signMessageAction = getAction(client, signMessage, \"signMessage\");\n const signTypedDataAction = getAction(\n client,\n signTypedData,\n \"signTypedData\",\n );\n\n const { type, data } = await prepareSignature({\n type: \"personal_sign\",\n data: message,\n });\n\n const sig =\n type === \"eth_signTypedData_v4\"\n ? await signTypedDataAction({\n ...data,\n account: owner,\n })\n : await signMessageAction({ account: owner, message: data });\n\n return formatSignature(sig);\n },\n\n async signTypedData(params) {\n const signMessageAction = getAction(client, signMessage, \"signMessage\");\n const signTypedDataAction = getAction(\n client,\n signTypedData,\n \"signTypedData\",\n );\n\n const { type, data } = await prepareSignature({\n type: \"eth_signTypedData_v4\",\n data: params as TypedDataDefinition,\n });\n\n const sig =\n type === \"eth_signTypedData_v4\"\n ? await signTypedDataAction({\n ...data,\n account: owner,\n })\n : await signMessageAction({ account: owner, message: data });\n\n return formatSignature(sig);\n },\n\n async signUserOperation(parameters) {\n const { chainId = client.chain.id, ...userOperation } = parameters;\n let signature: Hex;\n\n switch (version) {\n case \"v1.0.1\":\n case \"v1.0.2\":\n case \"v1.1.0\":\n case \"v2.0.0\":\n const userOpHash = getUserOperationHash({\n chainId,\n entryPointAddress: entryPoint.address,\n entryPointVersion: entryPoint.version,\n userOperation: {\n ...userOperation,\n sender: accountAddress,\n },\n });\n\n const signMessageAction = getAction(\n client,\n signMessage,\n \"signMessage\",\n );\n\n signature = await signMessageAction({\n account: owner,\n message: { raw: userOpHash },\n });\n break;\n case \"v2.1.0\":\n case \"v2.2.0\":\n const signTypedDataAction = getAction(\n client,\n signTypedData,\n \"signTypedData\",\n );\n\n signature = await signTypedDataAction({\n account: owner,\n ...getUserOperationTypedData({\n chainId,\n entryPointAddress: entryPoint.address,\n userOperation: {\n ...userOperation,\n sender: accountAddress,\n },\n }),\n });\n break;\n default:\n throw new BaseError(`Unknown version ${type} of ${String(version)}`);\n }\n\n return formatSignature(signature);\n },\n\n extend: {\n smartAccountType: type,\n getLightAccountVersion: () => version,\n encodeUpgradeToAndCall,\n prepareSignature,\n formatSignature,\n },\n });\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { decodeFunctionData, encodeFunctionData, } from "viem";
|
|
2
2
|
import { LightAccountAbi_v1 } from "../abis/LightAccountAbi_v1.js";
|
|
3
|
+
import { BaseError } from "@alchemy/common";
|
|
3
4
|
// Conveniently, all variants of LA up to v2.0.0 use the same function signatures for `execute` and `executeBatch`.
|
|
4
5
|
export function encodeCallsLA(calls) {
|
|
5
6
|
if (calls.length === 1) {
|
|
@@ -41,7 +42,7 @@ export function decodeCallsLA(data, accountAddress) {
|
|
|
41
42
|
if (isThreeTupleArray(decoded.args)) {
|
|
42
43
|
const [targets, values, datas] = decoded.args;
|
|
43
44
|
if (targets.length !== values.length || targets.length !== datas.length) {
|
|
44
|
-
throw new
|
|
45
|
+
throw new BaseError("Invalid arguments for executeBatch");
|
|
45
46
|
}
|
|
46
47
|
return targets.map((to, index) => ({
|
|
47
48
|
to,
|
|
@@ -52,7 +53,7 @@ export function decodeCallsLA(data, accountAddress) {
|
|
|
52
53
|
// Two tuple array (no values)
|
|
53
54
|
const [targets, datas] = decoded.args;
|
|
54
55
|
if (targets.length !== datas.length) {
|
|
55
|
-
throw new
|
|
56
|
+
throw new BaseError("Invalid arguments for executeBatch");
|
|
56
57
|
}
|
|
57
58
|
return targets.map((to, index) => ({
|
|
58
59
|
to,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calldataCodec.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/calldataCodec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAInB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"calldataCodec.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/calldataCodec.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n decodeFunctionData,\n encodeFunctionData,\n type Address,\n type Call,\n type Hex,\n} from \"viem\";\nimport { LightAccountAbi_v1 } from \"../abis/LightAccountAbi_v1.js\";\nimport { BaseError } from \"@alchemy/common\";\n\n// Conveniently, all variants of LA up to v2.0.0 use the same function signatures for `execute` and `executeBatch`.\n\nexport function encodeCallsLA(calls: readonly Call[]): Hex {\n if (calls.length === 1) {\n return encodeFunctionData({\n abi: LightAccountAbi_v1,\n functionName: \"execute\",\n args: [calls[0].to, calls[0].value ?? 0n, calls[0].data ?? \"0x\"],\n });\n }\n\n const [targets, values, datas, hasValue] = calls.reduce(\n (accum, curr) => {\n accum[0].push(curr.to);\n accum[1].push(curr.value ?? 0n);\n accum[2].push(curr.data ?? \"0x\");\n accum[3] = accum[3] || (curr.value ?? 0n) !== 0n;\n return accum;\n },\n [[], [], [], false] as [Address[], bigint[], Hex[], boolean],\n );\n\n return encodeFunctionData({\n abi: LightAccountAbi_v1,\n functionName: \"executeBatch\",\n args: hasValue ? [targets, values, datas] : [targets, datas],\n });\n}\n\nexport function decodeCallsLA(data: Hex, accountAddress: Address): Call[] {\n const decoded = decodeFunctionData({\n abi: LightAccountAbi_v1,\n data,\n });\n\n if (decoded.functionName === \"execute\") {\n return [\n {\n to: decoded.args[0],\n data: decoded.args[2],\n ...(decoded.args[1] !== undefined ? { value: decoded.args[1] } : {}),\n },\n ];\n }\n\n if (decoded.functionName === \"executeBatch\") {\n // This function is overloaded - may or may not have an array for values.\n\n if (isThreeTupleArray(decoded.args)) {\n const [targets, values, datas] = decoded.args;\n\n if (targets.length !== values.length || targets.length !== datas.length) {\n throw new BaseError(\"Invalid arguments for executeBatch\");\n }\n\n return targets.map((to, index) => ({\n to,\n value: values[index],\n data: datas[index],\n }));\n }\n\n // Two tuple array (no values)\n const [targets, datas] = decoded.args;\n\n if (targets.length !== datas.length) {\n throw new BaseError(\"Invalid arguments for executeBatch\");\n }\n\n return targets.map((to, index) => ({\n to,\n data: datas[index],\n }));\n }\n\n // Otherwise, treat the call as a single call to the account itself.\n return [\n {\n to: accountAddress,\n data,\n },\n ];\n}\n\n// Needed to narrow types for LAv1 `executeBatch` function.\nfunction isThreeTupleArray(\n input:\n | readonly [readonly Address[], readonly Hex[]]\n | readonly [readonly Address[], readonly bigint[], readonly Hex[]],\n): input is readonly [readonly Address[], readonly bigint[], readonly Hex[]] {\n return input.length === 3;\n}\n"]}
|
|
@@ -9,11 +9,15 @@ export type ToMultiOwnerLightAccountParams = {
|
|
|
9
9
|
owners: [OneOf<JsonRpcAccount | LocalAccount>, ...{
|
|
10
10
|
address: Address;
|
|
11
11
|
}[]];
|
|
12
|
-
salt?: bigint;
|
|
13
12
|
accountAddress?: Address;
|
|
14
13
|
factory?: Address;
|
|
14
|
+
} & ({
|
|
15
|
+
salt?: bigint;
|
|
16
|
+
factoryData?: never;
|
|
17
|
+
} | {
|
|
18
|
+
salt?: never;
|
|
15
19
|
factoryData?: Hex;
|
|
16
|
-
};
|
|
20
|
+
});
|
|
17
21
|
/**
|
|
18
22
|
* Creates a multi-owner light account.
|
|
19
23
|
*
|
|
@@ -2,7 +2,7 @@ import { encodeFunctionData, hexToBigInt, } from "viem";
|
|
|
2
2
|
import { readContract } from "viem/actions";
|
|
3
3
|
import { MultiOwnerLightAccountAbi } from "../abis/MultiOwnerLightAccountAbi.js";
|
|
4
4
|
import { MultiOwnerLightAccountFactoryAbi } from "../abis/MultiOwnerLightAccountFactoryAbi.js";
|
|
5
|
-
import { predictMultiOwnerLightAccountAddress } from "../predictAddress.js";
|
|
5
|
+
import { getMultiOwnerLightAccountAddressFromFactoryData, predictMultiOwnerLightAccountAddress, } from "../predictAddress.js";
|
|
6
6
|
import { toLightAccountBase } from "./base.js";
|
|
7
7
|
import { BaseError, lowerAddress } from "@alchemy/common";
|
|
8
8
|
import { getAction } from "viem/utils";
|
|
@@ -23,11 +23,19 @@ export async function toMultiOwnerLightAccount({ client, salt = 0n, owners, acco
|
|
|
23
23
|
return bigintA < bigintB ? -1 : bigintA > bigintB ? 1 : 0;
|
|
24
24
|
});
|
|
25
25
|
const accountAddress = accountAddress_ ??
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
(factoryData_
|
|
27
|
+
? await getMultiOwnerLightAccountAddressFromFactoryData({
|
|
28
|
+
client,
|
|
29
|
+
factoryAddress: factory,
|
|
30
|
+
factoryData: factoryData_,
|
|
31
|
+
entryPoint: AccountVersionRegistry["MultiOwnerLightAccount"]["v2.0.0"]
|
|
32
|
+
.entryPoint,
|
|
33
|
+
})
|
|
34
|
+
: predictMultiOwnerLightAccountAddress({
|
|
35
|
+
factoryAddress: factory,
|
|
36
|
+
salt,
|
|
37
|
+
ownerAddresses: sortedOwners,
|
|
38
|
+
}));
|
|
31
39
|
const getFactoryArgs = async () => {
|
|
32
40
|
const factoryData = factoryData_ ??
|
|
33
41
|
encodeFunctionData({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-owner-account.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/multi-owner-account.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,WAAW,GASZ,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,
|
|
1
|
+
{"version":3,"file":"multi-owner-account.js","sourceRoot":"","sources":["../../../../src/light-account/accounts/multi-owner-account.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n encodeFunctionData,\n hexToBigInt,\n type Address,\n type Chain,\n type Client,\n type Hex,\n type JsonRpcAccount,\n type LocalAccount,\n type OneOf,\n type Transport,\n} from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { MultiOwnerLightAccountAbi } from \"../abis/MultiOwnerLightAccountAbi.js\";\nimport { MultiOwnerLightAccountFactoryAbi } from \"../abis/MultiOwnerLightAccountFactoryAbi.js\";\nimport {\n getMultiOwnerLightAccountAddressFromFactoryData,\n predictMultiOwnerLightAccountAddress,\n} from \"../predictAddress.js\";\nimport { toLightAccountBase, type LightAccountBase } from \"./base.js\";\nimport { BaseError, lowerAddress } from \"@alchemy/common\";\nimport { getAction } from \"viem/utils\";\nimport { AccountVersionRegistry } from \"../registry.js\";\n\nexport type MultiOwnerLightAccount = LightAccountBase<\n \"MultiOwnerLightAccount\",\n \"v2.0.0\"\n> & {\n encodeUpdateOwners: (\n ownersToAdd: Address[],\n ownersToRemove: Address[],\n ) => Hex;\n getOwnerAddresses: () => Promise<readonly Address[]>;\n};\n\nexport type ToMultiOwnerLightAccountParams = {\n client: Client<Transport, Chain, JsonRpcAccount | LocalAccount | undefined>;\n owners: [OneOf<JsonRpcAccount | LocalAccount>, ...{ address: Address }[]];\n accountAddress?: Address;\n factory?: Address;\n} & (\n | { salt?: bigint; factoryData?: never }\n | { salt?: never; factoryData?: Hex }\n);\n\n/**\n * Creates a multi-owner light account.\n *\n * @param {ToMultiOwnerLightAccountParams} param0 - The parameters for creating a multi-owner light account.\n * @returns {Promise<MultiOwnerLightAccount<TSigner>>} A multi-owner light account.\n */\nexport async function toMultiOwnerLightAccount({\n client,\n salt = 0n,\n owners,\n accountAddress: accountAddress_,\n factory = AccountVersionRegistry.MultiOwnerLightAccount[\"v2.0.0\"]\n .factoryAddress,\n factoryData: factoryData_,\n}: ToMultiOwnerLightAccountParams): Promise<MultiOwnerLightAccount> {\n const signer = owners[0];\n\n const dedupedOwners = Array.from(\n new Set(owners.map((it) => lowerAddress(it.address))),\n );\n\n const sortedOwners = dedupedOwners.sort((a, b) => {\n const bigintA = hexToBigInt(a);\n const bigintB = hexToBigInt(b);\n return bigintA < bigintB ? -1 : bigintA > bigintB ? 1 : 0;\n });\n\n const accountAddress =\n accountAddress_ ??\n (factoryData_\n ? await getMultiOwnerLightAccountAddressFromFactoryData({\n client,\n factoryAddress: factory,\n factoryData: factoryData_,\n entryPoint:\n AccountVersionRegistry[\"MultiOwnerLightAccount\"][\"v2.0.0\"]\n .entryPoint,\n })\n : predictMultiOwnerLightAccountAddress({\n factoryAddress: factory,\n salt,\n ownerAddresses: sortedOwners,\n }));\n\n const getFactoryArgs = async () => {\n const factoryData =\n factoryData_ ??\n encodeFunctionData({\n abi: MultiOwnerLightAccountFactoryAbi,\n functionName: \"createAccount\",\n args: [sortedOwners, salt],\n });\n\n return {\n factory,\n factoryData,\n };\n };\n\n const baseAccount = await toLightAccountBase({\n client,\n owner: signer,\n abi: MultiOwnerLightAccountAbi,\n accountAddress,\n type: \"MultiOwnerLightAccount\",\n version: \"v2.0.0\",\n getFactoryArgs,\n });\n\n return {\n ...baseAccount,\n\n encodeUpdateOwners: (ownersToAdd: Address[], ownersToRemove: Address[]) => {\n return encodeFunctionData({\n abi: MultiOwnerLightAccountAbi,\n functionName: \"updateOwners\",\n args: [ownersToAdd, ownersToRemove],\n });\n },\n\n async getOwnerAddresses(): Promise<readonly Address[]> {\n const readContractAction = getAction(\n client,\n readContract,\n \"readContract\",\n );\n const ownersOnChain = await readContractAction({\n address: accountAddress,\n abi: MultiOwnerLightAccountAbi,\n functionName: \"owners\",\n });\n\n if (ownersOnChain == null) {\n throw new BaseError(\"could not get on-chain owners\");\n }\n\n if (\n !ownersOnChain\n .map((it) => lowerAddress(it))\n .includes(lowerAddress(signer.address))\n ) {\n throw new BaseError(\n \"on-chain owners does not include the current signer\",\n );\n }\n\n return ownersOnChain;\n },\n };\n}\n"]}
|