diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5bb976da2c4deccf986784eddc900b21fce2cab9..fa1254d02cff828bef85366164bc3cd34b2c0795 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -10,18 +10,18 @@ repos:
     - id: isort
       args: ["--profile", "black"]
 -   repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v0.982
+    rev: v0.991
     hooks:
     - id: mypy
       args:
         - "--install-types"
         - "--non-interactive"
 -   repo: https://github.com/PyCQA/pylint
-    rev: v2.15.4
+    rev: v2.15.8
     hooks:
     - id: pylint
 -   repo: https://github.com/asottile/pyupgrade
-    rev: v3.1.0
+    rev: v3.3.1
     hooks:
     - id: pyupgrade
       args: [--py37-plus]
diff --git a/duniterpy/api/bma/blockchain.py b/duniterpy/api/bma/blockchain.py
index 2ea9d00711fbfa1f3c8961d07d31ccc4605d0d2b..e2d4b906cf68e8d6a19ebff632518d034f4fc78d 100644
--- a/duniterpy/api/bma/blockchain.py
+++ b/duniterpy/api/bma/blockchain.py
@@ -15,7 +15,7 @@
 
 import logging
 from http.client import HTTPResponse
-from typing import Union
+from typing import Optional, Union
 
 from duniterpy.api.client import RESPONSE_HTTP, Client
 
@@ -266,7 +266,10 @@ def current(client: Client) -> dict:
 
 
 def block(
-    client: Client, number: int = 0, block_raw: str = None, signature: str = None
+    client: Client,
+    number: int = 0,
+    block_raw: Optional[str] = None,
+    signature: Optional[str] = None,
 ) -> Union[dict, HTTPResponse]:
     """
     GET/POST a block from/to the blockchain
diff --git a/duniterpy/api/endpoint.py b/duniterpy/api/endpoint.py
index fd28e9c03241637fa4c3d9c1ca6628bb6875256b..e6e318ec8ec456cd4054f3017fd6ce41563331a8 100644
--- a/duniterpy/api/endpoint.py
+++ b/duniterpy/api/endpoint.py
@@ -67,7 +67,7 @@ class Endpoint:
     def inline(self) -> str:
         raise NotImplementedError("inline() is not implemented")
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         raise NotImplementedError("conn_handler is not implemented")
 
     def __str__(self) -> str:
@@ -114,7 +114,7 @@ class UnknownEndpoint(Endpoint):
             doc += f" {p}"
         return doc
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler
 
@@ -188,7 +188,7 @@ class BMAEndpoint(Endpoint):
         ]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -285,7 +285,7 @@ class SecuredBMAEndpoint(BMAEndpoint):
         ]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -354,7 +354,7 @@ class WS2PEndpoint(Endpoint):
         ]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -425,7 +425,7 @@ class ESCoreEndpoint(Endpoint):
         inlined = [str(info) for info in (self.host, self.port) if info]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -484,7 +484,7 @@ class ESUserEndpoint(Endpoint):
         inlined = [str(info) for info in (self.host, self.port) if info]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -547,7 +547,7 @@ class ESSubscribtionEndpoint(Endpoint):
         inlined = [str(info) for info in (self.host, self.port) if info]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
@@ -646,7 +646,7 @@ class GVAEndpoint(Endpoint):
         ]
         return f'{self.API} {" ".join(inlined)}'
 
-    def conn_handler(self, proxy: str = None) -> ConnectionHandler:
+    def conn_handler(self, proxy: Optional[str] = None) -> ConnectionHandler:
         """
         Return connection handler instance for the endpoint
 
diff --git a/duniterpy/documents/block.py b/duniterpy/documents/block.py
index b6ee43629f91a2a2035b27762449bbb7b1dbbfe4..50984bbd3b2c54c37d8d83c5da20750d3c639417 100644
--- a/duniterpy/documents/block.py
+++ b/duniterpy/documents/block.py
@@ -168,7 +168,7 @@ class Block(Document):
         transactions: List[Transaction],
         inner_hash: str,
         nonce: int,
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
     ) -> None:
diff --git a/duniterpy/documents/certification.py b/duniterpy/documents/certification.py
index 662dfde385ddfea57b33e44bba6c461cf795d4f2..ff38e16b1219bdd1ad8c728eb9d3944aaf75ef93 100644
--- a/duniterpy/documents/certification.py
+++ b/duniterpy/documents/certification.py
@@ -57,7 +57,7 @@ class Certification(Document):
         pubkey_from: str,
         identity: Union[Identity, str],
         block_id: BlockID,
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
     ) -> None:
diff --git a/duniterpy/documents/identity.py b/duniterpy/documents/identity.py
index 2b5eeb56d8918ec27e696150eda1ae4ae9a3b9a4..0757a4c23bd415a0fd62db7c054b79d220d7979d 100644
--- a/duniterpy/documents/identity.py
+++ b/duniterpy/documents/identity.py
@@ -14,7 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import re
-from typing import Any, Type, TypeVar
+from typing import Any, Optional, Type, TypeVar
 
 from ..constants import (
     BLOCK_ID_REGEX,
@@ -73,7 +73,7 @@ class Identity(Document):
         pubkey: str,
         uid: str,
         block_id: BlockID,
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
     ) -> None:
diff --git a/duniterpy/documents/membership.py b/duniterpy/documents/membership.py
index 56501392099ea0da7f9249bd55de96499d8fffb8..99610f1b08d4088c83ede527b3eb7cdcddf59ebc 100644
--- a/duniterpy/documents/membership.py
+++ b/duniterpy/documents/membership.py
@@ -14,7 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import re
-from typing import Any, Type, TypeVar
+from typing import Any, Optional, Type, TypeVar
 
 from ..constants import (
     BLOCK_ID_REGEX,
@@ -77,7 +77,7 @@ class Membership(Document):
         membership_block_id: BlockID,
         uid: str,
         identity_block_id: BlockID,
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
         membership_type: str = "IN",
diff --git a/duniterpy/documents/peer.py b/duniterpy/documents/peer.py
index bb5bcfcc6a1dd1c858c61bbe29acb8b4e7193278..f0c5421f579dde098789d4bc7efa5cfbf80df3c5 100644
--- a/duniterpy/documents/peer.py
+++ b/duniterpy/documents/peer.py
@@ -14,7 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import re
-from typing import List, Type, TypeVar
+from typing import List, Optional, Type, TypeVar
 
 from duniterpy.api.endpoint import Endpoint, endpoint
 
@@ -67,7 +67,7 @@ class Peer(Document):
         pubkey: str,
         block_id: BlockID,
         endpoints: List[Endpoint],
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
     ) -> None:
diff --git a/duniterpy/documents/revocation.py b/duniterpy/documents/revocation.py
index 2cd7394a86960a3626b0a2ded4d4ce72fdb261ae..997cd867e2212843624cca102faae81331ca4956 100644
--- a/duniterpy/documents/revocation.py
+++ b/duniterpy/documents/revocation.py
@@ -14,7 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import re
-from typing import Any, Type, TypeVar, Union
+from typing import Any, Optional, Type, TypeVar, Union
 
 from ..constants import (
     BLOCK_ID_REGEX,
@@ -59,7 +59,7 @@ class Revocation(Document):
     def __init__(
         self,
         identity: Union[Identity, str],
-        signing_key: SigningKey = None,
+        signing_key: Optional[SigningKey] = None,
         version: int = VERSION,
         currency: str = G1_CURRENCY_CODENAME,
     ) -> None:
diff --git a/duniterpy/grammars/output.py b/duniterpy/grammars/output.py
index 81ba6a98e5cd2e79a8050f5160b0c81fc55d35fa..babcb99b40fe5f33ca25387c8dead2a5c3f2afa9 100644
--- a/duniterpy/grammars/output.py
+++ b/duniterpy/grammars/output.py
@@ -151,7 +151,7 @@ class CSV:
         return csv
 
     def compose(
-        self, parser: Any = None, grammar: Any = None, attr_of: str = None
+        self, parser: Any = None, grammar: Any = None, attr_of: Optional[str] = None
     ) -> str:
         """
         Return the CSV(time) expression as string format
@@ -210,7 +210,7 @@ class CLTV:
         return cltv
 
     def compose(
-        self, parser: Any = None, grammar: Any = None, attr_of: str = None
+        self, parser: Any = None, grammar: Any = None, attr_of: Optional[str] = None
     ) -> str:
         """
         Return the CLTV(timestamp) expression as string format
@@ -269,7 +269,7 @@ class XHX:
         return xhx
 
     def compose(
-        self, parser: Any = None, grammar: Any = None, attr_of: str = None
+        self, parser: Any = None, grammar: Any = None, attr_of: Optional[str] = None
     ) -> str:
         """
         Return the XHX(sha_hash) expression as string format
@@ -305,7 +305,7 @@ class Operator(Keyword):
         return op
 
     def compose(
-        self, parser: Any = None, grammar: Any = None, attr_of: str = None
+        self, parser: Any = None, grammar: Any = None, attr_of: Optional[str] = None
     ) -> str:
         """
         Return the Operator keyword as string format
@@ -382,7 +382,9 @@ class Condition:
             condition.right = right
         return condition
 
-    def compose(self, parser: Any, grammar: Any = None, attr_of: str = None) -> str:
+    def compose(
+        self, parser: Any, grammar: Any = None, attr_of: Optional[str] = None
+    ) -> str:
         """
         Return the Condition as string format
 
diff --git a/duniterpy/key/signing_key.py b/duniterpy/key/signing_key.py
index 91a19482456cd94a3dcbba6d93eee56016efe33d..30814c1a6db1d83c843a80b3ea4e381ada0f6032 100644
--- a/duniterpy/key/signing_key.py
+++ b/duniterpy/key/signing_key.py
@@ -500,7 +500,9 @@ Data: {ewif_key}"
 
     @classmethod
     def from_dubp_mnemonic(
-        cls: Type[SigningKeyType], mnemonic: str, scrypt_params: ScryptParams = None
+        cls: Type[SigningKeyType],
+        mnemonic: str,
+        scrypt_params: Optional[ScryptParams] = None,
     ) -> SigningKeyType:
         """
         Generate key pair instance from a DUBP mnemonic passphrase