module Language.Bitcoin.Script.Descriptors.Syntax (
OutputDescriptor (..),
ScriptDescriptor (..),
KeyDescriptor (..),
isDefinite,
keyDescPubKey,
keyBytes,
Origin (..),
Key (..),
KeyCollection (..),
pubKey,
secKey,
) where
import Data.ByteString (ByteString)
import Haskoin (
Address,
DerivPath,
Fingerprint,
PubKeyI (..),
SecKeyI,
XPubKey (xPubKey),
derivePubKeyI,
derivePubPath,
exportPubKey,
toSoft,
)
data OutputDescriptor
=
ScriptPubKey ScriptDescriptor
|
P2SH ScriptDescriptor
|
P2WPKH KeyDescriptor
|
P2WSH ScriptDescriptor
|
WrappedWPkh KeyDescriptor
|
WrappedWSh ScriptDescriptor
|
Combo KeyDescriptor
|
Addr Address
deriving (OutputDescriptor -> OutputDescriptor -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OutputDescriptor -> OutputDescriptor -> Bool
$c/= :: OutputDescriptor -> OutputDescriptor -> Bool
== :: OutputDescriptor -> OutputDescriptor -> Bool
$c== :: OutputDescriptor -> OutputDescriptor -> Bool
Eq, Int -> OutputDescriptor -> ShowS
[OutputDescriptor] -> ShowS
OutputDescriptor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OutputDescriptor] -> ShowS
$cshowList :: [OutputDescriptor] -> ShowS
show :: OutputDescriptor -> String
$cshow :: OutputDescriptor -> String
showsPrec :: Int -> OutputDescriptor -> ShowS
$cshowsPrec :: Int -> OutputDescriptor -> ShowS
Show)
data ScriptDescriptor
=
Pk KeyDescriptor
|
Pkh KeyDescriptor
|
Multi Int [KeyDescriptor]
|
SortedMulti Int [KeyDescriptor]
|
Raw ByteString
deriving (ScriptDescriptor -> ScriptDescriptor -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScriptDescriptor -> ScriptDescriptor -> Bool
$c/= :: ScriptDescriptor -> ScriptDescriptor -> Bool
== :: ScriptDescriptor -> ScriptDescriptor -> Bool
$c== :: ScriptDescriptor -> ScriptDescriptor -> Bool
Eq, Int -> ScriptDescriptor -> ShowS
[ScriptDescriptor] -> ShowS
ScriptDescriptor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScriptDescriptor] -> ShowS
$cshowList :: [ScriptDescriptor] -> ShowS
show :: ScriptDescriptor -> String
$cshow :: ScriptDescriptor -> String
showsPrec :: Int -> ScriptDescriptor -> ShowS
$cshowsPrec :: Int -> ScriptDescriptor -> ShowS
Show)
data KeyDescriptor = KeyDescriptor
{ KeyDescriptor -> Maybe Origin
origin :: Maybe Origin
, KeyDescriptor -> Key
keyDef :: Key
}
deriving (KeyDescriptor -> KeyDescriptor -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyDescriptor -> KeyDescriptor -> Bool
$c/= :: KeyDescriptor -> KeyDescriptor -> Bool
== :: KeyDescriptor -> KeyDescriptor -> Bool
$c== :: KeyDescriptor -> KeyDescriptor -> Bool
Eq, Int -> KeyDescriptor -> ShowS
[KeyDescriptor] -> ShowS
KeyDescriptor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyDescriptor] -> ShowS
$cshowList :: [KeyDescriptor] -> ShowS
show :: KeyDescriptor -> String
$cshow :: KeyDescriptor -> String
showsPrec :: Int -> KeyDescriptor -> ShowS
$cshowsPrec :: Int -> KeyDescriptor -> ShowS
Show)
data Origin = Origin
{ Origin -> Fingerprint
fingerprint :: Fingerprint
, Origin -> DerivPath
derivation :: DerivPath
}
deriving (Origin -> Origin -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Origin -> Origin -> Bool
$c/= :: Origin -> Origin -> Bool
== :: Origin -> Origin -> Bool
$c== :: Origin -> Origin -> Bool
Eq, Eq Origin
Origin -> Origin -> Bool
Origin -> Origin -> Ordering
Origin -> Origin -> Origin
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Origin -> Origin -> Origin
$cmin :: Origin -> Origin -> Origin
max :: Origin -> Origin -> Origin
$cmax :: Origin -> Origin -> Origin
>= :: Origin -> Origin -> Bool
$c>= :: Origin -> Origin -> Bool
> :: Origin -> Origin -> Bool
$c> :: Origin -> Origin -> Bool
<= :: Origin -> Origin -> Bool
$c<= :: Origin -> Origin -> Bool
< :: Origin -> Origin -> Bool
$c< :: Origin -> Origin -> Bool
compare :: Origin -> Origin -> Ordering
$ccompare :: Origin -> Origin -> Ordering
Ord, Int -> Origin -> ShowS
[Origin] -> ShowS
Origin -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Origin] -> ShowS
$cshowList :: [Origin] -> ShowS
show :: Origin -> String
$cshow :: Origin -> String
showsPrec :: Int -> Origin -> ShowS
$cshowsPrec :: Int -> Origin -> ShowS
Show)
data Key
=
Pubkey PubKeyI
|
SecretKey SecKeyI
| XPub XPubKey DerivPath KeyCollection
deriving (Key -> Key -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Key -> Key -> Bool
$c/= :: Key -> Key -> Bool
== :: Key -> Key -> Bool
$c== :: Key -> Key -> Bool
Eq, Int -> Key -> ShowS
[Key] -> ShowS
Key -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Key] -> ShowS
$cshowList :: [Key] -> ShowS
show :: Key -> String
$cshow :: Key -> String
showsPrec :: Int -> Key -> ShowS
$cshowsPrec :: Int -> Key -> ShowS
Show)
pubKey :: PubKeyI -> KeyDescriptor
pubKey :: PubKeyI -> KeyDescriptor
pubKey = Maybe Origin -> Key -> KeyDescriptor
KeyDescriptor forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. PubKeyI -> Key
Pubkey
secKey :: SecKeyI -> KeyDescriptor
secKey :: SecKeyI -> KeyDescriptor
secKey = Maybe Origin -> Key -> KeyDescriptor
KeyDescriptor forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. SecKeyI -> Key
SecretKey
data KeyCollection
= Single
|
HardKeys
|
SoftKeys
deriving (KeyCollection -> KeyCollection -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyCollection -> KeyCollection -> Bool
$c/= :: KeyCollection -> KeyCollection -> Bool
== :: KeyCollection -> KeyCollection -> Bool
$c== :: KeyCollection -> KeyCollection -> Bool
Eq, Eq KeyCollection
KeyCollection -> KeyCollection -> Bool
KeyCollection -> KeyCollection -> Ordering
KeyCollection -> KeyCollection -> KeyCollection
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KeyCollection -> KeyCollection -> KeyCollection
$cmin :: KeyCollection -> KeyCollection -> KeyCollection
max :: KeyCollection -> KeyCollection -> KeyCollection
$cmax :: KeyCollection -> KeyCollection -> KeyCollection
>= :: KeyCollection -> KeyCollection -> Bool
$c>= :: KeyCollection -> KeyCollection -> Bool
> :: KeyCollection -> KeyCollection -> Bool
$c> :: KeyCollection -> KeyCollection -> Bool
<= :: KeyCollection -> KeyCollection -> Bool
$c<= :: KeyCollection -> KeyCollection -> Bool
< :: KeyCollection -> KeyCollection -> Bool
$c< :: KeyCollection -> KeyCollection -> Bool
compare :: KeyCollection -> KeyCollection -> Ordering
$ccompare :: KeyCollection -> KeyCollection -> Ordering
Ord, Int -> KeyCollection -> ShowS
[KeyCollection] -> ShowS
KeyCollection -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyCollection] -> ShowS
$cshowList :: [KeyCollection] -> ShowS
show :: KeyCollection -> String
$cshow :: KeyCollection -> String
showsPrec :: Int -> KeyCollection -> ShowS
$cshowsPrec :: Int -> KeyCollection -> ShowS
Show)
keyBytes :: KeyDescriptor -> Maybe ByteString
keyBytes :: KeyDescriptor -> Maybe ByteString
keyBytes = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap PubKeyI -> ByteString
toBytes forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyDescriptor -> Maybe PubKeyI
keyDescPubKey
where
toBytes :: PubKeyI -> ByteString
toBytes (PubKeyI PubKey
pk Bool
c) = Bool -> PubKey -> ByteString
exportPubKey Bool
c PubKey
pk
keyDescPubKey :: KeyDescriptor -> Maybe PubKeyI
keyDescPubKey :: KeyDescriptor -> Maybe PubKeyI
keyDescPubKey (KeyDescriptor Maybe Origin
_ Key
k) = case Key
k of
Pubkey PubKeyI
pk -> forall a. a -> Maybe a
Just PubKeyI
pk
SecretKey SecKeyI
sk -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ SecKeyI -> PubKeyI
derivePubKeyI SecKeyI
sk
XPub XPubKey
xpub DerivPath
path KeyCollection
Single -> (PubKey -> Bool -> PubKeyI
`PubKeyI` Bool
True) forall b c a. (b -> c) -> (a -> b) -> a -> c
. XPubKey -> PubKey
xPubKey forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SoftPath -> XPubKey -> XPubKey
`derivePubPath` XPubKey
xpub) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall t. DerivPathI t -> Maybe SoftPath
toSoft DerivPath
path
Key
_ -> forall a. Maybe a
Nothing
isDefinite :: KeyDescriptor -> Bool
isDefinite :: KeyDescriptor -> Bool
isDefinite (KeyDescriptor Maybe Origin
_ Key
k) = case Key
k of
XPub XPubKey
_ DerivPath
_ KeyCollection
HardKeys -> Bool
False
XPub XPubKey
_ DerivPath
_ KeyCollection
SoftKeys -> Bool
False
Key
_ -> Bool
True