Copyright | © 2018-2020 IOHK |
---|---|
License | Apache-2.0 |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- data Icarus (depth :: Depth ) key
- getKey :: Icarus depth key -> key
- genMasterKeyFromXPrv :: XPrv -> Icarus ' RootK XPrv
- genMasterKeyFromMnemonic :: SomeMnemonic -> ScrubbedBytes -> Icarus ' RootK XPrv
- deriveAccountPrivateKey :: Icarus ' RootK XPrv -> Index ' Hardened ' AccountK -> Icarus ' AccountK XPrv
- deriveAddressPrivateKey :: Icarus ' AccountK XPrv -> Role -> Index ' Soft ' PaymentK -> Icarus ' PaymentK XPrv
- deriveAddressPublicKey :: Icarus ' AccountK XPub -> Role -> Index ' Soft ' PaymentK -> Icarus ' PaymentK XPub
-
data
AddressInfo
=
AddressInfo
{
- infoAddressRoot :: ! ByteString
- infoNetworkTag :: !( Maybe NetworkTag )
- eitherInspectAddress :: Address -> Either ErrInspectAddress AddressInfo
- inspectAddress :: MonadThrow m => Address -> m Value
- paymentAddress :: NetworkDiscriminant Icarus -> Icarus ' PaymentK XPub -> Address
- data ErrInspectAddress
- prettyErrInspectAddress :: ErrInspectAddress -> String
- icarusMainnet :: NetworkDiscriminant Icarus
- icarusStaging :: NetworkDiscriminant Icarus
- icarusTestnet :: NetworkDiscriminant Icarus
- liftXPrv :: XPrv -> Icarus depth XPrv
- liftXPub :: XPub -> Icarus depth XPub
Documentation
This module provides an implementation of:
-
GenMasterKey
: for generating Icarus master keys from mnemonic sentences -
HardDerivation
: for hierarchical hard derivation of parent to child keys -
SoftDerivation
: for hierarchical soft derivation of parent to child keys -
PaymentAddress
: for constructing addresses from a public key
We call
Icarus
addresses the new format of Cardano addresses which came
after
Byron
. This is the format initially used in
Yoroi
and now also used by
Daedalus
.
Icarus
data Icarus (depth :: Depth ) key Source #
A cryptographic key for sequential-scheme address derivation, with phantom-types to disambiguate key types.
let rootPrivateKey = Icarus 'RootK XPrv let accountPubKey = Icarus 'AccountK XPub let addressPubKey = Icarus 'PaymentK XPub
Since: 1.0.0
Instances
Key Derivation
Generating a root key from
SomeMnemonic
:set -XOverloadedStrings :set -XTypeApplications :set -XDataKinds import Cardano.Mnemonic ( mkSomeMnemonic ) let (Right mw) = mkSomeMnemonic @'[15] ["network","empty","cause","mean","expire","private","finger","accident","session","problem","absurd","banner","stage","void","what"] let sndFactor = mempty -- Or alternatively, a second factor mnemonic transformed to bytes via someMnemonicToBytes let rootK = genMasterKeyFromMnemonic mw sndFactor :: Icarus 'RootK XPrv
Deriving child keys
Let's consider the following 3rd, 4th and 5th derivation paths
0'/0/14
let Just accIx = indexFromWord32 0x80000000 let acctK = deriveAccountPrivateKey rootK accIx let Just addIx = indexFromWord32 0x00000014 let addrK = deriveAddressPrivateKey acctK UTxOExternal addIx
genMasterKeyFromXPrv :: XPrv -> Icarus ' RootK XPrv Source #
Generate a root key from a corresponding root
XPrv
Since: 1.0.0
genMasterKeyFromMnemonic Source #
:: SomeMnemonic |
Some valid mnemonic sentence. |
-> ScrubbedBytes |
An optional second-factor passphrase (or
|
-> Icarus ' RootK XPrv |
Generate a root key from a corresponding mnemonic.
Since: 1.0.0
deriveAccountPrivateKey :: Icarus ' RootK XPrv -> Index ' Hardened ' AccountK -> Icarus ' AccountK XPrv Source #
Derives an account private key from the given root private key.
Since: 1.0.0
deriveAddressPrivateKey :: Icarus ' AccountK XPrv -> Role -> Index ' Soft ' PaymentK -> Icarus ' PaymentK XPrv Source #
Derives an address private key from the given account private key.
Since: 1.0.0
deriveAddressPublicKey :: Icarus ' AccountK XPub -> Role -> Index ' Soft ' PaymentK -> Icarus ' PaymentK XPub Source #
Derives an address public key from the given account public key.
Since: 1.0.0
Addresses
Generating a
PaymentAddress
import Cardano.Address ( bech32 ) import Cardano.Address.Derivation ( toXPub(..) ) bech32 $ paymentAddress icarusMainnet (toXPub <$> addrK) "addr1vxpfffuj3zkp5g7ct6h4va89caxx9ayq2gvkyfvww48sdncxsce5t"
data AddressInfo Source #
The result of
eitherInspectAddress
for Icarus addresses.
Since: 3.4.0
AddressInfo | |
|
Instances
eitherInspectAddress :: Address -> Either ErrInspectAddress AddressInfo Source #
Determines whether an
Address
is an Icarus address.
Returns either details about the
Address
, or
ErrInspectAddress
if it's
not a valid icarus address.
Since: 3.4.0
inspectAddress :: MonadThrow m => Address -> m Value Source #
Determines whether an
Address
is an Icarus address.
Returns a JSON object with information about the address, or throws
ErrInspectAddress
if the address isn't an icarus address.
Since: 2.0.0
paymentAddress :: NetworkDiscriminant Icarus -> Icarus ' PaymentK XPub -> Address Source #
Convert a public key to a payment
Address
valid for the given
network discrimination.
Since: 1.0.0
data ErrInspectAddress Source #
Possible errors from inspecting a Shelley address
Since: 3.0.0
Instances
prettyErrInspectAddress :: ErrInspectAddress -> String Source #
Pretty-print an
ErrInspectAddress
Since: 3.0.0
Network Discrimination
icarusMainnet :: NetworkDiscriminant Icarus Source #
NetworkDiscriminant
for Cardano MainNet &
Icarus
Since: 2.0.0
icarusStaging :: NetworkDiscriminant Icarus Source #
NetworkDiscriminant
for Cardano Staging &
Icarus
Since: 2.0.0
icarusTestnet :: NetworkDiscriminant Icarus Source #
NetworkDiscriminant
for Cardano TestNet &
Icarus
Since: 2.0.0
Unsafe
liftXPrv :: XPrv -> Icarus depth XPrv Source #
Unsafe backdoor for constructing an
Icarus
key from a raw
XPrv
. this is
unsafe because it lets the caller choose the actually derivation
depth
.
This can be useful however when serializing / deserializing such a type, or to speed up test code (and avoid having to do needless derivations from a master key down to an address key for instance).
Since: 1.0.0
liftXPub :: XPub -> Icarus depth XPub Source #
Unsafe backdoor for constructing an
Icarus
key from a raw
XPub
. this is
unsafe because it lets the caller choose the actually derivation
depth
.
This can be useful however when serializing / deserializing such a type, or to speed up test code (and avoid having to do needless derivations from a master key down to an address key for instance).
Since: 2.0.0