@rhinestone/sdk 1.0.0-alpha.25 → 1.0.0-alpha.26

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 (53) hide show
  1. package/dist/src/accounts/index.d.ts +10 -3
  2. package/dist/src/accounts/index.d.ts.map +1 -1
  3. package/dist/src/accounts/index.js +114 -36
  4. package/dist/src/accounts/index.test.js +2 -2
  5. package/dist/src/accounts/kernel.d.ts +1 -1
  6. package/dist/src/accounts/kernel.d.ts.map +1 -1
  7. package/dist/src/accounts/kernel.js +28 -1
  8. package/dist/src/accounts/kernel.test.js +37 -4
  9. package/dist/src/accounts/nexus.d.ts +4 -3
  10. package/dist/src/accounts/nexus.d.ts.map +1 -1
  11. package/dist/src/accounts/nexus.js +82 -14
  12. package/dist/src/accounts/nexus.test.js +35 -2
  13. package/dist/src/accounts/safe.d.ts.map +1 -1
  14. package/dist/src/accounts/safe.js +78 -55
  15. package/dist/src/accounts/safe.test.js +35 -2
  16. package/dist/src/accounts/signing/common.d.ts +1 -1
  17. package/dist/src/accounts/signing/common.d.ts.map +1 -1
  18. package/dist/src/accounts/signing/common.js +14 -13
  19. package/dist/src/accounts/signing/message.js +3 -3
  20. package/dist/src/accounts/signing/passkeys.d.ts +8 -1
  21. package/dist/src/accounts/signing/passkeys.d.ts.map +1 -1
  22. package/dist/src/accounts/signing/passkeys.js +35 -0
  23. package/dist/src/accounts/signing/passkeys.test.js +15 -0
  24. package/dist/src/actions/index.d.ts +1 -1
  25. package/dist/src/actions/index.d.ts.map +1 -1
  26. package/dist/src/actions/index.js +3 -6
  27. package/dist/src/actions/index.test.js +11 -11
  28. package/dist/src/execution/index.d.ts +11 -2
  29. package/dist/src/execution/index.d.ts.map +1 -1
  30. package/dist/src/execution/index.js +23 -16
  31. package/dist/src/execution/utils.d.ts +1 -1
  32. package/dist/src/execution/utils.d.ts.map +1 -1
  33. package/dist/src/execution/utils.js +23 -5
  34. package/dist/src/index.d.ts +2 -1
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +12 -0
  37. package/dist/src/modules/index.d.ts +2 -1
  38. package/dist/src/modules/index.d.ts.map +1 -1
  39. package/dist/src/modules/index.js +16 -13
  40. package/dist/src/modules/index.test.js +3 -3
  41. package/dist/src/modules/validators/core.d.ts +4 -3
  42. package/dist/src/modules/validators/core.d.ts.map +1 -1
  43. package/dist/src/modules/validators/core.js +24 -14
  44. package/dist/src/modules/validators/core.test.js +4 -4
  45. package/dist/src/types.d.ts +30 -20
  46. package/dist/src/types.d.ts.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/src/accounts/custom.d.ts +0 -18
  49. package/dist/src/accounts/custom.d.ts.map +0 -1
  50. package/dist/src/accounts/custom.js +0 -121
  51. package/dist/src/accounts/custom.test.d.ts +0 -2
  52. package/dist/src/accounts/custom.test.d.ts.map +0 -1
  53. package/dist/src/accounts/custom.test.js +0 -64
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getInstallData = getInstallData;
4
4
  exports.getAddress = getAddress;
5
+ exports.getDefaultValidatorAddress = getDefaultValidatorAddress;
5
6
  exports.packSignature = packSignature;
6
7
  exports.getDeployArgs = getDeployArgs;
7
8
  exports.getSmartAccount = getSmartAccount;
@@ -20,8 +21,52 @@ const NEXUS_DEFAULT_VALIDATOR_ADDRESS = core_1.OWNABLE_VALIDATOR_ADDRESS;
20
21
  const NEXUS_IMPLEMENTATION_ADDRESS = '0x000000000032dDC454C3BDcba80484Ad5A798705';
21
22
  const NEXUS_FACTORY_ADDRESS = '0x0000000000679A258c64d2F20F310e12B64b7375';
22
23
  const NEXUS_BOOTSTRAP_ADDRESS = '0x00000000006eFb61D8c9546FF1B500de3f244EA7';
24
+ const NEXUS_IMPLEMENTATION_1_0_0 = '0x000000039dfcad030719b07296710f045f0558f7';
25
+ const NEXUS_BOOTSTRAP_1_0_0 = '0x00000008c901d8871b6f6942de0b5d9ccf3873d3';
26
+ const NEXUS_K1_VALIDATOR = '0x00000004171351c442b202678c48d8ab5b321e8f';
23
27
  const NEXUS_CREATION_CODE = '0x60806040526102aa803803806100148161018c565b92833981016040828203126101885781516001600160a01b03811692909190838303610188576020810151906001600160401b03821161018857019281601f8501121561018857835161006e610069826101c5565b61018c565b9481865260208601936020838301011161018857815f926020809301865e8601015260017f90b772c2cb8a51aa7a8a65fc23543c6d022d5b3f8e2b92eed79fba7eef8293005d823b15610176577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a282511561015e575f8091610146945190845af43d15610156573d91610137610069846101c5565b9283523d5f602085013e6101e0565b505b604051606b908161023f8239f35b6060916101e0565b50505034156101485763b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176101b157604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b0381116101b157601f01601f191660200190565b9061020457508051156101f557805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580610235575b610215575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561020d56fe60806040523615605c575f8073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156058573d5ff35b3d5ffd5b00fea164736f6c634300081b000a';
24
28
  function getDeployArgs(config) {
29
+ if (config.initData) {
30
+ const factoryData = (0, viem_1.decodeFunctionData)({
31
+ abi: (0, viem_1.parseAbi)([
32
+ 'function createAccount(address eoaOwner,uint256 index,address[] attesters,uint8 threshold)',
33
+ ]),
34
+ data: config.initData.factoryData,
35
+ });
36
+ if (factoryData.functionName !== 'createAccount') {
37
+ throw new Error('Invalid factory data');
38
+ }
39
+ const owner = factoryData.args[0];
40
+ const index = factoryData.args[1];
41
+ const attesters = factoryData.args[2];
42
+ const threshold = factoryData.args[3];
43
+ const salt = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['address', 'uint256', 'address[]', 'uint8'], [owner, index, attesters, threshold]));
44
+ const implementation = config.initData.factory === NEXUS_FACTORY_ADDRESS
45
+ ? NEXUS_IMPLEMENTATION_ADDRESS
46
+ : NEXUS_IMPLEMENTATION_1_0_0;
47
+ const registry = viem_1.zeroAddress;
48
+ const bootstrapData = (0, viem_1.encodeFunctionData)({
49
+ abi: (0, viem_1.parseAbi)([
50
+ 'function initNexusWithSingleValidator(address validator,bytes data,address registry,address[] attesters,uint8 threshold)',
51
+ ]),
52
+ functionName: 'initNexusWithSingleValidator',
53
+ args: [NEXUS_K1_VALIDATOR, owner, registry, attesters, threshold],
54
+ });
55
+ const initData = (0, viem_1.encodeAbiParameters)([{ type: 'address' }, { type: 'bytes' }], [NEXUS_BOOTSTRAP_1_0_0, bootstrapData]);
56
+ const initializationCallData = (0, viem_1.encodeFunctionData)({
57
+ abi: (0, viem_1.parseAbi)(['function initializeAccount(bytes)']),
58
+ functionName: 'initializeAccount',
59
+ args: [initData],
60
+ });
61
+ return {
62
+ salt,
63
+ factory: config.initData.factory,
64
+ factoryData: config.initData.factoryData,
65
+ implementation,
66
+ initData,
67
+ initializationCallData,
68
+ };
69
+ }
25
70
  const salt = (0, viem_1.keccak256)('0x');
26
71
  const moduleSetup = (0, modules_1.getSetup)(config);
27
72
  // Filter out the default validator
@@ -107,20 +152,28 @@ function getDeployArgs(config) {
107
152
  };
108
153
  }
109
154
  function getAddress(config) {
110
- const { factory, salt, initializationCallData } = getDeployArgs(config);
111
- const accountInitData = (0, viem_1.encodeAbiParameters)([
112
- {
113
- name: 'address',
114
- type: 'address',
115
- },
116
- {
117
- name: 'calldata',
118
- type: 'bytes',
119
- },
120
- ], [NEXUS_IMPLEMENTATION_ADDRESS, initializationCallData]);
121
- const hashedInitcode = (0, viem_1.keccak256)((0, viem_1.concat)([NEXUS_CREATION_CODE, accountInitData]));
122
- const hash = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes1', 'address', 'bytes32', 'bytes'], ['0xff', factory, salt, hashedInitcode]));
123
- const address = (0, viem_1.slice)(hash, 12, 32);
155
+ const { factory, salt, initializationCallData, implementation } = getDeployArgs(config);
156
+ const creationCode = factory === NEXUS_FACTORY_ADDRESS
157
+ ? NEXUS_CREATION_CODE
158
+ : '0x603d3d8160223d3973000000039dfcad030719b07296710f045f0558f760095155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f3';
159
+ const accountInitData = factory === NEXUS_FACTORY_ADDRESS
160
+ ? (0, viem_1.encodeAbiParameters)([
161
+ {
162
+ name: 'address',
163
+ type: 'address',
164
+ },
165
+ {
166
+ name: 'calldata',
167
+ type: 'bytes',
168
+ },
169
+ ], [implementation, initializationCallData])
170
+ : '0x';
171
+ const address = (0, viem_1.getContractAddress)({
172
+ opcode: 'CREATE2',
173
+ from: factory,
174
+ salt,
175
+ bytecode: (0, viem_1.concat)([creationCode, accountInitData]),
176
+ });
124
177
  return address;
125
178
  }
126
179
  function getInstallData(module) {
@@ -151,6 +204,21 @@ function getInstallData(module) {
151
204
  args: [module.type, module.address, module.initData],
152
205
  });
153
206
  }
207
+ function getDefaultValidatorAddress(version) {
208
+ if (!version) {
209
+ return NEXUS_DEFAULT_VALIDATOR_ADDRESS;
210
+ }
211
+ switch (version) {
212
+ case '1.0.2':
213
+ return '0x0000002D6DB27c52E3C11c1Cf24072004AC75cBa';
214
+ case '1.2.0':
215
+ return '0x00000000d12897ddadc2044614a9677b191a2d95';
216
+ case 'rhinestone-1.0.0-beta':
217
+ return '0x0000000000e9e6e96bcaa3c113187cdb7e38aed9';
218
+ case 'rhinestone-1.0.0':
219
+ return NEXUS_DEFAULT_VALIDATOR_ADDRESS;
220
+ }
221
+ }
154
222
  async function packSignature(signature, validator, transformSignature = (signature) => signature, defaultValidatorAddress = NEXUS_DEFAULT_VALIDATOR_ADDRESS) {
155
223
  const validatorAddress = validator.address === defaultValidatorAddress
156
224
  ? viem_1.zeroAddress
@@ -35,6 +35,23 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
35
35
  (0, vitest_1.expect)(implementation).toEqual('0x000000000032dDC454C3BDcba80484Ad5A798705');
36
36
  (0, vitest_1.expect)(initializationCallData).toEqual('0x4b6a1419000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000006efb61d8c9546ff1b500de3f244ea7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003448643787600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000578c4cb0e472a5462da43c495c3f33000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001580a9af0569ad3905b26a703201b358aa0904236642ebe79b22a19d00d3737637d46f725a5427ae45a9569259bf67e1e16b187d7b3ad1ed70138c4f0409677d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000005ad9ce1f5035fd62ca96cef16adaaf000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
37
37
  });
38
+ (0, vitest_1.test)('Existing account', () => {
39
+ const { factory, factoryData } = (0, nexus_1.getDeployArgs)({
40
+ owners: {
41
+ type: 'ecdsa',
42
+ accounts: [consts_1.accountA, consts_1.accountB],
43
+ },
44
+ rhinestoneApiKey: consts_1.MOCK_API_KEY,
45
+ initData: {
46
+ address: '0xBecba00993a919FfD35064a777E94643014A19Aa',
47
+ factory: '0x00000bb19a3579F4D779215dEf97AFbd0e30DB55',
48
+ factoryData: '0x0d51f0b7000000000000000000000000db8fca317427c3f85b6734af6455f287011c54b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
49
+ intentExecutorInstalled: false,
50
+ },
51
+ });
52
+ (0, vitest_1.expect)(factory).toEqual('0x00000bb19a3579F4D779215dEf97AFbd0e30DB55');
53
+ (0, vitest_1.expect)(factoryData).toEqual('0x0d51f0b7000000000000000000000000db8fca317427c3f85b6734af6455f287011c54b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
54
+ });
38
55
  });
39
56
  (0, vitest_1.describe)('Get Address', () => {
40
57
  (0, vitest_1.test)('ECDSA owners', () => {
@@ -45,7 +62,7 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
45
62
  },
46
63
  rhinestoneApiKey: consts_1.MOCK_API_KEY,
47
64
  });
48
- (0, vitest_1.expect)(address).toEqual('0x0681de31e060b384f0b08a3bac99e9bdff302474');
65
+ (0, vitest_1.expect)(address).toEqual('0x0681de31e060b384F0b08A3bAC99E9bDFf302474');
49
66
  });
50
67
  (0, vitest_1.test)('Passkey owner', () => {
51
68
  const address = (0, nexus_1.getAddress)({
@@ -55,7 +72,23 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
55
72
  },
56
73
  rhinestoneApiKey: consts_1.MOCK_API_KEY,
57
74
  });
58
- (0, vitest_1.expect)(address).toEqual('0x894b88c04b4de6abddce81e8bdc91927e37d6ced');
75
+ (0, vitest_1.expect)(address).toEqual('0x894b88C04B4DE6AbDdcE81E8bdc91927E37d6ceD');
76
+ });
77
+ (0, vitest_1.test)('Existing account', () => {
78
+ const address = (0, nexus_1.getAddress)({
79
+ owners: {
80
+ type: 'ecdsa',
81
+ accounts: [consts_1.accountA, consts_1.accountB],
82
+ },
83
+ rhinestoneApiKey: consts_1.MOCK_API_KEY,
84
+ initData: {
85
+ address: '0xBecba00993a919FfD35064a777E94643014A19Aa',
86
+ factory: '0x00000bb19a3579F4D779215dEf97AFbd0e30DB55',
87
+ factoryData: '0x0d51f0b7000000000000000000000000db8fca317427c3f85b6734af6455f287011c54b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
88
+ intentExecutorInstalled: false,
89
+ },
90
+ });
91
+ (0, vitest_1.expect)(address).toEqual('0xBecba00993a919FfD35064a777E94643014A19Aa');
59
92
  });
60
93
  });
61
94
  (0, vitest_1.describe)('Get Install Data', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../accounts/safe.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EAIZ,KAAK,GAAG,EAER,KAAK,YAAY,EAIlB,MAAM,MAAM,CAAA;AACb,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAEhC,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAQ/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAchF,iBAAS,aAAa,CAAC,MAAM,EAAE,uBAAuB;;;;;;EAiErD;AAED,iBAAS,UAAU,CAAC,MAAM,EAAE,uBAAuB,iBAalD;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,iBA2BrC;AAED,iBAAe,aAAa,CAC1B,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,eAAe,EAC1B,kBAAkB,GAAE,CAAC,SAAS,EAAE,GAAG,KAAK,GAA8B,0BAMvE;AAED,iBAAe,eAAe,CAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,QAAQ,EAChB,gBAAgB,EAAE,OAAO,EACzB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAWlC;AAED,iBAAe,sBAAsB,CACnC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,iBAAiB,GAAG,IAAI,EACpC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAyClC;AAED,iBAAe,uBAAuB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,QAAQ,EACnB,gBAAgB,EAAE,OAAO,EACzB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAalC;AAoGD,OAAO,EACL,cAAc,EACd,UAAU,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,uBAAuB,GACxB,CAAA"}
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../../accounts/safe.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EAOZ,KAAK,GAAG,EAER,KAAK,YAAY,EAIlB,MAAM,MAAM,CAAA;AACb,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAEhC,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAQ/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAgBhF,iBAAS,aAAa,CAAC,MAAM,EAAE,uBAAuB;;;;;;EAyFrD;AAED,iBAAS,UAAU,CAAC,MAAM,EAAE,uBAAuB,iBAalD;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,iBA2BrC;AAED,iBAAe,aAAa,CAC1B,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,eAAe,EAC1B,kBAAkB,GAAE,CAAC,SAAS,EAAE,GAAG,KAAK,GAA8B,0BAMvE;AAED,iBAAe,eAAe,CAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,QAAQ,EAChB,gBAAgB,EAAE,OAAO,EACzB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAWlC;AAED,iBAAe,sBAAsB,CACnC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,OAAO,EACzB,UAAU,EAAE,iBAAiB,GAAG,IAAI,EACpC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAyClC;AAED,iBAAe,uBAAuB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,QAAQ,EACnB,gBAAgB,EAAE,OAAO,EACzB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,iEAalC;AAkGD,OAAO,EACL,cAAc,EACd,UAAU,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,uBAAuB,GACxB,CAAA"}
@@ -17,72 +17,97 @@ const SAFE_7579_ADAPTER_ADDRESS = '0x7579f2AD53b01c3D8779Fe17928e0D48885B0003';
17
17
  const SAFE_SINGLETON_ADDRESS = '0x29fcb43b46531bca003ddc8fcb67ffe91900c762';
18
18
  const SAFE_PROXY_FACTORY_ADDRESS = '0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67';
19
19
  const NO_SAFE_OWNER_ADDRESS = '0xbabe99e62d8bcbd3acf5ccbcfcd4f64fe75e5e72';
20
+ const SAFE_PROXY_INIT_CODE = '0x608060405234801561001057600080fd5b506040516101e63803806101e68339818101604052602081101561003357600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156100ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806101c46022913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060ab806101196000396000f3fe608060405273ffffffffffffffffffffffffffffffffffffffff600054167fa619486e0000000000000000000000000000000000000000000000000000000060003514156050578060005260206000f35b3660008037600080366000845af43d6000803e60008114156070573d6000fd5b3d6000f3fea264697066735822122003d1488ee65e08fa41e58e888a9865554c535f2c77126a82cb4c0f917f31441364736f6c63430007060033496e76616c69642073696e676c65746f6e20616464726573732070726f7669646564';
20
21
  function getDeployArgs(config) {
21
- {
22
- const owners = getOwners(config);
23
- const threshold = getThreshold(config);
24
- const moduleSetup = (0, modules_1.getSetup)(config);
25
- const modules = [
26
- ...moduleSetup.validators,
27
- ...moduleSetup.executors,
28
- ...moduleSetup.fallbacks,
29
- ...moduleSetup.hooks,
30
- ];
31
- const initData = (0, viem_1.encodeFunctionData)({
32
- abi: (0, viem_1.parseAbi)([
33
- 'function setup(address[] calldata _owners,uint256 _threshold,address to,bytes calldata data,address fallbackHandler,address paymentToken,uint256 payment, address paymentReceiver) external',
34
- ]),
35
- functionName: 'setup',
36
- args: [
37
- owners,
38
- threshold,
39
- SAFE_7579_LAUNCHPAD_ADDRESS,
40
- (0, viem_1.encodeFunctionData)({
41
- abi: (0, viem_1.parseAbi)([
42
- 'struct ModuleInit {address module;bytes initData;uint256 moduleType}',
43
- 'function addSafe7579(address safe7579,ModuleInit[] calldata modules,address[] calldata attesters,uint8 threshold) external',
44
- ]),
45
- functionName: 'addSafe7579',
46
- args: [
47
- SAFE_7579_ADAPTER_ADDRESS,
48
- modules.map((m) => ({
49
- module: m.address,
50
- initData: m.initData,
51
- moduleType: m.type,
52
- })),
53
- [],
54
- 0,
55
- ],
56
- }),
57
- SAFE_7579_ADAPTER_ADDRESS,
58
- viem_1.zeroAddress,
59
- BigInt(0),
60
- viem_1.zeroAddress,
61
- ],
62
- });
63
- const saltNonce = 0n;
64
- const factoryData = (0, viem_1.encodeFunctionData)({
22
+ if (config.initData) {
23
+ const factoryData = (0, viem_1.decodeFunctionData)({
65
24
  abi: (0, viem_1.parseAbi)([
66
25
  'function createProxyWithNonce(address singleton,bytes calldata initializer,uint256 saltNonce) external payable returns (address)',
67
26
  ]),
68
- functionName: 'createProxyWithNonce',
69
- args: [SAFE_SINGLETON_ADDRESS, initData, saltNonce],
27
+ data: config.initData.factoryData,
70
28
  });
29
+ if (factoryData.functionName !== 'createProxyWithNonce') {
30
+ throw new Error('Invalid factory data');
31
+ }
32
+ const implementation = factoryData.args[0];
33
+ const initData = factoryData.args[1];
34
+ const saltNonce = factoryData.args[2];
71
35
  const salt = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes32', 'uint256'], [(0, viem_1.keccak256)(initData), saltNonce]));
72
36
  return {
73
- factory: SAFE_PROXY_FACTORY_ADDRESS,
74
- factoryData,
37
+ factory: config.initData.factory,
38
+ factoryData: config.initData.factoryData,
75
39
  salt,
76
- implementation: SAFE_SINGLETON_ADDRESS,
40
+ implementation,
77
41
  initializationCallData: null,
78
42
  };
79
43
  }
44
+ const owners = getOwners(config);
45
+ const threshold = getThreshold(config);
46
+ const moduleSetup = (0, modules_1.getSetup)(config);
47
+ const modules = [
48
+ ...moduleSetup.validators,
49
+ ...moduleSetup.executors,
50
+ ...moduleSetup.fallbacks,
51
+ ...moduleSetup.hooks,
52
+ ];
53
+ const initData = (0, viem_1.encodeFunctionData)({
54
+ abi: (0, viem_1.parseAbi)([
55
+ 'function setup(address[] calldata _owners,uint256 _threshold,address to,bytes calldata data,address fallbackHandler,address paymentToken,uint256 payment, address paymentReceiver) external',
56
+ ]),
57
+ functionName: 'setup',
58
+ args: [
59
+ owners,
60
+ threshold,
61
+ SAFE_7579_LAUNCHPAD_ADDRESS,
62
+ (0, viem_1.encodeFunctionData)({
63
+ abi: (0, viem_1.parseAbi)([
64
+ 'struct ModuleInit {address module;bytes initData;uint256 moduleType}',
65
+ 'function addSafe7579(address safe7579,ModuleInit[] calldata modules,address[] calldata attesters,uint8 threshold) external',
66
+ ]),
67
+ functionName: 'addSafe7579',
68
+ args: [
69
+ SAFE_7579_ADAPTER_ADDRESS,
70
+ modules.map((m) => ({
71
+ module: m.address,
72
+ initData: m.initData,
73
+ moduleType: m.type,
74
+ })),
75
+ [],
76
+ 0,
77
+ ],
78
+ }),
79
+ SAFE_7579_ADAPTER_ADDRESS,
80
+ viem_1.zeroAddress,
81
+ BigInt(0),
82
+ viem_1.zeroAddress,
83
+ ],
84
+ });
85
+ const saltNonce = 0n;
86
+ const factoryData = (0, viem_1.encodeFunctionData)({
87
+ abi: (0, viem_1.parseAbi)([
88
+ 'function createProxyWithNonce(address singleton,bytes calldata initializer,uint256 saltNonce) external payable returns (address)',
89
+ ]),
90
+ functionName: 'createProxyWithNonce',
91
+ args: [SAFE_SINGLETON_ADDRESS, initData, saltNonce],
92
+ });
93
+ const salt = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes32', 'uint256'], [(0, viem_1.keccak256)(initData), saltNonce]));
94
+ return {
95
+ factory: SAFE_PROXY_FACTORY_ADDRESS,
96
+ factoryData,
97
+ salt,
98
+ implementation: SAFE_SINGLETON_ADDRESS,
99
+ initializationCallData: null,
100
+ };
80
101
  }
81
102
  function getAddress(config) {
82
- const hashedInitcode = '0xe298282cefe913ab5d282047161268a8222e4bd4ed106300c547894bbefd31ee';
83
- const { factory, salt } = getDeployArgs(config);
84
- const hash = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes1', 'address', 'bytes32', 'bytes'], ['0xff', factory, salt, hashedInitcode]));
85
- const address = (0, viem_1.slice)(hash, 12, 32);
103
+ const { factory, implementation, salt } = getDeployArgs(config);
104
+ const constructorArgs = (0, viem_1.encodeAbiParameters)((0, viem_1.parseAbiParameters)('address singleton'), [implementation]);
105
+ const address = (0, viem_1.getContractAddress)({
106
+ opcode: 'CREATE2',
107
+ from: factory,
108
+ salt,
109
+ bytecode: (0, viem_1.concat)([SAFE_PROXY_INIT_CODE, constructorArgs]),
110
+ });
86
111
  return address;
87
112
  }
88
113
  function getInstallData(module) {
@@ -211,7 +236,6 @@ function getOwners(config) {
211
236
  const ownerSet = config.owners;
212
237
  switch (ownerSet.type) {
213
238
  case 'ecdsa':
214
- case 'ecdsa-v0':
215
239
  return ownerSet.accounts.map((account) => account.address);
216
240
  case 'passkey':
217
241
  return [NO_SAFE_OWNER_ADDRESS];
@@ -223,7 +247,6 @@ function getThreshold(config) {
223
247
  const ownerSet = config.owners;
224
248
  switch (ownerSet.type) {
225
249
  case 'ecdsa':
226
- case 'ecdsa-v0':
227
250
  return ownerSet.threshold ? BigInt(ownerSet.threshold) : 1n;
228
251
  case 'passkey':
229
252
  return 1n;
@@ -35,6 +35,23 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
35
35
  (0, vitest_1.expect)(implementation).toEqual('0x29fcb43b46531bca003ddc8fcb67ffe91900c762');
36
36
  (0, vitest_1.expect)(initializationCallData).toEqual(null);
37
37
  });
38
+ (0, vitest_1.test)('Existing account', () => {
39
+ const { factory, factoryData } = (0, safe_1.getDeployArgs)({
40
+ owners: {
41
+ type: 'ecdsa',
42
+ accounts: [consts_1.accountA, consts_1.accountB],
43
+ },
44
+ rhinestoneApiKey: consts_1.MOCK_API_KEY,
45
+ initData: {
46
+ factory: '0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67',
47
+ factoryData: '0x1688f0b90000000000000000000000007579011ab74c46090561ea277ba79d510c6c00ff0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844fff40e1ec88f0966a6bc17a138345cdf7519caf9a1e0bb840330108a6a4315f1028c39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
48
+ address: '0xc41bb9cfB2658dD3D74Ada0862044f5f30304b38',
49
+ intentExecutorInstalled: true,
50
+ },
51
+ });
52
+ (0, vitest_1.expect)(factory).toEqual('0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67');
53
+ (0, vitest_1.expect)(factoryData).toEqual('0x1688f0b90000000000000000000000007579011ab74c46090561ea277ba79d510c6c00ff0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844fff40e1ec88f0966a6bc17a138345cdf7519caf9a1e0bb840330108a6a4315f1028c39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
54
+ });
38
55
  });
39
56
  (0, vitest_1.describe)('Get Address', () => {
40
57
  (0, vitest_1.test)('ECDSA owners', () => {
@@ -45,7 +62,7 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
45
62
  },
46
63
  rhinestoneApiKey: consts_1.MOCK_API_KEY,
47
64
  });
48
- (0, vitest_1.expect)(address).toEqual('0x3a249204d37245504d4ab37ff88f574b222a6349');
65
+ (0, vitest_1.expect)(address).toEqual('0x3a249204D37245504d4aB37FF88f574B222a6349');
49
66
  });
50
67
  (0, vitest_1.test)('Passkey owner', () => {
51
68
  const address = (0, safe_1.getAddress)({
@@ -55,7 +72,23 @@ const MOCK_MODULE_ADDRESS = '0x28de6501fa86f2e6cd0b33c3aabdaeb4a1b93f3f';
55
72
  },
56
73
  rhinestoneApiKey: consts_1.MOCK_API_KEY,
57
74
  });
58
- (0, vitest_1.expect)(address).toEqual('0xe86e416045645e1ca4360d5dc396e4c513277c31');
75
+ (0, vitest_1.expect)(address).toEqual('0xE86e416045645E1Ca4360D5DC396E4c513277C31');
76
+ });
77
+ (0, vitest_1.test)('Existing account', () => {
78
+ const address = (0, safe_1.getAddress)({
79
+ owners: {
80
+ type: 'ecdsa',
81
+ accounts: [consts_1.accountA, consts_1.accountB],
82
+ },
83
+ rhinestoneApiKey: consts_1.MOCK_API_KEY,
84
+ initData: {
85
+ factory: '0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67',
86
+ factoryData: '0x1688f0b90000000000000000000000007579011ab74c46090561ea277ba79d510c6c00ff0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844fff40e1ec88f0966a6bc17a138345cdf7519caf9a1e0bb840330108a6a4315f1028c39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
87
+ address: '0xc41bb9cfB2658dD3D74Ada0862044f5f30304b38',
88
+ intentExecutorInstalled: true,
89
+ },
90
+ });
91
+ (0, vitest_1.expect)(address).toEqual('0xc41bb9cfB2658dD3D74Ada0862044f5f30304b38');
59
92
  });
60
93
  });
61
94
  (0, vitest_1.describe)('Get Install Data', () => {
@@ -4,7 +4,7 @@ import type { WebAuthnAccount } from 'viem/account-abstraction';
4
4
  import type { OwnerSet, SignerSet } from '../../types';
5
5
  declare function convertOwnerSetToSignerSet(owners: OwnerSet): SignerSet;
6
6
  type SigningFunctions<T> = {
7
- signEcdsa: (account: Account, params: T) => Promise<Hex>;
7
+ signEcdsa: (account: Account, params: T, updateV: boolean) => Promise<Hex>;
8
8
  signPasskey: (account: WebAuthnAccount, params: T) => Promise<{
9
9
  webauthn: WebAuthnP256.SignMetadata;
10
10
  signature: Hex;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../accounts/signing/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACtC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,KAAK,EAGV,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AACb,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAG/D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQtD,iBAAS,0BAA0B,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAiD/D;AAED,KAAK,gBAAgB,CAAC,CAAC,IAAI;IACzB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACxD,WAAW,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC;QACX,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAA;QACnC,SAAS,EAAE,GAAG,CAAA;KACf,CAAC,CAAA;CACH,CAAA;AAED,iBAAe,uBAAuB,CAAC,CAAC,EACtC,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,EAC5D,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Cd;AAED,iBAAe,eAAe,CAAC,CAAC,EAC9B,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,EACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CAKd;AAED,iBAAe,iBAAiB,CAAC,CAAC,EAChC,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,EAC1C,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,GAAG,CAAC,CAOd;AAED,iBAAe,cAAc,CAAC,CAAC,EAC7B,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,EACrC,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CA2Cd;AAED,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,KAAK,gBAAgB,GACtB,CAAA"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../accounts/signing/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACtC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,KAAK,EAGV,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AACb,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAO/D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAStD,iBAAS,0BAA0B,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CA6C/D;AAED,KAAK,gBAAgB,CAAC,CAAC,IAAI;IACzB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1E,WAAW,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC;QACX,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAA;QACnC,SAAS,EAAE,GAAG,CAAA;KACf,CAAC,CAAA;CACH,CAAA;AAED,iBAAe,uBAAuB,CAAC,CAAC,EACtC,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,EAC5D,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Cd;AAED,iBAAe,eAAe,CAAC,CAAC,EAC9B,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,EACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CAKd;AAED,iBAAe,iBAAiB,CAAC,CAAC,EAChC,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,EAC1C,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,GAAG,CAAC,CAOd;AAED,iBAAe,cAAc,CAAC,CAAC,EAC7B,OAAO,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,EACrC,QAAQ,EAAE,CACR,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,GAAG,CAAC,GAChB,OAAO,CAAC,GAAG,CAAC,CAiDd;AAED,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,KAAK,gBAAgB,GACtB,CAAA"}
@@ -16,13 +16,7 @@ function convertOwnerSetToSignerSet(owners) {
16
16
  type: 'owner',
17
17
  kind: 'ecdsa',
18
18
  accounts: owners.accounts,
19
- };
20
- }
21
- case 'ecdsa-v0': {
22
- return {
23
- type: 'owner',
24
- kind: 'ecdsa-v0',
25
- accounts: owners.accounts,
19
+ module: owners.module,
26
20
  };
27
21
  }
28
22
  case 'passkey': {
@@ -30,6 +24,7 @@ function convertOwnerSetToSignerSet(owners) {
30
24
  type: 'owner',
31
25
  kind: 'passkey',
32
26
  accounts: owners.accounts,
27
+ module: owners.module,
33
28
  };
34
29
  }
35
30
  case 'multi-factor': {
@@ -38,12 +33,12 @@ function convertOwnerSetToSignerSet(owners) {
38
33
  kind: 'multi-factor',
39
34
  validators: owners.validators.map((validator, index) => {
40
35
  switch (validator.type) {
41
- case 'ecdsa':
42
- case 'ecdsa-v0': {
36
+ case 'ecdsa': {
43
37
  return {
44
38
  type: validator.type,
45
39
  id: index,
46
40
  accounts: validator.accounts,
41
+ module: validator.module,
47
42
  };
48
43
  }
49
44
  case 'passkey': {
@@ -51,6 +46,7 @@ function convertOwnerSetToSignerSet(owners) {
51
46
  type: 'passkey',
52
47
  id: index,
53
48
  accounts: validator.accounts,
49
+ module: validator.module,
54
50
  };
55
51
  }
56
52
  }
@@ -101,14 +97,16 @@ async function signWithSession(signers, chain, address, params, signMain) {
101
97
  return signMain(sessionSigners, chain, address, params);
102
98
  }
103
99
  async function signWithGuardians(signers, params, signingFunctions) {
104
- const signatures = await Promise.all(signers.guardians.map((account) => signingFunctions.signEcdsa(account, params)));
100
+ const signatures = await Promise.all(signers.guardians.map((account) => signingFunctions.signEcdsa(account, params, false)));
105
101
  return (0, viem_1.concat)(signatures);
106
102
  }
107
103
  async function signWithOwners(signers, chain, address, params, signingFunctions, signMain) {
108
104
  switch (signers.kind) {
109
- case 'ecdsa':
110
- case 'ecdsa-v0': {
111
- const signatures = await Promise.all(signers.accounts.map((account) => signingFunctions.signEcdsa(account, params)));
105
+ case 'ecdsa': {
106
+ // Ownable validator uses `v` value to determine which validation mode to use
107
+ const updateV = !signers.module ||
108
+ signers.module?.toLowerCase() === core_1.OWNABLE_VALIDATOR_ADDRESS;
109
+ const signatures = await Promise.all(signers.accounts.map((account) => signingFunctions.signEcdsa(account, params, updateV)));
112
110
  return (0, viem_1.concat)(signatures);
113
111
  }
114
112
  case 'passkey': {
@@ -130,6 +128,9 @@ async function signWithOwners(signers, chain, address, params, signingFunctions,
130
128
  s,
131
129
  };
132
130
  });
131
+ if (signers.module?.toLowerCase() === core_1.WEBAUTHN_V0_VALIDATOR_ADDRESS) {
132
+ return (0, passkeys_1.packSignatureV0)(webAuthns[0], usePrecompile);
133
+ }
133
134
  return (0, passkeys_1.packSignature)(credIds, usePrecompile, webAuthns);
134
135
  }
135
136
  case 'multi-factor': {
@@ -6,7 +6,7 @@ const error_1 = require("../error");
6
6
  const common_1 = require("./common");
7
7
  async function sign(signers, chain, address, hash) {
8
8
  const signingFunctions = {
9
- signEcdsa: (account, hash) => signEcdsa(account, hash),
9
+ signEcdsa: (account, hash, updateV) => signEcdsa(account, hash, updateV),
10
10
  signPasskey: (account, hash) => signPasskey(account, hash),
11
11
  };
12
12
  switch (signers.type) {
@@ -21,7 +21,7 @@ async function sign(signers, chain, address, hash) {
21
21
  }
22
22
  }
23
23
  }
24
- async function signEcdsa(account, hash) {
24
+ async function signEcdsa(account, hash, updateV) {
25
25
  if (!account.signMessage) {
26
26
  throw new error_1.SigningNotSupportedForAccountError();
27
27
  }
@@ -34,7 +34,7 @@ async function signEcdsa(account, hash) {
34
34
  if (!v) {
35
35
  throw new Error('Invalid signature');
36
36
  }
37
- const newV = v + 4n;
37
+ const newV = updateV ? v + 4n : v;
38
38
  const newSignature = (0, viem_1.concat)([r, s, (0, viem_1.toHex)(newV)]);
39
39
  return newSignature;
40
40
  }
@@ -24,6 +24,13 @@ declare function packSignature(credIds: Hex[], usePrecompile: boolean, webAuthns
24
24
  r: bigint;
25
25
  s: bigint;
26
26
  }[]): Hex;
27
- export { parsePublicKey, parseSignature, generateCredentialId, packSignature };
27
+ declare function packSignatureV0(webauthn: {
28
+ authenticatorData: Hex;
29
+ clientDataJSON: string;
30
+ typeIndex: number | bigint;
31
+ r: bigint;
32
+ s: bigint;
33
+ }, usePrecompiled: boolean): `0x${string}`;
34
+ export { parsePublicKey, parseSignature, generateCredentialId, packSignature, packSignatureV0, };
28
35
  export type { WebAuthnSignature };
29
36
  //# sourceMappingURL=passkeys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"passkeys.d.ts","sourceRoot":"","sources":["../../../../accounts/signing/passkeys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAGZ,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AAEb,UAAU,iBAAiB;IACzB,iBAAiB,EAAE,GAAG,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,iBAAS,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,GAAG;IACpD,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAUA;AAED,iBAAS,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,GAAG;IACpD,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CASA;AAED,iBAAS,oBAAoB,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,iBAkBjB;AAED,iBAAS,aAAa,CACpB,OAAO,EAAE,GAAG,EAAE,EACd,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE;IACT,iBAAiB,EAAE,GAAG,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,EAAE,GACF,GAAG,CAqDL;AAED,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAA;AAC9E,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"passkeys.d.ts","sourceRoot":"","sources":["../../../../accounts/signing/passkeys.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAGZ,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AAEb,UAAU,iBAAiB;IACzB,iBAAiB,EAAE,GAAG,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,iBAAS,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,GAAG;IACpD,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAUA;AAED,iBAAS,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,GAAG;IACpD,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CASA;AAED,iBAAS,oBAAoB,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,iBAkBjB;AAED,iBAAS,aAAa,CACpB,OAAO,EAAE,GAAG,EAAE,EACd,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE;IACT,iBAAiB,EAAE,GAAG,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,EAAE,GACF,GAAG,CAqDL;AAED,iBAAS,eAAe,CACtB,QAAQ,EAAE;IACR,iBAAiB,EAAE,GAAG,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,EACD,cAAc,EAAE,OAAO,iBAqCxB;AAED,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,CAAA;AACD,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
@@ -4,6 +4,7 @@ exports.parsePublicKey = parsePublicKey;
4
4
  exports.parseSignature = parseSignature;
5
5
  exports.generateCredentialId = generateCredentialId;
6
6
  exports.packSignature = packSignature;
7
+ exports.packSignatureV0 = packSignatureV0;
7
8
  const viem_1 = require("viem");
8
9
  function parsePublicKey(publicKey) {
9
10
  const bytes = typeof publicKey === 'string' ? (0, viem_1.hexToBytes)(publicKey) : publicKey;
@@ -88,3 +89,37 @@ function packSignature(credIds, usePrecompile, webAuthns) {
88
89
  },
89
90
  ], [credIds, usePrecompile, webAuthns]);
90
91
  }
92
+ function packSignatureV0(webauthn, usePrecompiled) {
93
+ return (0, viem_1.encodeAbiParameters)([
94
+ { type: 'bytes', name: 'authenticatorData' },
95
+ {
96
+ type: 'string',
97
+ name: 'clientDataJSON',
98
+ },
99
+ {
100
+ type: 'uint256',
101
+ name: 'responseTypeLocation',
102
+ },
103
+ {
104
+ type: 'uint256',
105
+ name: 'r',
106
+ },
107
+ {
108
+ type: 'uint256',
109
+ name: 's',
110
+ },
111
+ {
112
+ type: 'bool',
113
+ name: 'usePrecompiled',
114
+ },
115
+ ], [
116
+ webauthn.authenticatorData,
117
+ webauthn.clientDataJSON,
118
+ typeof webauthn.typeIndex === 'bigint'
119
+ ? webauthn.typeIndex
120
+ : BigInt(webauthn.typeIndex),
121
+ webauthn.r,
122
+ webauthn.s,
123
+ usePrecompiled,
124
+ ]);
125
+ }
@@ -70,4 +70,19 @@ const passkeys_1 = require("./passkeys");
70
70
  (0, vitest_1.expect)(packed).toEqual('0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000026be9646e4d64132d1a1789a467d0501e948d23afce6792d963f401434d7bef339437809df26444a849d303b1174543f0851df5fae657da19f3bb0d92356426ea00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000017474c214167b8a4704cf06f75287a738e7ddbcca9cc0383db6dac6a7d090f4ee024ff8e2a2e8c54aa8cf5f36e3b6125016c3d58d896e3a85c5cd2cd0027a2625000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97631d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000867b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22313971416351415643657563467438745153697a424264627857364a6b65785f336e41656a64527556656b222c226f726967696e223a22687474703a2f2f6c6f63616c686f73743a35313733222c2263726f73734f726967696e223a66616c73657d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001f60f80fe3fd029d1b380d631f0b659bfbc8f8f60921a88e1e123c159aa540f920ed337464d1bb813dc5f9c3e81998185370da49cc525e9f42cdf805f1030aff8000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97631d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000867b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2234703254695a70546f6f4c43464659544332486d4d50564d69566a5a476768434a30647a377a5544456541222c226f726967696e223a22687474703a2f2f6c6f63616c686f73743a35313733222c2263726f73734f726967696e223a66616c73657d0000000000000000000000000000000000000000000000000000');
71
71
  });
72
72
  });
73
+ (0, vitest_1.describe)('Pack Signature V0', () => {
74
+ (0, vitest_1.test)('single', () => {
75
+ const usePrecompile = false;
76
+ const webAuthns = {
77
+ authenticatorData: '0x49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97631d00000000',
78
+ clientDataJSON: '{"type":"webauthn.get","challenge":"4p2TiZpTooLCFFYTC2HmMPVMiVjZGghCJ0dz7zUDEeA","origin":"http://localhost:5173","crossOrigin":false}',
79
+ challengeIndex: 23n,
80
+ typeIndex: 1n,
81
+ r: 111296353735534357766084082487308191701889898756402773464442570100570127077266n,
82
+ s: 6705566102199758127831148650668918567109283965479844611524279039128750829560n,
83
+ };
84
+ const packed = (0, passkeys_1.packSignatureV0)(webAuthns, usePrecompile);
85
+ (0, vitest_1.expect)(packed).toEqual('0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001f60f80fe3fd029d1b380d631f0b659bfbc8f8f60921a88e1e123c159aa540f920ed337464d1bb813dc5f9c3e81998185370da49cc525e9f42cdf805f1030aff80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97631d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000867b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2234703254695a70546f6f4c43464659544332486d4d50564d69566a5a476768434a30647a377a5544456541222c226f726967696e223a22687474703a2f2f6c6f63616c686f73743a35313733222c2263726f73734f726967696e223a66616c73657d0000000000000000000000000000000000000000000000000000');
86
+ });
87
+ });
73
88
  });