digraph wallet_program {
size="6.25";
rankdir=LR;
//ratio=fill;
splines=true;
fontname=Sans
ranksep=0.3;
penwidth=1.75;

overlap = false;

edge [ fontname=Sans, penwidth=1.75, style = "invis" ];
node [ fontname=Sans, shape = box, penwidth=1.75 ];

subgraph cluster_signing {
    penwidth=0;

    signing_priv [ label = "Create\nParent\nPrivate\nKey" ];
    signing_pub [ label = "Derive\nParent\nPublic\nKey" ];
    signing_distribute [ label = "Distribute\nPublic\nKeys", style="invis" ];
    signing_monitor [ label = "Monitor\nFor\nOutputs", style="invis" ];
    signing_create [ label = "Create\nUnsigned\nTxes", style="invis" ];
    signing_sign [ label = "Sign\nTxes" ];
    signing_broadcast [ label = "Broadcast\nTxes", style="invis" ];

    signing_priv -> signing_pub -> signing_distribute -> signing_monitor -> signing_create -> signing_sign -> signing_broadcast;
    label = "Signing-Only Wallet"
}

subgraph cluster_networked {
    penwidth=0;

    networked_priv [ label = "Create\nPrivate\nKeys", style="invis" ];
    networked_pub [ label = "Derive\nChild\nPublic\nKeys" ];
    networked_distribute [ label = "Distribute\nPublic\nKeys" ];
    networked_monitor [ label = "Monitor\nFor\nOutputs" ];
    networked_create [ label = "Create\nUnsigned\nTxes" ];
    networked_sign [ label = "Sign\nTxes", style="invis" ];
    networked_broadcast [ label = "Broadcast\nTxes" ];

    networked_priv -> networked_pub -> networked_distribute -> networked_monitor -> networked_create -> networked_sign -> networked_broadcast;
    label = "Networked Wallet"
}

signing_priv -> signing_pub [style=""];
signing_pub -> networked_pub [ constraint = false, style = ""];
networked_pub -> networked_distribute -> networked_monitor -> networked_create -> signing_sign -> networked_broadcast [style=""];

}

