Completed
Pull Request — 0.0.35 (#660)
by thomas
29:47 queued 20:44
created

NetworkConfig::getNetwork()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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