@@ -20,26 +20,59 @@ public class WriteOperation: ReadOperation {
2020    ///   - sendRaw: If set to `true` transaction will be signed and sent using `eth_sendRawTransaction`.
2121    ///   Otherwise, no signing attempts will take place and the `eth_sendTransaction` RPC will be used instead.
2222    ///   Default value is `true`.
23-     public  func  writeToChain( password:  String ,  policies:  Policies  =  . auto,  sendRaw:  Bool  =  true )  async  throws  ->  TransactionSendingResult  { 
24-         try await  policyResolver. resolveAll ( for:  & transaction,  with:  policies) 
23+     public  func  writeToChain( password:  String , 
24+                              policies:  Policies  =  . auto, 
25+                              sendRaw:  Bool  =  true )  async  throws  ->  TransactionSendingResult  { 
26+         try await  resolvePolicies ( policies) 
2527
2628        guard  sendRaw else  { 
2729            return  try await  web3. eth. send ( transaction) 
2830        } 
2931
32+         try signTransaction ( password:  password) 
33+ 
34+         guard  let  transactionData =  transaction. encode ( for:  . transaction)  else  { 
35+             throw  Web3Error . dataError
36+         } 
37+         return  try await  web3. eth. send ( raw:  transactionData) 
38+     } 
39+ 
40+     /// Resolves all policy-driven transaction attributes: gas limit, gas price, nonce.
41+     /// - Parameters:
42+     ///   - policies: Determining the behaviour of how transaction attributes like gas limit and
43+     ///   nonce are resolved. Default value is ``Policies/auto``.
44+     /// - Throws: Rethrows any error that occurs during policy resolution.
45+     public  func  resolvePolicies( _ policies:  Policies )  async  throws  { 
46+         try await  policyResolver. resolveAll ( for:  & transaction,  with:  policies) 
47+     } 
48+ 
49+     /// Signs the transaction locally using the attached keystore manager.
50+     /// - Parameters:
51+     ///   - password: Password for the private key in the keystore manager attached to the provider
52+     ///   you set to `web3` passed in the initializer.
53+     /// - Throws:
54+     ///   - ``Web3Error/inputError`` if no keystore is attached to the provider,
55+     ///     or if signing fails with the provided password.
56+     @discardableResult  
57+     public  func  signTransaction( password:  String )  throws  ->  CodableTransaction  { 
3058        guard  let  attachedKeystoreManager =  web3. provider. attachedKeystoreManager else  { 
31-             throw  Web3Error . inputError ( desc:  " Failed to locally sign a transaction. Web3 provider doesn't have keystore attached. " ) 
59+             throw  Web3Error . inputError ( 
60+                 desc:  " Failed to locally sign a transaction. Web3 provider doesn't have keystore attached. " 
61+             ) 
3262        } 
3363
3464        do  { 
35-             try Web3Signer . signTX ( transaction:  & transaction, 
36-                                   keystore:  attachedKeystoreManager, 
37-                                   account:  transaction. from ??  transaction. sender ??  EthereumAddress . contractDeploymentAddress ( ) , 
38-                                   password:  password) 
65+             try Web3Signer . signTX ( 
66+                 transaction:  & transaction, 
67+                 keystore:  attachedKeystoreManager, 
68+                 account:  transaction. from ??  transaction. sender ??  EthereumAddress . contractDeploymentAddress ( ) , 
69+                 password:  password
70+             ) 
71+             return  transaction
3972        }  catch  { 
40-             throw  Web3Error . inputError ( desc:  " Failed to locally sign a transaction.  \( error. localizedDescription) " ) 
73+             throw  Web3Error . inputError ( 
74+                 desc:  " Failed to locally sign a transaction.  \( error. localizedDescription) " 
75+             ) 
4176        } 
42-         guard  let  transactionData =  transaction. encode ( for:  . transaction)  else  {  throw  Web3Error . dataError } 
43-         return  try await  web3. eth. send ( raw:  transactionData) 
4477    } 
4578} 
0 commit comments