@rhinestone/sdk 1.0.0-alpha.24 → 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.
- package/dist/src/accounts/index.d.ts +10 -3
- package/dist/src/accounts/index.d.ts.map +1 -1
- package/dist/src/accounts/index.js +114 -36
- package/dist/src/accounts/index.test.js +2 -2
- package/dist/src/accounts/kernel.d.ts +1 -1
- package/dist/src/accounts/kernel.d.ts.map +1 -1
- package/dist/src/accounts/kernel.js +28 -1
- package/dist/src/accounts/kernel.test.js +37 -4
- package/dist/src/accounts/nexus.d.ts +4 -3
- package/dist/src/accounts/nexus.d.ts.map +1 -1
- package/dist/src/accounts/nexus.js +82 -14
- package/dist/src/accounts/nexus.test.js +35 -2
- package/dist/src/accounts/safe.d.ts.map +1 -1
- package/dist/src/accounts/safe.js +78 -55
- package/dist/src/accounts/safe.test.js +35 -2
- package/dist/src/accounts/signing/common.d.ts +1 -1
- package/dist/src/accounts/signing/common.d.ts.map +1 -1
- package/dist/src/accounts/signing/common.js +14 -13
- package/dist/src/accounts/signing/message.js +3 -3
- package/dist/src/accounts/signing/passkeys.d.ts +8 -1
- package/dist/src/accounts/signing/passkeys.d.ts.map +1 -1
- package/dist/src/accounts/signing/passkeys.js +35 -0
- package/dist/src/accounts/signing/passkeys.test.js +15 -0
- package/dist/src/actions/index.d.ts +1 -1
- package/dist/src/actions/index.d.ts.map +1 -1
- package/dist/src/actions/index.js +3 -6
- package/dist/src/actions/index.test.js +11 -11
- package/dist/src/execution/index.d.ts +11 -2
- package/dist/src/execution/index.d.ts.map +1 -1
- package/dist/src/execution/index.js +23 -16
- package/dist/src/execution/utils.d.ts +1 -1
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +23 -5
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -0
- package/dist/src/modules/index.d.ts +2 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +16 -13
- package/dist/src/modules/index.test.js +3 -3
- package/dist/src/modules/validators/core.d.ts +4 -3
- package/dist/src/modules/validators/core.d.ts.map +1 -1
- package/dist/src/modules/validators/core.js +24 -14
- package/dist/src/modules/validators/core.test.js +4 -4
- package/dist/src/orchestrator/types.d.ts +2 -2
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +30 -20
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/src/accounts/custom.d.ts +0 -18
- package/dist/src/accounts/custom.d.ts.map +0 -1
- package/dist/src/accounts/custom.js +0 -121
- package/dist/src/accounts/custom.test.d.ts +0 -2
- package/dist/src/accounts/custom.test.d.ts.map +0 -1
- 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
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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('
|
|
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('
|
|
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,
|
|
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
|
|
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
|
-
|
|
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:
|
|
74
|
-
factoryData,
|
|
37
|
+
factory: config.initData.factory,
|
|
38
|
+
factoryData: config.initData.factoryData,
|
|
75
39
|
salt,
|
|
76
|
-
implementation
|
|
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
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
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('
|
|
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('
|
|
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;
|
|
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
|
-
|
|
111
|
-
const
|
|
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
|
-
|
|
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,
|
|
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
|
});
|