@@ -21,6 +21,7 @@ import (
2121 "github.com/0xsequence/go-sequence/core"
2222 v1 "github.com/0xsequence/go-sequence/core/v1"
2323 v2 "github.com/0xsequence/go-sequence/core/v2"
24+ v3 "github.com/0xsequence/go-sequence/core/v3"
2425 "github.com/goware/cachestore"
2526 "github.com/goware/cachestore/memlru"
2627)
@@ -75,6 +76,7 @@ var defaultEstimator = &Estimator{
7576var gasEstimatorCode = hexutil .Encode (contracts .GasEstimator .DeployedBin )
7677var walletGasEstimatorCode = hexutil .Encode (contracts .WalletGasEstimator .DeployedBin )
7778var walletGasEstimatorCodeV2 = hexutil .Encode (contracts .V2 .WalletGasEstimator .DeployedBin )
79+ var walletGasEstimatorCodeV3 = hexutil .Encode (contracts .V3 .WalletGasEstimator .DeployedBin )
7880
7981func NewEstimator () * Estimator {
8082 defaultCache , _ := memlru.NewWithSize [[]byte ](defaultEstimatorCacheSize )
@@ -397,6 +399,26 @@ func (e *Estimator) BuildStubSignature(walletConfig core.WalletConfig, willSign,
397399 },
398400 map [common.Address ]bool {address1 : false , address2 : true , address3 : true },
399401 map [common.Address ]bool {address1 : true , address2 : true , address3 : true })
402+ } else if _ , ok := walletConfig .(* v3.WalletConfig ); ok {
403+ sig = e .BuildStubSignature (& v3.WalletConfig {
404+ Threshold_ : 2 ,
405+ Tree : v3 .WalletConfigTreeNodes (
406+ & v3.WalletConfigTreeAddressLeaf {
407+ Address : address1 ,
408+ Weight : 1 ,
409+ },
410+ & v3.WalletConfigTreeAddressLeaf {
411+ Address : address2 ,
412+ Weight : 1 ,
413+ },
414+ & v3.WalletConfigTreeAddressLeaf {
415+ Address : address3 ,
416+ Weight : 1 ,
417+ },
418+ ),
419+ },
420+ map [common.Address ]bool {address1 : false , address2 : true , address3 : true },
421+ map [common.Address ]bool {address1 : true , address2 : true , address3 : true })
400422 }
401423
402424 return core .SignerSignatureTypeEIP1271 , sig , nil
@@ -428,6 +450,17 @@ func (e *Estimator) BuildStubSignature(walletConfig core.WalletConfig, willSign,
428450 return nil
429451 }
430452 return encoded
453+ } else if confV3 , ok := walletConfig .(* v3.WalletConfig ); ok {
454+ sigV3 , err := confV3 .BuildRegularSignature (context .Background (), stubSigner , false )
455+ if err != nil {
456+ return nil
457+ }
458+
459+ encoded , err := sigV3 .Data ()
460+ if err != nil {
461+ return nil
462+ }
463+ return encoded
431464 } else {
432465 return nil
433466 }
@@ -457,6 +490,11 @@ func (e *Estimator) Estimate(ctx context.Context, provider *ethrpc.Provider, add
457490 walletContext .MainModuleAddress : {Code : walletGasEstimatorCodeV2 },
458491 walletContext .MainModuleUpgradableAddress : {Code : walletGasEstimatorCodeV2 },
459492 }
493+ } else if _ , ok := walletConfig .(* v3.WalletConfig ); ok {
494+ overrides = map [common.Address ]* CallOverride {
495+ walletContext .MainModuleAddress : {Code : walletGasEstimatorCodeV3 },
496+ walletContext .MainModuleUpgradableAddress : {Code : walletGasEstimatorCodeV3 },
497+ }
460498 } else {
461499 return 0 , fmt .Errorf ("unknown wallet config type" )
462500 }
@@ -500,6 +538,11 @@ func (e *Estimator) Estimate(ctx context.Context, provider *ethrpc.Provider, add
500538 if err != nil {
501539 return 0 , err
502540 }
541+ } else if _ , ok := walletConfig .(* v3.WalletConfig ); ok {
542+ execData , err = contracts .V3 .WalletMainModule .Encode ("execute" , encTxs , nonce , signature )
543+ if err != nil {
544+ return 0 , err
545+ }
503546 }
504547
505548 estimated , err := e .EstimateCall (ctx , provider , & EstimateTransaction {
@@ -635,6 +678,63 @@ func V2Simulate(provider *ethrpc.Provider, wallet common.Address, transactions T
635678 return results , nil
636679}
637680
681+ func V3Simulate (provider * ethrpc.Provider , wallet common.Address , transactions Transactions , block string , overrides map [common.Address ]* CallOverride ) ([]SimulateResult , error ) {
682+ if block == "" {
683+ block = "latest"
684+ }
685+
686+ encoded , err := transactions .EncodedTransactions ()
687+ if err != nil {
688+ return nil , err
689+ }
690+
691+ callData , err := contracts .V3 .WalletGasEstimator .Encode ("simulateExecute" , encoded )
692+ if err != nil {
693+ return nil , err
694+ }
695+
696+ type ethCallParams struct {
697+ To common.Address `json:"to"`
698+ Data string `json:"data"`
699+ }
700+
701+ params := ethCallParams {
702+ To : wallet ,
703+ Data : hexutil .Encode (callData ),
704+ }
705+
706+ allOverrides := map [common.Address ]* CallOverride {
707+ wallet : {Code : walletGasEstimatorCodeV3 },
708+ }
709+ for address , override := range overrides {
710+ if address == wallet {
711+ return nil , fmt .Errorf ("cannot override wallet address %v" , wallet .Hex ())
712+ }
713+
714+ allOverrides [address ] = override
715+ }
716+
717+ var response string
718+ rpcCall := ethrpc .NewCallBuilder [string ]("eth_call" , nil , params , block , allOverrides )
719+ _ , err = provider .Do (context .Background (), rpcCall .Into (& response ))
720+ if err != nil {
721+ return nil , err
722+ }
723+
724+ resultsData , err := hexutil .Decode (response )
725+ if err != nil {
726+ return nil , err
727+ }
728+
729+ var results []SimulateResult
730+ err = contracts .V3 .WalletGasEstimator .Decode (& results , "simulateExecute" , resultsData )
731+ if err != nil {
732+ return nil , err
733+ }
734+
735+ return results , nil
736+ }
737+
638738func Simulate (provider * ethrpc.Provider , wallet common.Address , transactions Transactions , block string , overrides map [common.Address ]* CallOverride ) ([]SimulateResult , error ) {
639- return V2Simulate (provider , wallet , transactions , block , overrides )
739+ return V3Simulate (provider , wallet , transactions , block , overrides )
640740}
0 commit comments