Completed
Pull Request — master (#662)
by thomas
38:24
created

NetworkConfig::__construct()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 2
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace BitWasp\Bitcoin\Key\Deterministic\HdPrefix;
4
5
use BitWasp\Bitcoin\Network\NetworkInterface;
6
7
class NetworkConfig
8
{
9
    /**
10
     * @var NetworkInterface
11
     */
12
    private $network;
13
14
    /**
15
     * @var ScriptPrefix[]
16
     */
17
    private $scriptPrefixMap = [];
18
19
    /**
20
     * @var ScriptPrefix[]
21
     */
22
    private $scriptTypeMap = [];
23
24
    /**
25
     * NetworkHdKeyPrefixConfig constructor.
26
     * @param NetworkInterface $network
27
     * @param ScriptPrefix[] $prefixConfigList
28
     */
29
    public function __construct(NetworkInterface $network, array $prefixConfigList)
30
    {
31
        foreach ($prefixConfigList as $config) {
32
            if (!($config instanceof ScriptPrefix)) {
33
                throw new \InvalidArgumentException("expecting array of NetworkPrefixConfig");
34
            }
35
            $this->setupConfig($config);
36
        }
37
38
        $this->network = $network;
39
    }
40
41
    /**
42
     * @param ScriptPrefix $config
43
     */
44
    private function setupConfig(ScriptPrefix $config)
45
    {
46
        $this->checkForOverwriting($config);
47
48
        $this->scriptPrefixMap[$config->getPrivatePrefix()] = $config;
49
        $this->scriptPrefixMap[$config->getPublicPrefix()] = $config;
50
        $this->scriptTypeMap[$config->getScriptDataFactory()->getScriptType()] = $config;
51
    }
52
53
    /**
54
     * @param ScriptPrefix $config
55
     */
56
    private function checkForOverwriting(ScriptPrefix $config)
57
    {
58
        if (array_key_exists($config->getPublicPrefix(), $this->scriptPrefixMap)) {
59
            $this->rejectConflictPrefix($config, $config->getPublicPrefix());
60
        }
61
62
        if (array_key_exists($config->getPrivatePrefix(), $this->scriptPrefixMap)) {
63
            $this->rejectConflictPrefix($config, $config->getPrivatePrefix());
64
        }
65
66
        if (array_key_exists($config->getScriptDataFactory()->getScriptType(), $this->scriptTypeMap)) {
67
            $this->rejectConflictScriptType($config);
68
        }
69
    }
70
71
    /**
72
     * @param ScriptPrefix $config
73
     * @param string $prefix
74
     */
75
    private function rejectConflictPrefix(ScriptPrefix $config, $prefix)
76
    {
77
        $conflict = $this->scriptPrefixMap[$prefix];
78
        throw new \RuntimeException(sprintf(
79
            "A BIP32 prefix for %s conflicts with the %s BIP32 prefix of %s",
80
            $config->getScriptDataFactory()->getScriptType(),
81
            $prefix === $config->getPublicPrefix() ? "public" : "private",
82
            $conflict->getScriptDataFactory()->getScriptType()
83
        ));
84
    }
85
86
    /**
87
     * @param ScriptPrefix $config
88
     */
89
    private function rejectConflictScriptType(ScriptPrefix $config)
90
    {
91
        throw new \RuntimeException(sprintf(
92
            "The script type %s has a conflict",
93
            $config->getScriptDataFactory()->getScriptType()
94
        ));
95
    }
96
97
    /**
98
     * @return NetworkInterface
99
     */
100
    public function getNetwork()
101
    {
102
        return $this->network;
103
    }
104
105
    /**
106
     * @param string $prefix
107
     * @return ScriptPrefix
108
     */
109
    public function getConfigForPrefix($prefix)
110
    {
111
        if (!array_key_exists($prefix, $this->scriptPrefixMap)) {
112
            throw new \InvalidArgumentException("Prefix not configured for network");
113
        }
114
115
        return $this->scriptPrefixMap[$prefix];
116
    }
117
118
    /**
119
     * @param string $scriptType
120
     * @return ScriptPrefix
121
     */
122
    public function getConfigForScriptType($scriptType)
123
    {
124
        if (!array_key_exists($scriptType, $this->scriptTypeMap)) {
125
            throw new \InvalidArgumentException("Script type not configured for network");
126
        }
127
128
        return $this->scriptTypeMap[$scriptType];
129
    }
130
}
131