Completed
Pull Request — master (#591)
by thomas
34:55
created

Params::getGenesisBlock()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 17
nc 1
nop 0
dl 0
loc 22
ccs 18
cts 18
cp 1
crap 1
rs 9.2
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BitWasp\Bitcoin\Chain;
6
7
use BitWasp\Bitcoin\Block\Block;
8
use BitWasp\Bitcoin\Block\BlockHeader;
9
use BitWasp\Bitcoin\Block\BlockHeaderInterface;
10
use BitWasp\Bitcoin\Block\BlockInterface;
11
use BitWasp\Bitcoin\Math\Math;
12
use BitWasp\Bitcoin\Script\Opcodes;
13
use BitWasp\Bitcoin\Script\ScriptFactory;
14
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
15
use BitWasp\Buffertools\Buffer;
16
17
class Params implements ParamsInterface
18
{
19
    /**
20
     * @var int
21
     */
22
    protected static $maxBlockSizeBytes = 1000000;
23
24
    /**
25
     * @var int
26
     */
27
    protected static $maxMoney = 21000000;
28
29
    /**
30
     * @var int
31
     */
32
    protected static $subsidyHalvingInterval = 210000;
33
34
    /**
35
     * @var int
36
     */
37
    protected static $coinbaseMaturityAge = 120;
38
39
    /**
40
     * @var int
41
     */
42
    protected static $p2shActivateTime = 1333238400;
43
44
    /**
45
     * = 14 * 24 * 60 * 60
46
     * @var int
47
     */
48
    protected static $powTargetTimespan = 1209600;
49
50
    /**
51
     * = 10 * 60
52
     * @var int
53
     */
54
    protected static $powTargetSpacing = 600;
55
56
    /**
57
     * @var int
58
     */
59
    protected static $powRetargetInterval = 2016;
60
61
    /**
62
     * @var string
63
     */
64
    protected static $powTargetLimit = '26959946667150639794667015087019630673637144422540572481103610249215';
65
66
    /**
67
     * Hex: 1d00ffff
68
     * @var int
69
     */
70
    protected static $powBitsLimit = 486604799;
71
72
    /**
73
     * @var int
74
     */
75
    protected static $majorityWindow = 1000;
76
77
    /**
78
     * @var int
79
     */
80
    protected static $majorityEnforceBlockUpgrade = 750;
81
82
83
    /**
84
     * @var Math
85
     */
86 5
    protected $math;
87
88 5
    /**
89 5
     * @param Math $math
90
     */
91
    public function __construct(Math $math)
92
    {
93
        $this->math = $math;
94 1
    }
95
96 1
    /**
97 1
     * @return BlockHeaderInterface
98 1
     */
99 1
    public function getGenesisBlockHeader(): BlockHeaderInterface
100 1
    {
101 1
        return new BlockHeader(
102 1
            1,
103
            Buffer::hex('00', 32),
104
            Buffer::hex('4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b', 32),
105
            1231006505,
106
            0x1d00ffff,
107
            2083236893
108
        );
109 1
    }
110
111 1
    /**
112 1
     * @return BlockInterface
113
     */
114 1
    public function getGenesisBlock(): BlockInterface
115 1
    {
116 1
        $timestamp = new Buffer('The Times 03/Jan/2009 Chancellor on brink of second bailout for banks', null, $this->math);
117 1
        $publicKey = Buffer::hex('04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f', null, $this->math);
118 1
119
        $inputScript = ScriptFactory::create()
120 1
            ->push(Buffer::int('486604799', 4, $this->math)->flip())
0 ignored issues
show
Bug introduced by
It seems like \BitWasp\Buffertools\Buf...4, $this->math)->flip() targeting BitWasp\Buffertools\Buffer::flip() can also be of type string; however, BitWasp\Bitcoin\Script\F...y\ScriptCreator::push() does only seem to accept object<BitWasp\Buffertools\BufferInterface>, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
121 1
            ->push(Buffer::int('4', 1, $this->math))
122 1
            ->push($timestamp)
123 1
            ->getScript();
124
125 1
        return new Block(
126 1
            $this->math,
127 1
            $this->getGenesisBlockHeader(),
128
            (new TxBuilder)
129 1
                ->version(1)
130 1
                ->input(new Buffer('', 32), 0xffffffff, $inputScript)
0 ignored issues
show
Documentation introduced by
$inputScript is of type object<BitWasp\Bitcoin\Script\ScriptInterface>, but the function expects a null|object<BitWasp\Bitcoin\Script\Script>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
131 1
                ->output(5000000000, ScriptFactory::sequence([$publicKey, Opcodes::OP_CHECKSIG]))
132 1
                ->locktime(0)
133 1
                ->get()
134 1
        );
135
    }
136
137
    /**
138
     * @return int
139
     */
140
    public function maxBlockSizeBytes(): int
141
    {
142 1
        return static::$maxBlockSizeBytes;
143
    }
144 1
145
    /**
146
     * @return int
147
     */
148
    public function subsidyHalvingInterval(): int
149
    {
150 1
        return static::$subsidyHalvingInterval;
151
    }
152 1
153
    /**
154
     * @return int
155
     */
156
    public function coinbaseMaturityAge(): int
157
    {
158 1
        return static::$coinbaseMaturityAge;
159
    }
160 1
161
    /**
162
     * @return int
163
     */
164
    public function maxMoney(): int
165
    {
166 1
        return static::$maxMoney;
167
    }
168 1
169
    /**
170
     * @return int
171
     */
172
    public function powTargetTimespan(): int
173
    {
174 1
        return static::$powTargetTimespan ;
175
    }
176 1
177
    /**
178
     * @return int
179
     */
180
    public function powTargetSpacing(): int
181
    {
182 1
        return static::$powTargetSpacing;
183
    }
184 1
185
    /**
186
     * @return int
187
     */
188
    public function powRetargetInterval(): int
189
    {
190 1
        return static::$powRetargetInterval;
191
    }
192 1
193
    /**
194
     * @return int|string
195
     */
196
    public function powTargetLimit(): string
197
    {
198 1
        return static::$powTargetLimit;
199
    }
200 1
201
    /**
202
     * @return int
203
     */
204
    public function powBitsLimit(): int
205
    {
206 190
        return static::$powBitsLimit;
207
    }
208 190
209
    /**
210
     * @return int
211
     */
212
    public function majorityEnforceBlockUpgrade(): int
213
    {
214 1
        return static::$majorityEnforceBlockUpgrade;
215
    }
216 1
217
    /**
218
     * @return int
219
     */
220
    public function majorityWindow(): int
221
    {
222 1
        return static::$majorityWindow;
223
    }
224 1
225
    /**
226
     * @return int
227
     */
228
    public function p2shActivateTime(): int
229
    {
230 1
        return static::$p2shActivateTime;
231
    }
232 1
233
    /**
234
     * @return int
235
     */
236
    public function getMaxBlockSigOps(): int
237
    {
238 1
        return $this->maxBlockSizeBytes() / 50;
239
    }
240 1
    
241
    /**
242
     * @return int
243
     */
244
    public function getMaxTxSigOps(): int
245
    {
246 1
        return $this->getMaxBlockSigOps() / 5;
247
    }
248
}
249