-module(glethers@signer). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([sign_hash/2, sign_typed_data/4, sign_message/2, verify_signature/3]). -export_type([signer/0]). -type signer() :: {signer, glethers@provider:provider(), glethers@signer@signing_key:private_key()}. -spec sign_hash( glethers@signer@signing_key:private_key(), glethers@hash@message:hash() ) -> secp256k1_gleam:signature(). sign_hash(Private_key, Hash) -> Private_key@1 = begin _pipe = Private_key, glethers@signer@signing_key:to_bit_array(_pipe) end, Message = begin _pipe@1 = Hash, glethers@hash@message:to_bit_array(_pipe@1) end, _assert_subject = secp256k1_gleam:sign(Message, Private_key@1), {ok, Signature} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"glethers/signer"/utf8>>, function => <<"sign_hash"/utf8>>, line => 17}) end, Signature. -spec sign_typed_data( glethers@signer@signing_key:private_key(), glethers@hash@typed_data:typed_data_domain(), HVV, fun((HVV) -> {binary(), list({binary(), glethers@hash@typed_data:complex_field()})}) ) -> secp256k1_gleam:signature(). sign_typed_data(Private_key, Domain, Struct, Encoder) -> Hash = glethers@hash@typed_data:hash_message(Domain, Struct, Encoder), sign_hash(Private_key, Hash). -spec sign_message(glethers@signer@signing_key:private_key(), binary()) -> secp256k1_gleam:signature(). sign_message(Private_key, Message) -> Hash = glethers@hash@message:hash_message(Message), sign_hash(Private_key, Hash). -spec verify_signature( glethers@signer@signing_key:private_key(), binary(), secp256k1_gleam:signature() ) -> boolean(). verify_signature(Private_key, Message, Signature) -> Private_key@1 = begin _pipe = Private_key, glethers@signer@signing_key:to_bit_array(_pipe) end, _assert_subject = 'Elixir.ExSecp256k1':create_public_key(Private_key@1), {ok, Public_key} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"glethers/signer"/utf8>>, function => <<"verify_signature"/utf8>>, line => 42}) end, Hash = begin _pipe@1 = glethers@hash@message:hash_message(Message), glethers@hash@message:to_bit_array(_pipe@1) end, case secp256k1_gleam:verify(Hash, Signature, Public_key) of {ok, _} -> true; {error, _} -> false end.