Completed
Push — master ( 4522cf...7c4307 )
by thomas
141:27 queued 138:12
created

ScriptFactory::create()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 3
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 3
eloc 2
nc 1
nop 3
crap 3
1
<?php
2
3
namespace BitWasp\Bitcoin\Script;
4
5
use BitWasp\Bitcoin\Bitcoin;
6
use BitWasp\Bitcoin\Crypto\EcAdapter\Adapter\EcAdapterInterface;
7
use BitWasp\Bitcoin\Flags;
8
use BitWasp\Bitcoin\Math\Math;
9
use BitWasp\Bitcoin\Script\Consensus\BitcoinConsensus;
10
use BitWasp\Bitcoin\Script\Consensus\NativeConsensus;
11
use BitWasp\Bitcoin\Script\Factory\InputScriptFactory;
12
use BitWasp\Bitcoin\Script\Factory\OutputScriptFactory;
13
use BitWasp\Bitcoin\Script\Factory\P2shScriptFactory;
14
use BitWasp\Bitcoin\Script\Factory\ScriptCreator;
15
use BitWasp\Bitcoin\Script\Factory\ScriptInfoFactory;
16
use BitWasp\Bitcoin\Script\Interpreter\InterpreterInterface;
17
use BitWasp\Buffertools\Buffer;
18
19
class ScriptFactory
20
{
21
    /**
22
     * @param Buffer|string $string
23
     * @return Script
24
     */
25 714
    public static function fromHex($string)
26
    {
27 714
        return self::create($string instanceof Buffer ? $string : Buffer::hex($string))->getScript();
28
    }
29
30
    /**
31
     * @param Buffer|null $buffer
32
     * @param Opcodes|null $opcodes
33
     * @param Math|null $math
34
     * @return ScriptCreator
35
     */
36 1125
    public static function create(Buffer $buffer = null, Opcodes $opcodes = null, Math $math = null)
37
    {
38 1125
        return new ScriptCreator($math ?: Bitcoin::getMath(), $opcodes ?: new Opcodes(), $buffer);
39
    }
40
41
    /**
42
     * @return InputScriptFactory
43
     */
44 93
    public static function scriptSig()
45
    {
46 93
        return new InputScriptFactory();
47
    }
48
49
    /**
50
     * @return OutputScriptFactory
51
     */
52 321
    public static function scriptPubKey()
53
    {
54 321
        return new OutputScriptFactory();
55
    }
56
57
    /**
58
     * @return P2shScriptFactory
59
     */
60
    public static function p2sh()
61
    {
62
        return new P2shScriptFactory(self::scriptPubKey());
63
    }
64
65
    /**
66
     * @param ScriptInterface $script
67
     * @param ScriptInterface|null $redeemScript
68
     * @return ScriptInfo\ScriptInfoInterface
69
     */
70 135
    public static function info(ScriptInterface $script, ScriptInterface $redeemScript = null)
71
    {
72 135
        return (new ScriptInfoFactory())->load($script, $redeemScript);
73
    }
74
75
76
    /**
77
     * @return Flags
78
     */
79 24
    public static function defaultFlags()
80
    {
81 24
        return new Flags(
82 24
            InterpreterInterface::VERIFY_P2SH | InterpreterInterface::VERIFY_STRICTENC | InterpreterInterface::VERIFY_DERSIG |
83 24
            InterpreterInterface::VERIFY_LOW_S | InterpreterInterface::VERIFY_NULL_DUMMY | InterpreterInterface::VERIFY_SIGPUSHONLY |
84 24
            InterpreterInterface::VERIFY_DISCOURAGE_UPGRADABLE_NOPS | InterpreterInterface::VERIFY_CLEAN_STACK |
85 24
            InterpreterInterface::VERIFY_CHECKLOCKTIMEVERIFY | InterpreterInterface::VERIFY_CHECKSEQUENCEVERIFY
86 24
        );
87
    }
88
89
    /**
90
     * @param Flags|null $flags
91
     * @param EcAdapterInterface|null $ecAdapter
92
     * @return NativeConsensus
93
     */
94 12
    public static function getNativeConsensus(Flags $flags = null, EcAdapterInterface $ecAdapter = null)
95
    {
96 12
        return new NativeConsensus($ecAdapter ?: Bitcoin::getEcAdapter(), $flags ?: self::defaultFlags());
97
    }
98
99
    /**
100
     * @param Flags|null $flags
101
     * @return BitcoinConsensus
102
     */
103
    public static function getBitcoinConsensus(Flags $flags = null)
104
    {
105
        return new BitcoinConsensus($flags ?: self::defaultFlags());
106
    }
107
108
    /**
109
     * @param Flags|null $flags
110
     * @param EcAdapterInterface|null $ecAdapter
111
     * @return \BitWasp\Bitcoin\Script\Consensus\ConsensusInterface
112
     */
113 6
    public static function consensus(Flags $flags = null, EcAdapterInterface $ecAdapter = null)
114
    {
115 6
        if (extension_loaded('bitcoinconsensus')) {
116
            return self::getBitcoinConsensus($flags);
117
        } else {
118 6
            return self::getNativeConsensus($flags, $ecAdapter);
119
        }
120
    }
121
}
122