tokencrawler/.venv/lib/python3.9/site-packages/solana/account.py
2022-03-17 22:16:30 +01:00

80 lines
2.9 KiB
Python

"""(Deprecated, use `solana.keypair` instead).
Account module to manage public-private key pair and signing messages.
"""
from __future__ import annotations
from typing import List, Optional, Union
from warnings import warn
from based58 import b58encode
from nacl import public, signing # type: ignore
from solana.publickey import PublicKey
class Account:
"""(Deprecated) An account key pair (public and secret keys).
>>> # Import account from 64-byte keypair
>>> keypair = [
... 90, 249, 112, 214, 86, 235, 20, 215, 175, 33, 227, 50, 72, 214, 59, 49,
... 38, 161, 99, 83, 107, 188, 57, 48, 119, 189, 46, 148, 160, 214, 239, 148,
... 219, 250, 20, 106, 35, 41, 118, 107, 89, 96, 195, 15, 153, 248, 223, 6,
... 46, 71, 142, 92, 169, 240, 177, 106, 86, 194, 21, 62, 29, 222, 206, 82]
>>> account = Account(keypair[:32])
>>> account.public_key()
4HtxMbEK1QYzo9KjXEZoDeGrkhYkDtWdiQUARxz5VCoW
"""
def __init__(self, secret_key: Optional[Union[bytes, str, List[int], int]] = None):
"""Create a new Account object.
:pararm secret_key: Secret key for the account.
"""
warn("solana.account.Account is deprecated, please use solana.keypair.KeyPair", category=DeprecationWarning)
key: Optional[bytes] = None
if isinstance(secret_key, int):
key = bytes(PublicKey(secret_key))
if isinstance(secret_key, list):
key = bytes(secret_key)
elif isinstance(secret_key, str):
key = bytes(secret_key, encoding="utf-8")
elif isinstance(secret_key, bytes):
key = secret_key
self._secret = public.PrivateKey(key) if key else public.PrivateKey.generate()
def public_key(self) -> PublicKey:
"""The public key for this account."""
verify_key = signing.SigningKey(self.secret_key()).verify_key
return PublicKey(bytes(verify_key))
def secret_key(self) -> bytes:
"""The **Unencrypted** secret key for this account."""
return bytes(self._secret)
def keypair(self) -> bytes:
"""The 64 byte keypair for this account (base 58 encoded)."""
return b58encode(self.secret_key() + bytes(signing.SigningKey(self.secret_key()).verify_key))
def sign(self, msg: bytes) -> signing.SignedMessage:
"""Sign a message with this account.
Args:
msg: message to sign.
Returns:
A signed message object.
>>> secret_key = bytes([1] * 32)
>>> acc = Account(secret_key)
>>> msg = b"hello"
>>> signed_msg = acc.sign(msg)
>>> signed_msg.signature.hex()
'e1430c6ebd0d53573b5c803452174f8991ef5955e0906a09e8fdc7310459e9c82a402526748c3431fe7f0e5faafbf7e703234789734063ee42be17af16438d08'
>>> signed_msg.message.decode('utf-8')
'hello'
""" # pylint: disable=line-too-long
return signing.SigningKey(self.secret_key()).sign(msg)