@@ -2,11 +2,10 @@ import { type GrantPermissionsReturnType } from "viem/experimental";
22import { bigIntReplacer } from "./CommonUtils" ;
33import { signMessage } from "viem/accounts" ;
44import { type Chain } from "viem" ;
5- import { WalletConnectCosigner } from "./WalletConnectCosignerUtils" ;
65import {
76 buildUserOp ,
7+ sendUserOp ,
88 type Call ,
9- type FillUserOpResponse ,
109} from "./UserOpBuilderServiceUtils" ;
1110
1211export type MultikeySigner = {
@@ -16,102 +15,52 @@ export type MultikeySigner = {
1615 } ;
1716} ;
1817
19- async function prepareUserOperationWithPermissions ( args : {
18+ export async function executeActionsWithECDSAAndCosignerPermissions ( args : {
2019 actions : Call [ ] ;
20+ ecdsaPrivateKey : `0x${string } `;
2121 chain : Chain ;
2222 permissions : GrantPermissionsReturnType ;
23- } ) : Promise < FillUserOpResponse > {
24- const { actions, chain, permissions } = args ;
23+ pci : string ;
24+ } ) : Promise < `0x${string } `> {
25+ const { ecdsaPrivateKey, actions, chain, permissions, pci } = args ;
26+ if ( ! pci ) {
27+ throw new Error ( "No WC_COSIGNER PCI data available" ) ;
28+ }
2529 if ( ! permissions ) {
2630 throw new Error ( "No permissions available" ) ;
2731 }
2832 const { signerData, permissionsContext } = permissions ;
2933
30- if (
31- ! signerData ?. userOpBuilder ||
32- ! signerData . submitToAddress ||
33- ! permissionsContext
34- ) {
34+ if ( ! signerData ?. submitToAddress || ! permissionsContext ) {
3535 throw new Error (
3636 `Invalid permissions ${ JSON . stringify ( permissions , bigIntReplacer ) } ` ,
3737 ) ;
3838 }
39+ const accountAddress = signerData . submitToAddress ;
3940
4041 const filledUserOp = await buildUserOp ( {
41- account : signerData . submitToAddress ,
42+ account : accountAddress ,
4243 chainId : chain . id ,
4344 calls : actions ,
4445 capabilities : {
4546 permissions : { context : permissionsContext as `0x${string } ` } ,
4647 } ,
4748 } ) ;
4849
49- return filledUserOp ;
50- }
51-
52- async function signUserOperationWithECDSAKey ( args : {
53- ecdsaPrivateKey : `0x${string } `;
54- userOpHash : `0x${string } `;
55- } ) : Promise < `0x${string } `> {
56- const { ecdsaPrivateKey, userOpHash } = args ;
50+ const userOp = filledUserOp . userOp ;
5751
58- const dappSignatureOnUserOp = await signMessage ( {
52+ const dappSignature = await signMessage ( {
5953 privateKey : ecdsaPrivateKey ,
60- message : { raw : userOpHash } ,
54+ message : { raw : filledUserOp . hash } ,
6155 } ) ;
56+ userOp . signature = dappSignature ;
6257
63- return dappSignatureOnUserOp ;
64- }
65-
66- export async function executeActionsWithECDSAAndCosignerPermissions ( args : {
67- actions : Call [ ] ;
68- ecdsaPrivateKey : `0x${string } `;
69- chain : Chain ;
70- permissions : GrantPermissionsReturnType ;
71- pci : string ;
72- } ) : Promise < `0x${string } `> {
73- const { ecdsaPrivateKey, actions, chain, permissions, pci } = args ;
74- const accountAddress = permissions ?. signerData ?. submitToAddress ;
75- if ( ! accountAddress ) {
76- throw new Error ( `Unable to get account details from granted permission` ) ;
77- }
78-
79- if ( ! pci ) {
80- throw new Error ( "No WC_COSIGNER PCI data available" ) ;
81- }
82- const caip10Address = `eip155:${ chain ?. id } :${ accountAddress } ` ;
83- const filledUserOp = await prepareUserOperationWithPermissions ( {
84- actions,
85- chain,
86- permissions,
87- } ) ;
88- const userOp = filledUserOp . userOp ;
89-
90- const dappSignature = await signUserOperationWithECDSAKey ( {
91- ecdsaPrivateKey,
92- userOpHash : filledUserOp . hash ,
58+ const sendUserOpResponse = await sendUserOp ( {
59+ userOp,
60+ pci,
61+ chainId : chain . id ,
62+ permissionsContext : permissionsContext as `0x${string } `,
9363 } ) ;
9464
95- userOp . signature = dappSignature ;
96- const walletConnectCosigner = new WalletConnectCosigner ( ) ;
97- const cosignResponse = await walletConnectCosigner . coSignUserOperation (
98- caip10Address ,
99- {
100- pci,
101- userOp : {
102- ...userOp ,
103- callData : userOp . callData ,
104- callGasLimit : BigInt ( userOp . callGasLimit ) ,
105- nonce : BigInt ( userOp . nonce ) ,
106- preVerificationGas : BigInt ( userOp . preVerificationGas ) ,
107- verificationGasLimit : BigInt ( userOp . verificationGasLimit ) ,
108- sender : userOp . sender ,
109- signature : userOp . signature ,
110- maxFeePerGas : BigInt ( userOp . maxFeePerGas ) ,
111- maxPriorityFeePerGas : BigInt ( userOp . maxPriorityFeePerGas ) ,
112- } ,
113- } ,
114- ) ;
115- console . log ( "Cosign response:" , cosignResponse ) ;
116- return cosignResponse . receipt as `0x${string } `;
65+ return sendUserOpResponse . userOpId ;
11766}
0 commit comments