package utils import ( "crypto/ecdsa" "math/big" "strings" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/status-im/status-go/account" "github.com/status-im/status-go/api/multiformat" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" prot_common "github.com/status-im/status-go/protocol/common" ) func GetSigner(chainID uint64, from types.Address, privateKey *ecdsa.PrivateKey) bind.SignerFn { return func(addr common.Address, tx *ethTypes.Transaction) (*ethTypes.Transaction, error) { s := ethTypes.NewLondonSigner(new(big.Int).SetUint64(chainID)) return ethTypes.SignTx(tx, s, privateKey) } } func VerifyPasswordAndGetSigner(chainID uint64, accountsManager *account.GethManager, keyStoreDir string, from types.Address, password string) bind.SignerFn { return func(addr common.Address, tx *ethTypes.Transaction) (*ethTypes.Transaction, error) { selectedAccount, err := accountsManager.VerifyAccountPassword(keyStoreDir, from.Hex(), password) if err != nil { return nil, err } s := ethTypes.NewLondonSigner(new(big.Int).SetUint64(chainID)) return ethTypes.SignTx(tx, s, selectedAccount.PrivateKey) } } func DeserializePublicKey(compressedKey string) (types.HexBytes, error) { rawKey, err := multiformat.DeserializePublicKey(compressedKey, "f") if err != nil { return nil, err } secp256k1Code := "fe701" pubKeyBytes := "0x" + strings.TrimPrefix(rawKey, secp256k1Code) pubKey, err := prot_common.HexToPubkey(pubKeyBytes) if err != nil { return nil, err } return crypto.CompressPubkey(pubKey), nil } func SerializePublicKey(compressedKey types.HexBytes) (string, error) { rawKey, err := crypto.DecompressPubkey(compressedKey) if err != nil { return "", err } pubKey := types.EncodeHex(crypto.FromECDSAPub(rawKey)) secp256k1Code := "0xe701" base58btc := "z" multiCodecKey := secp256k1Code + strings.TrimPrefix(pubKey, "0x") cpk, err := multiformat.SerializePublicKey(multiCodecKey, base58btc) if err != nil { return "", err } return cpk, nil }