@rhinestone/sdk 2.2.2 → 2.2.5

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.
Files changed (59) hide show
  1. package/dist/src/accounts/adapters/kernel.d.ts.map +1 -1
  2. package/dist/src/accounts/adapters/kernel.js +3 -6
  3. package/dist/src/accounts/adapters/nexus.d.ts.map +1 -1
  4. package/dist/src/accounts/adapters/nexus.js +3 -6
  5. package/dist/src/accounts/adapters/safe.d.ts.map +1 -1
  6. package/dist/src/accounts/adapters/safe.js +7 -5
  7. package/dist/src/accounts/adapters/shared.d.ts +1 -0
  8. package/dist/src/accounts/adapters/shared.d.ts.map +1 -1
  9. package/dist/src/accounts/adapters/shared.js +7 -0
  10. package/dist/src/accounts/adapters/startale.d.ts.map +1 -1
  11. package/dist/src/accounts/adapters/startale.js +2 -5
  12. package/dist/src/accounts/construction.d.ts +1 -1
  13. package/dist/src/accounts/construction.d.ts.map +1 -1
  14. package/dist/src/accounts/construction.js +63 -15
  15. package/dist/src/accounts/deployment.d.ts +13 -1
  16. package/dist/src/accounts/deployment.d.ts.map +1 -1
  17. package/dist/src/accounts/deployment.js +11 -0
  18. package/dist/src/accounts/error.d.ts +8 -1
  19. package/dist/src/accounts/error.d.ts.map +1 -1
  20. package/dist/src/accounts/error.js +9 -1
  21. package/dist/src/accounts/passkey-install.d.ts +25 -0
  22. package/dist/src/accounts/passkey-install.d.ts.map +1 -0
  23. package/dist/src/accounts/passkey-install.js +105 -0
  24. package/dist/src/api/direct-signing.d.ts.map +1 -1
  25. package/dist/src/api/direct-signing.js +100 -98
  26. package/dist/src/clients/orchestrator/client.js +1 -1
  27. package/dist/src/clients/orchestrator/mappers.d.ts +4 -3
  28. package/dist/src/clients/orchestrator/mappers.d.ts.map +1 -1
  29. package/dist/src/clients/orchestrator/mappers.js +21 -13
  30. package/dist/src/clients/orchestrator/serialization.d.ts +5 -0
  31. package/dist/src/clients/orchestrator/serialization.d.ts.map +1 -0
  32. package/dist/src/clients/orchestrator/serialization.js +11 -0
  33. package/dist/src/clients/orchestrator/wire.d.ts +15 -0
  34. package/dist/src/clients/orchestrator/wire.d.ts.map +1 -1
  35. package/dist/src/clients/orchestrator/wire.gen.d.ts +556 -39
  36. package/dist/src/clients/orchestrator/wire.gen.d.ts.map +1 -1
  37. package/dist/src/errors/index.d.ts +2 -2
  38. package/dist/src/errors/index.d.ts.map +1 -1
  39. package/dist/src/errors/index.js +2 -2
  40. package/dist/src/modules/validators/ens.d.ts.map +1 -1
  41. package/dist/src/modules/validators/ens.js +2 -1
  42. package/dist/src/modules/validators/ordering.d.ts +3 -0
  43. package/dist/src/modules/validators/ordering.d.ts.map +1 -0
  44. package/dist/src/modules/validators/ordering.js +11 -0
  45. package/dist/src/modules/validators/resolve.d.ts +3 -2
  46. package/dist/src/modules/validators/resolve.d.ts.map +1 -1
  47. package/dist/src/modules/validators/resolve.js +8 -5
  48. package/dist/src/modules/validators/webauthn.d.ts +20 -1
  49. package/dist/src/modules/validators/webauthn.d.ts.map +1 -1
  50. package/dist/src/modules/validators/webauthn.js +58 -7
  51. package/dist/src/signing/message.d.ts +2 -0
  52. package/dist/src/signing/message.d.ts.map +1 -1
  53. package/dist/src/signing/message.js +1 -1
  54. package/dist/src/signing/protocols/erc7739.js +1 -8
  55. package/dist/src/signing/typed-data.d.ts.map +1 -1
  56. package/dist/src/signing/typed-data.js +5 -10
  57. package/dist/src/signing/types.d.ts +0 -4
  58. package/dist/src/signing/types.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,GAAG,EAOT,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAKnD,eAAO,MAAM,6BAA6B,EACxC,4CAAqD,CAAA;AAQvD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,CAgBzE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,EAAE,CA2CxE;AAyED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAmChB"}
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,GAAG,EAMT,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAQhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAKnD,eAAO,MAAM,6BAA6B,EACxC,4CAAqD,CAAA;AAQvD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,CAgBzE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,EAAE,CA2CxE;AAsED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAmChB"}
@@ -1,6 +1,6 @@
1
- import { concat, concatHex, decodeAbiParameters, decodeFunctionData, domainSeparator, encodeAbiParameters, encodeFunctionData, getContractAddress, keccak256, parseAbi, stringToHex, toHex, zeroAddress, zeroHash, } from 'viem';
1
+ import { concat, concatHex, decodeAbiParameters, decodeFunctionData, domainSeparator, encodeAbiParameters, encodeFunctionData, getContractAddress, keccak256, parseAbi, stringToHex, toHex, zeroAddress, } from 'viem';
2
2
  import { moduleTypeId } from '../../modules/erc7579-abi.js';
3
- import { deploymentPlan } from '../deployment.js';
3
+ import { deploymentPlan, KERNEL_SALT_DEFAULTS, selectedValue, } from '../deployment.js';
4
4
  import { encodeErc7579Calls } from '../erc7579-calls.js';
5
5
  import { encodeUninstallModule } from './shared.js';
6
6
  const KERNEL_META_FACTORY_ADDRESS = '0xd703aae79538628d27099b8c4f621be4ccd142d5';
@@ -99,10 +99,7 @@ function kernelMaterial(input) {
99
99
  initConfig,
100
100
  ],
101
101
  });
102
- salt =
103
- input.account.salt.source === 'explicit'
104
- ? input.account.salt.value
105
- : zeroHash;
102
+ salt = selectedValue(input.account.salt, KERNEL_SALT_DEFAULTS);
106
103
  factoryData = encodeFunctionData({
107
104
  abi: parseAbi(['function deployWithFactory(address,bytes,bytes32)']),
108
105
  functionName: 'deployWithFactory',
@@ -1 +1 @@
1
- {"version":3,"file":"nexus.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/nexus.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,GAAG,EAKT,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,eAAe,CAAA;AAEvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAOnD,eAAO,MAAM,4BAA4B,EACvC,4CAAqD,CAAA;AACvD,eAAO,MAAM,qBAAqB,EAChC,4CAAqD,CAAA;AAIvD,eAAO,MAAM,0BAA0B,EACrC,4CAAqD,CAAA;AACvD,eAAO,MAAM,mBAAmB,EAC9B,4CAAqD,CAAA;AAmCvD,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CACpB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,mBAAmB,GACzB,uBAAuB,CAwHzB;AA4CD,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAoChB"}
1
+ {"version":3,"file":"nexus.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/nexus.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,GAAG,EAIT,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAOnD,eAAO,MAAM,4BAA4B,EACvC,4CAAqD,CAAA;AACvD,eAAO,MAAM,qBAAqB,EAChC,4CAAqD,CAAA;AAIvD,eAAO,MAAM,0BAA0B,EACrC,4CAAqD,CAAA;AACvD,eAAO,MAAM,mBAAmB,EAC9B,4CAAqD,CAAA;AAmCvD,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CACpB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,mBAAmB,GACzB,uBAAuB,CAqHzB;AA4CD,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAoChB"}
@@ -1,6 +1,6 @@
1
- import { concat, decodeFunctionData, encodeAbiParameters, encodeFunctionData, encodePacked, getContractAddress, keccak256, parseAbi, size, zeroAddress, } from 'viem';
1
+ import { concat, decodeFunctionData, encodeAbiParameters, encodeFunctionData, encodePacked, getContractAddress, parseAbi, size, zeroAddress, } from 'viem';
2
2
  import { OWNABLE_VALIDATOR_ADDRESS } from '../../modules/validators/ownable.js';
3
- import { deploymentPlan } from '../deployment.js';
3
+ import { deploymentPlan, NEXUS_SALT_DEFAULTS, selectedValue, } from '../deployment.js';
4
4
  import { encodeErc7579Calls } from '../erc7579-calls.js';
5
5
  import { encodeAddressEnvelope, encodeInstallModule, encodeUninstallModule, } from './shared.js';
6
6
  export const NEXUS_IMPLEMENTATION_ADDRESS = '0x000000000032ddc454c3bdcba80484ad5a798705';
@@ -72,10 +72,7 @@ export function nexusMaterial(input) {
72
72
  const deployment = getNexusDeployment(version);
73
73
  factory = deployment.factory;
74
74
  implementation = deployment.implementation;
75
- salt =
76
- input.account.salt.source === 'explicit'
77
- ? input.account.salt.value
78
- : keccak256('0x');
75
+ salt = selectedValue(input.account.salt, NEXUS_SALT_DEFAULTS);
79
76
  const defaultValidator = input.setup.validators.find((module) => module.address === OWNABLE_VALIDATOR_ADDRESS);
80
77
  const defaultValidatorInitData = defaultValidator?.initData ?? '0x';
81
78
  const validators = input.setup.validators.filter((module) => module.address !== OWNABLE_VALIDATOR_ADDRESS);
@@ -1 +1 @@
1
- {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/safe.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,eAAe,CAAA;AAEvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAyHnD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC,CA0D/D;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,mBAAmB,GAChC,cAAc,CA8BhB"}
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/safe.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAyHnD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC,CA2D/D;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,mBAAmB,GAChC,cAAc,CA8BhB"}
@@ -1,8 +1,8 @@
1
1
  import { concat, decodeFunctionData, encodeAbiParameters, encodeFunctionData, encodePacked, getContractAddress, keccak256, parseAbi, parseAbiParameters, zeroAddress, } from 'viem';
2
2
  import { getV0Attesters } from '../../modules/legacy-core.js';
3
- import { deploymentPlan } from '../deployment.js';
3
+ import { deploymentPlan, SAFE_NONCE_DEFAULTS, selectedValue, } from '../deployment.js';
4
4
  import { encodeErc7579Calls } from '../erc7579-calls.js';
5
- import { encodeAddressEnvelope, encodeInstallModule, encodeUninstallModule, primaryOwnerAddresses, primaryThreshold, } from './shared.js';
5
+ import { canonicalOwnerAddresses, encodeAddressEnvelope, encodeInstallModule, encodeUninstallModule, primaryOwnerAddresses, primaryThreshold, } from './shared.js';
6
6
  const SAFE_LAUNCHPAD = '0x75798463024bda64d83c94a64bc7d7eab41300ef';
7
7
  const SAFE_ADAPTER = '0x7579f2ad53b01c3d8779fe17928e0d48885b0003';
8
8
  const SAFE_V0_LAUNCHPAD = '0x7579011ab74c46090561ea277ba79d510c6c00ff';
@@ -75,7 +75,7 @@ function safeMaterial(input) {
75
75
  ]),
76
76
  functionName: 'setup',
77
77
  args: [
78
- [...primaryOwnerAddresses(input.owner)],
78
+ [...canonicalOwnerAddresses(input.owner)],
79
79
  primaryThreshold(input.owner),
80
80
  SAFE_LAUNCHPAD,
81
81
  addSafe7579,
@@ -85,7 +85,7 @@ function safeMaterial(input) {
85
85
  zeroAddress,
86
86
  ],
87
87
  });
88
- const nonce = input.account.nonce.source === 'explicit' ? input.account.nonce.value : 0n;
88
+ const nonce = selectedValue(input.account.nonce, SAFE_NONCE_DEFAULTS);
89
89
  factoryData = encodeFunctionData({
90
90
  abi: parseAbi([
91
91
  'function createProxyWithNonce(address singleton,bytes initializer,uint256 saltNonce)',
@@ -139,6 +139,8 @@ export function safeV0FactoryMaterial(input) {
139
139
  ]),
140
140
  functionName: 'setup',
141
141
  args: [
142
+ // Caller order, not canonical order: this path reconstructs accounts that
143
+ // SDK v0 already deployed from the owner list as it was supplied.
142
144
  [...primaryOwnerAddresses(input.owner)],
143
145
  primaryThreshold(input.owner),
144
146
  SAFE_V0_LAUNCHPAD,
@@ -149,7 +151,7 @@ export function safeV0FactoryMaterial(input) {
149
151
  zeroAddress,
150
152
  ],
151
153
  });
152
- const nonce = input.account.nonce.source === 'explicit' ? input.account.nonce.value : 0n;
154
+ const nonce = selectedValue(input.account.nonce, SAFE_NONCE_DEFAULTS);
153
155
  return {
154
156
  factory: SAFE_FACTORY,
155
157
  factoryData: encodeFunctionData({
@@ -2,6 +2,7 @@ import { type Hex } from 'viem';
2
2
  import type { ResolvedModule } from '../../modules/types.js';
3
3
  import type { ResolvedValidatorDefinition } from '../../modules/validators/types.js';
4
4
  export declare function primaryOwnerAddresses(validator: ResolvedValidatorDefinition): readonly `0x${string}`[];
5
+ export declare function canonicalOwnerAddresses(validator: ResolvedValidatorDefinition): readonly `0x${string}`[];
5
6
  export declare function primaryThreshold(validator: ResolvedValidatorDefinition): bigint;
6
7
  export declare function encodeInstallModule(module: ResolvedModule): Hex;
7
8
  export declare function encodeUninstallModule(module: ResolvedModule): Hex;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,GAAG,EAAe,MAAM,MAAM,CAAA;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAEjF,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,2BAA2B,GACrC,SAAS,KAAK,MAAM,EAAE,EAAE,CAU1B;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,2BAA2B,GACrC,MAAM,CAMR;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAkB/D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAkBjE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,KAAK,MAAM,EAAE,EACxB,SAAS,EAAE,GAAG,EACd,gBAAgB,CAAC,EAAE,KAAK,MAAM,EAAE,GAC/B,GAAG,CAML"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,GAAG,EAAe,MAAM,MAAM,CAAA;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAEjF,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,2BAA2B,GACrC,SAAS,KAAK,MAAM,EAAE,EAAE,CAU1B;AAKD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,2BAA2B,GACrC,SAAS,KAAK,MAAM,EAAE,EAAE,CAE1B;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,2BAA2B,GACrC,MAAM,CAMR;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAkB/D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAkBjE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,KAAK,MAAM,EAAE,EACxB,SAAS,EAAE,GAAG,EACd,gBAAgB,CAAC,EAAE,KAAK,MAAM,EAAE,GAC/B,GAAG,CAML"}
@@ -1,5 +1,6 @@
1
1
  import { encodeFunctionData, encodePacked, zeroAddress } from 'viem';
2
2
  import { moduleTypeId } from '../../modules/erc7579-abi.js';
3
+ import { compareHexValues } from '../../modules/validators/ordering.js';
3
4
  export function primaryOwnerAddresses(validator) {
4
5
  if (validator.kind === 'passkey' || validator.kind === 'multi-factor') {
5
6
  return ['0xbabe99e62d8bcbd3acf5ccbcfcd4f64fe75e5e72'];
@@ -11,6 +12,12 @@ export function primaryOwnerAddresses(validator) {
11
12
  return owner.account.address;
12
13
  });
13
14
  }
15
+ // Safe keeps owners in a linked list and imposes no order on them, but the
16
+ // owner array is part of the `setup` initializer that becomes the account's
17
+ // CREATE2 salt — so it must be ordered by value, never by caller order.
18
+ export function canonicalOwnerAddresses(validator) {
19
+ return [...primaryOwnerAddresses(validator)].sort(compareHexValues);
20
+ }
14
21
  export function primaryThreshold(validator) {
15
22
  return BigInt(validator.kind === 'passkey' || validator.kind === 'multi-factor'
16
23
  ? 1
@@ -1 +1 @@
1
- {"version":3,"file":"startale.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/startale.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAYb,MAAM,MAAM,CAAA;AAEb,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAQnD,OAAO,EAAE,4BAA4B,EAAE,CAAA;AACvC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;;;;;;EAQrE;AAqID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAoChB"}
1
+ {"version":3,"file":"startale.d.ts","sourceRoot":"","sources":["../../../../accounts/adapters/startale.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAYb,MAAM,MAAM,CAAA;AAEb,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAQhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAQnD,OAAO,EAAE,4BAA4B,EAAE,CAAA;AACvC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;;;;;;EAQrE;AAkID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,mBAAmB,GAChC,cAAc,CAoChB"}
@@ -1,6 +1,6 @@
1
1
  import { concat, decodeFunctionData, encodeAbiParameters, encodeFunctionData, encodePacked, keccak256, parseAbi, slice, zeroAddress, zeroHash, } from 'viem';
2
2
  import { K1_DEFAULT_VALIDATOR_ADDRESS } from '../../modules/validators/k1.js';
3
- import { deploymentPlan } from '../deployment.js';
3
+ import { deploymentPlan, STARTALE_SALT_DEFAULTS, selectedValue, } from '../deployment.js';
4
4
  import { encodeErc7579Calls } from '../erc7579-calls.js';
5
5
  import { encodeAddressEnvelope, encodeInstallModule, encodeUninstallModule, primaryOwnerAddresses, } from './shared.js';
6
6
  export { K1_DEFAULT_VALIDATOR_ADDRESS };
@@ -106,10 +106,7 @@ function startaleMaterial(input) {
106
106
  }
107
107
  }
108
108
  else {
109
- salt =
110
- input.account.salt.source === 'explicit'
111
- ? input.account.salt.value
112
- : zeroHash;
109
+ salt = selectedValue(input.account.salt, STARTALE_SALT_DEFAULTS);
113
110
  const initData = startaleInitData(input);
114
111
  factoryData = encodeFunctionData({
115
112
  abi: parseAbi(['function createAccount(bytes,bytes32)']),
@@ -1,4 +1,4 @@
1
- import type { Account } from 'viem';
1
+ import { type Account } from 'viem';
2
2
  import type { EvmChainReference } from '../chains/types.js';
3
3
  import type { ConfiguredModule, ModuleSetup } from '../modules/types.js';
4
4
  import type { ResolvedValidatorDefinition } from '../modules/validators/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"construction.d.ts","sourceRoot":"","sources":["../../../accounts/construction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAErE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,2BAA2B,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,aAAa,CAAA;QAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;QAC/B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;KAC/C,CAAA;CACF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAA;IAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAC7B,GAAG,mBAAmB,CAgCtB"}
1
+ {"version":3,"file":"construction.d.ts","sourceRoot":"","sources":["../../../accounts/construction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAoC,MAAM,MAAM,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAErE,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,6BAA6B,CAAA;AAapC,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,2BAA2B,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,aAAa,CAAA;QAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;QAC/B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;KAC/C,CAAA;CACF;AAqBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAA;IAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAC7B,GAAG,mBAAmB,CAwEtB"}
@@ -1,34 +1,82 @@
1
+ import { keccak256, stringToHex } from 'viem';
1
2
  import { planModuleSetup } from '../modules/plan.js';
2
3
  import { resolveValidator } from '../modules/validators/resolve.js';
4
+ import { orderWebauthnCredentials, toWebauthnInstallCredentials, webauthnDefinitionCredentials, } from '../modules/validators/webauthn.js';
5
+ import { accountSupportsSaltSearch, assertPasskeySetInstallable, selectPasskeyAccount, } from './passkey-install.js';
6
+ import { createAccountAdapter } from './registry.js';
7
+ function passkeyOwner(owner) {
8
+ return owner?.kind === 'passkey' ? owner : undefined;
9
+ }
10
+ function setupFingerprint(input) {
11
+ return keccak256(stringToHex(JSON.stringify(input, (_key, value) => typeof value === 'bigint' ? `${value}n` : value)));
12
+ }
3
13
  export function createAccountConstruction(input) {
4
- const ownerModule = input.material.owner
5
- ? resolveValidator(input.material.owner)
14
+ const material = input.material;
15
+ const passkey = passkeyOwner(material.owner);
16
+ // Caller-pinned init data carrying a factory is used verbatim, so neither the
17
+ // credential order nor the salt has any effect on the deployed account.
18
+ const pinned = material.initData !== undefined && 'factory' in material.initData;
19
+ const knownAddress = material.eoa?.address ?? material.initData?.address;
20
+ const credentials = passkey && !pinned
21
+ ? toWebauthnInstallCredentials(webauthnDefinitionCredentials(passkey))
6
22
  : undefined;
7
- if (!ownerModule && input.material.account.kind !== 'eoa') {
23
+ const searchable = credentials !== undefined &&
24
+ credentials.length > 1 &&
25
+ knownAddress === undefined &&
26
+ accountSupportsSaltSearch(material.account);
27
+ if (credentials && (knownAddress !== undefined || searchable)) {
28
+ assertPasskeySetInstallable({ credentials, atDeployment: searchable });
29
+ }
30
+ const ordering = knownAddress
31
+ ? // The address is already fixed (EIP-7702 adoption or a caller-supplied
32
+ // address), so the exact order the validator requires is computable.
33
+ { kind: 'credential-id', account: knownAddress }
34
+ : searchable
35
+ ? { kind: 'canonical' }
36
+ : undefined;
37
+ const ownerModule = material.owner
38
+ ? resolveValidator(material.owner, ordering)
39
+ : undefined;
40
+ if (!ownerModule && material.account.kind !== 'eoa') {
8
41
  throw new Error('Smart account owner is required');
9
42
  }
10
43
  const setup = input.setup ??
11
44
  (ownerModule
12
45
  ? planModuleSetup({
13
- accountKind: input.material.account.kind,
46
+ accountKind: material.account.kind,
14
47
  owner: ownerModule,
15
- configured: input.material.modules,
16
- environment: input.material.sessions.environment,
17
- sessions: input.material.sessions,
48
+ configured: material.modules,
49
+ environment: material.sessions.environment,
50
+ sessions: material.sessions,
18
51
  })
19
52
  : { validators: [], executors: [], hooks: [], fallbacks: [] });
20
- return {
21
- account: input.material.account,
22
- ...(input.material.owner ? { owner: input.material.owner } : {}),
23
- modules: input.material.modules,
53
+ const base = {
54
+ account: material.account,
55
+ ...(material.owner ? { owner: material.owner } : {}),
56
+ modules: material.modules,
24
57
  setup,
25
58
  sessions: {
26
- enabled: input.material.sessions.enabled,
27
- environment: input.material.sessions.environment,
59
+ enabled: material.sessions.enabled,
60
+ environment: material.sessions.environment,
28
61
  },
29
- ...(input.material.initData ? { initData: input.material.initData } : {}),
30
- ...(input.material.eoa ? { eoa: input.material.eoa } : {}),
62
+ ...(material.initData ? { initData: material.initData } : {}),
63
+ ...(material.eoa ? { eoa: material.eoa } : {}),
31
64
  chain: input.chain,
32
65
  deployed: input.deployed,
33
66
  };
67
+ if (!searchable || !credentials)
68
+ return base;
69
+ // The module setup is salt-independent, so only the account definition varies
70
+ // across attempts.
71
+ const account = selectPasskeyAccount({
72
+ account: material.account,
73
+ credentials: orderWebauthnCredentials(credentials, { kind: 'canonical' }),
74
+ fingerprint: setupFingerprint({ account: material.account, setup }),
75
+ deriveAddress: (candidate) => {
76
+ const construction = { ...base, account: candidate };
77
+ return createAccountAdapter(construction).getIdentity(construction)
78
+ .address;
79
+ },
80
+ });
81
+ return { ...base, account };
34
82
  }
@@ -1,10 +1,22 @@
1
- import type { Address, Hex } from 'viem';
1
+ import { type Address, type Hex } from 'viem';
2
2
  import type { AccountDefinition, AccountDeploymentPlan, AccountInitData, AccountValueSelection } from './types.js';
3
3
  export interface DeploymentMaterial {
4
4
  readonly address: Address;
5
5
  readonly factory?: Address;
6
6
  readonly factoryData?: Hex;
7
7
  }
8
+ export declare const NEXUS_SALT_DEFAULTS: {
9
+ readonly 'nexus-empty-calldata-salt': `0x${string}`;
10
+ };
11
+ export declare const KERNEL_SALT_DEFAULTS: {
12
+ readonly 'kernel-zero-salt': "0x0000000000000000000000000000000000000000000000000000000000000000";
13
+ };
14
+ export declare const STARTALE_SALT_DEFAULTS: {
15
+ readonly 'startale-zero-salt': "0x0000000000000000000000000000000000000000000000000000000000000000";
16
+ };
17
+ export declare const SAFE_NONCE_DEFAULTS: {
18
+ readonly 'safe-zero-nonce': 0n;
19
+ };
8
20
  export declare function selectedValue<Value, Profile extends string>(selection: AccountValueSelection<Value, Profile>, defaults: Readonly<Record<Profile, Value>>): Value;
9
21
  export declare function deploymentPlan(chain: AccountDeploymentPlan['chain'], material: DeploymentMaterial, deployed: boolean): AccountDeploymentPlan;
10
22
  export declare function initDataMaterial(initData: AccountInitData | undefined): DeploymentMaterial | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../accounts/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AACxC,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,CAAA;CAC3B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,SAAS,MAAM,EACzD,SAAS,EAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GACzC,KAAK,CAIP;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,OAAO,GAChB,qBAAqB,CAcvB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,kBAAkB,GAAG,SAAS,CAShC;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,iBAAiB,GAC5B,iBAAiB,CAAC,MAAM,CAAC,CAE3B"}
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../accounts/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAuB,MAAM,MAAM,CAAA;AAClE,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,CAAA;CAC3B;AAID,eAAO,MAAM,mBAAmB;;CAEtB,CAAA;AACV,eAAO,MAAM,oBAAoB;;CAA4C,CAAA;AAC7E,eAAO,MAAM,sBAAsB;;CAEzB,CAAA;AACV,eAAO,MAAM,mBAAmB;;CAAqC,CAAA;AAErE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,SAAS,MAAM,EACzD,SAAS,EAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GACzC,KAAK,CAIP;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,OAAO,GAChB,qBAAqB,CAcvB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,kBAAkB,GAAG,SAAS,CAShC;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,iBAAiB,GAC5B,iBAAiB,CAAC,MAAM,CAAC,CAE3B"}
@@ -1,3 +1,14 @@
1
+ import { keccak256, zeroHash } from 'viem';
2
+ // Salt/nonce defaults live here rather than in the adapters so the passkey salt
3
+ // search grinds the same values the adapters derive addresses from.
4
+ export const NEXUS_SALT_DEFAULTS = {
5
+ 'nexus-empty-calldata-salt': keccak256('0x'),
6
+ };
7
+ export const KERNEL_SALT_DEFAULTS = { 'kernel-zero-salt': zeroHash };
8
+ export const STARTALE_SALT_DEFAULTS = {
9
+ 'startale-zero-salt': zeroHash,
10
+ };
11
+ export const SAFE_NONCE_DEFAULTS = { 'safe-zero-nonce': 0n };
1
12
  export function selectedValue(selection, defaults) {
2
13
  return selection.source === 'explicit'
3
14
  ? selection.value
@@ -99,9 +99,16 @@ declare class OwnersFieldRequiredError extends AccountError {
99
99
  traceId?: string;
100
100
  });
101
101
  }
102
+ declare class PasskeyConfigurationNotInstallableError extends AccountError {
103
+ constructor(reason: string, params?: {
104
+ context?: any;
105
+ errorType?: string;
106
+ traceId?: string;
107
+ });
108
+ }
102
109
  declare class Eip712DomainNotAvailableError extends AccountError {
103
110
  constructor(message: string);
104
111
  }
105
112
  declare function isAccountError(error: Error): error is AccountError;
106
- export { isAccountError, AccountError, Eip712DomainNotAvailableError, Eip7702AccountMustHaveEoaError, EoaAccountMustHaveAccountError, FactoryArgsNotAvailableError, DefaultValidatorAlreadyInitializedError, SigningNotSupportedForAccountError, Eip7702NotSupportedForAccountError, AccountConfigurationNotSupportedError, WalletClientNoConnectedAccountError, ModuleInstallationNotSupportedError, EoaSigningNotSupportedError, EoaSigningMethodNotConfiguredError, OwnersFieldRequiredError, };
113
+ export { isAccountError, AccountError, Eip712DomainNotAvailableError, Eip7702AccountMustHaveEoaError, EoaAccountMustHaveAccountError, FactoryArgsNotAvailableError, DefaultValidatorAlreadyInitializedError, SigningNotSupportedForAccountError, Eip7702NotSupportedForAccountError, AccountConfigurationNotSupportedError, WalletClientNoConnectedAccountError, ModuleInstallationNotSupportedError, EoaSigningNotSupportedError, EoaSigningMethodNotConfiguredError, OwnersFieldRequiredError, PasskeyConfigurationNotInstallableError, };
107
114
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../accounts/error.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../accounts/error.ts"],"names":[],"mappings":"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"}
@@ -121,6 +121,14 @@ class OwnersFieldRequiredError extends AccountError {
121
121
  });
122
122
  }
123
123
  }
124
+ class PasskeyConfigurationNotInstallableError extends AccountError {
125
+ constructor(reason, params) {
126
+ super({
127
+ message: `Passkey owner set cannot be installed on a new account: ${reason}`,
128
+ ...params,
129
+ });
130
+ }
131
+ }
124
132
  class Eip712DomainNotAvailableError extends AccountError {
125
133
  constructor(message) {
126
134
  super({
@@ -147,4 +155,4 @@ function getAccountName(account) {
147
155
  return 'EOA';
148
156
  }
149
157
  }
150
- export { isAccountError, AccountError, Eip712DomainNotAvailableError, Eip7702AccountMustHaveEoaError, EoaAccountMustHaveAccountError, FactoryArgsNotAvailableError, DefaultValidatorAlreadyInitializedError, SigningNotSupportedForAccountError, Eip7702NotSupportedForAccountError, AccountConfigurationNotSupportedError, WalletClientNoConnectedAccountError, ModuleInstallationNotSupportedError, EoaSigningNotSupportedError, EoaSigningMethodNotConfiguredError, OwnersFieldRequiredError, };
158
+ export { isAccountError, AccountError, Eip712DomainNotAvailableError, Eip7702AccountMustHaveEoaError, EoaAccountMustHaveAccountError, FactoryArgsNotAvailableError, DefaultValidatorAlreadyInitializedError, SigningNotSupportedForAccountError, Eip7702NotSupportedForAccountError, AccountConfigurationNotSupportedError, WalletClientNoConnectedAccountError, ModuleInstallationNotSupportedError, EoaSigningNotSupportedError, EoaSigningMethodNotConfiguredError, OwnersFieldRequiredError, PasskeyConfigurationNotInstallableError, };
@@ -0,0 +1,25 @@
1
+ import { type Address, type Hex } from 'viem';
2
+ import { type WebauthnInstallCredential } from '../modules/validators/webauthn.js';
3
+ import type { AccountDefinition } from './types.js';
4
+ export declare const MAX_DEPLOYMENT_PASSKEYS = 6;
5
+ export declare const MAX_PASSKEY_CREDENTIALS = 32;
6
+ export declare const MAX_PASSKEY_SALT_ATTEMPTS = 65536;
7
+ export declare function accountSupportsSaltSearch(account: AccountDefinition): boolean;
8
+ export declare function accountWithSaltAttempt(account: AccountDefinition, attempt: number): AccountDefinition;
9
+ export declare function assertPasskeySetInstallable(input: {
10
+ readonly credentials: readonly WebauthnInstallCredential[];
11
+ readonly atDeployment: boolean;
12
+ }): void;
13
+ /**
14
+ * Picks the account salt whose derived address makes the (canonically ordered)
15
+ * passkey set installable. Deterministic: the same inputs select the same salt
16
+ * on every host and in every run.
17
+ */
18
+ export declare function selectPasskeyAccount(input: {
19
+ readonly account: AccountDefinition;
20
+ readonly credentials: readonly WebauthnInstallCredential[];
21
+ readonly fingerprint: Hex;
22
+ readonly deriveAddress: (account: AccountDefinition) => Address;
23
+ readonly maxAttempts?: number;
24
+ }): AccountDefinition;
25
+ //# sourceMappingURL=passkey-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey-install.d.ts","sourceRoot":"","sources":["../../../accounts/passkey-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAuB,KAAK,GAAG,EAAa,MAAM,MAAM,CAAA;AAC7E,OAAO,EAEL,KAAK,yBAAyB,EAE/B,MAAM,gCAAgC,CAAA;AASvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAOhD,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAGzC,eAAO,MAAM,yBAAyB,QAAS,CAAA;AAK/C,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAO7E;AAaD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,GACd,iBAAiB,CA2DnB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,WAAW,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC1D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;CAC/B,GAAG,IAAI,CAmBP;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC1D,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAA;IAG/D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B,GAAG,iBAAiB,CAgBpB"}
@@ -0,0 +1,105 @@
1
+ import { encodeAbiParameters, keccak256 } from 'viem';
2
+ import { hasDuplicateWebauthnCredentials, webauthnCredentialsAreAscending, } from '../modules/validators/webauthn.js';
3
+ import { KERNEL_SALT_DEFAULTS, NEXUS_SALT_DEFAULTS, SAFE_NONCE_DEFAULTS, STARTALE_SALT_DEFAULTS, selectedValue, } from './deployment.js';
4
+ import { PasskeyConfigurationNotInstallableError } from './error.js';
5
+ // The validator's install data must list credentials with strictly ascending
6
+ // `keccak(x, y, account)`, so the number of salts that have to be tried grows
7
+ // with the factorial of the credential count. Six passkeys is ~0.2s of
8
+ // synchronous work in the worst realistic case; beyond that the remaining
9
+ // passkeys are added after deployment, which the validator accepts in any order.
10
+ export const MAX_DEPLOYMENT_PASSKEYS = 6;
11
+ // The validator's own `MAX_CREDENTIALS`.
12
+ export const MAX_PASSKEY_CREDENTIALS = 32;
13
+ // A fixed attempt count, never a wall-clock budget: a slower host must derive
14
+ // the same address as a faster one.
15
+ export const MAX_PASSKEY_SALT_ATTEMPTS = 65_536;
16
+ const MEMO_LIMIT = 256;
17
+ const memo = new Map();
18
+ export function accountSupportsSaltSearch(account) {
19
+ return (account.kind === 'nexus' ||
20
+ account.kind === 'kernel' ||
21
+ account.kind === 'startale' ||
22
+ account.kind === 'safe');
23
+ }
24
+ function saltAttempt(base, attempt) {
25
+ return keccak256(encodeAbiParameters([{ type: 'bytes32' }, { type: 'uint256' }], [base, BigInt(attempt)]));
26
+ }
27
+ // Attempt 0 is the caller's own salt, so a configuration that already installs
28
+ // cleanly keeps the address it derives today.
29
+ export function accountWithSaltAttempt(account, attempt) {
30
+ if (attempt === 0)
31
+ return account;
32
+ switch (account.kind) {
33
+ case 'nexus':
34
+ return {
35
+ ...account,
36
+ salt: {
37
+ source: 'explicit',
38
+ value: saltAttempt(selectedValue(account.salt, NEXUS_SALT_DEFAULTS), attempt),
39
+ },
40
+ };
41
+ case 'kernel':
42
+ return {
43
+ ...account,
44
+ salt: {
45
+ source: 'explicit',
46
+ value: saltAttempt(selectedValue(account.salt, KERNEL_SALT_DEFAULTS), attempt),
47
+ },
48
+ };
49
+ case 'startale':
50
+ return {
51
+ ...account,
52
+ salt: {
53
+ source: 'explicit',
54
+ value: saltAttempt(selectedValue(account.salt, STARTALE_SALT_DEFAULTS), attempt),
55
+ },
56
+ };
57
+ case 'safe': {
58
+ const nonce = selectedValue(account.nonce, SAFE_NONCE_DEFAULTS);
59
+ return {
60
+ ...account,
61
+ nonce: {
62
+ source: 'explicit',
63
+ value: BigInt(keccak256(encodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], [nonce, BigInt(attempt)]))),
64
+ },
65
+ };
66
+ }
67
+ case 'hca':
68
+ case 'eoa':
69
+ throw new PasskeyConfigurationNotInstallableError(`${account.kind} accounts have no salt to search`);
70
+ }
71
+ }
72
+ export function assertPasskeySetInstallable(input) {
73
+ if (hasDuplicateWebauthnCredentials(input.credentials)) {
74
+ throw new PasskeyConfigurationNotInstallableError('the owner set contains duplicate passkeys');
75
+ }
76
+ if (input.credentials.length > MAX_PASSKEY_CREDENTIALS) {
77
+ throw new PasskeyConfigurationNotInstallableError(`the WebAuthn validator supports at most ${MAX_PASSKEY_CREDENTIALS} passkeys, received ${input.credentials.length}`);
78
+ }
79
+ if (input.atDeployment &&
80
+ input.credentials.length > MAX_DEPLOYMENT_PASSKEYS) {
81
+ throw new PasskeyConfigurationNotInstallableError(`at most ${MAX_DEPLOYMENT_PASSKEYS} passkeys can be installed at deployment, received ${input.credentials.length}. Deploy with ${MAX_DEPLOYMENT_PASSKEYS} or fewer and add the rest with \`passkeys.addOwner\``);
82
+ }
83
+ }
84
+ /**
85
+ * Picks the account salt whose derived address makes the (canonically ordered)
86
+ * passkey set installable. Deterministic: the same inputs select the same salt
87
+ * on every host and in every run.
88
+ */
89
+ export function selectPasskeyAccount(input) {
90
+ const cached = memo.get(input.fingerprint);
91
+ if (cached)
92
+ return cached;
93
+ const maxAttempts = input.maxAttempts ?? MAX_PASSKEY_SALT_ATTEMPTS;
94
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
95
+ const candidate = accountWithSaltAttempt(input.account, attempt);
96
+ const address = input.deriveAddress(candidate);
97
+ if (webauthnCredentialsAreAscending(input.credentials, address)) {
98
+ if (memo.size >= MEMO_LIMIT)
99
+ memo.clear();
100
+ memo.set(input.fingerprint, candidate);
101
+ return candidate;
102
+ }
103
+ }
104
+ throw new PasskeyConfigurationNotInstallableError(`no account salt in ${maxAttempts} attempts installs these ${input.credentials.length} passkeys. Deploy with fewer passkeys and add the rest with \`passkeys.addOwner\``);
105
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"direct-signing.d.ts","sourceRoot":"","sources":["../../../api/direct-signing.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,GAAG,EAGR,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAEzB,MAAM,MAAM,CAAA;AACb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAIxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAA;AAa1F,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,kBAAkB,CAAA;AAEzB,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAA;IAC5C,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAA;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACjE,OAAO,CAAC;IACT,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;CACvC,CAAC,CA4ED;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAA;CAAE,GACvE,OAAO,CAAC;IACT,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;CACvC,CAAC,CAyDD"}
1
+ {"version":3,"file":"direct-signing.d.ts","sourceRoot":"","sources":["../../../api/direct-signing.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,GAAG,EAIR,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAA;AACb,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAIxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAA;AAa1F,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,kBAAkB,CAAA;AAEzB,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAA;IAC5C,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAA;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACjE,OAAO,CAAC;IACT,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;CACvC,CAAC,CAwDD;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAA;CAAE,GACvE,OAAO,CAAC;IACT,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;CACvC,CAAC,CA0DD"}