GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 049db5...1029b6 )
by Roderik
05:54 queued 03:06
created

MultichainClient::getNewAddress()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace be\kunstmaan\multichain;
4
5
use JsonRPC\Client as JsonRPCClient;
6
7
/**
8
 * Class MultichainClient
9
 *
10
 * @package be\kunstmaan\multichain
11
 * @link http://www.multichain.com/developers/json-rpc-api/
12
 */
13
class MultichainClient
14
{
15
16
    /**
17
     * The JsonRPC client used to call the multichain api
18
     *
19
     * @var \JsonRPC\Client
20
     */
21
    private $jsonRPCClient;
22
23
    /**
24
     * Default HTTP headers to send to the server
25
     *
26
     * @var array
27
     */
28
    private $headers = array(
29
        'User-Agent: Unofficial Multichain PHP Client <https://github.com/kunstmaan/libphp-multichain>',
30
    );
31
32
    /**
33
     * Enable debug output to the php error log
34
     *
35
     * @var boolean
36
     */
37
    private $debug = false;
38
39
    /**
40
     * Constructor
41
     *
42
     * @param  string $url Multichain JSON RPC url + port
43
     * @param  string $username Multichain JSON RPC username
44
     * @param  string $password Multichain JSON RPC password
45
     * @param  integer $timeout HTTP timeout
46
     */
47
    public function __construct($url, $username, $password, $timeout = 3)
48
    {
49
        $this->jsonRPCClient = new JsonRPCClient($url, $timeout, $this->headers);
50
        $this->jsonRPCClient->authentication($username, $password);
51
    }
52
53
    /**
54
     * @param boolean $debug
55
     * @return MultichainClient
56
     */
57
    public function setDebug($debug)
58
    {
59
        $this->debug = $debug;
60
        $this->jsonRPCClient->debug = $debug;
61
        return $this;
62
    }
63
64
    /**
65
     * Returns general information about this node and blockchain. MultiChain adds some fields to Bitcoin Core’s
66
     * response, giving the blockchain’s chainname, description, protocol, peer-to-peer port. The setupblocks field
67
     * gives the length in blocks of the setup phase in which some consensus constraints are not applied. The
68
     * nodeaddress can be passed to other nodes for connecting.
69
     *
70
     * @return mixed
71
     */
72
    public function getInfo()
73
    {
74
        return $this->jsonRPCClient->execute("getinfo");
75
    }
76
77
    /**
78
     * Returns information about the other nodes to which this node is connected. If this is a MultiChain blockchain,
79
     * includes handshake and handshakelocal fields showing the remote and local address used during the handshaking
80
     * for that connection.
81
     *
82
     * @return mixed
83
     */
84
    public function getPeerInfo()
85
    {
86
        return $this->jsonRPCClient->execute("getpeerinfo");
87
    }
88
89
    /**
90
     * Returns a new address for receiving payments. Omit the account parameter for the default account – see note below
91
     *
92
     * NOTE:
93
     * Bitcoin Core has a notion of “accounts”, whereby each address can belong to specific account, which is credited
94
     * when bitcoin is sent to that address. However the separation of accounts is not preserved when bitcoin is sent
95
     * out, because the internal accounting mechanism has no relationship to the bitcoin protocol itself. Because of
96
     * all the confusion this has caused, Bitcoin Core’s accounts mechanism is to be deprecated in future.
97
     *
98
     * MultiChain preserves the accounts mechanism and parameters for full backwards compatibility with the Bitcoin
99
     * Core API. However, because of its forthcoming deprecation, the mechanism is not applied to native asset
100
     * balances, all of which are considered as belonging to a single global account. Therefore we recommend not using
101
     * accounts at all with MultiChain, and using "" for any account parameter in the API.
102
     *
103
     * To support multiple users in a single MultiChain node’s wallet, call getnewaddress to get a different address
104
     * for each user. You should then use MultiChain’s *from* APIs, such as sendassetfrom and sendfromaddress, to
105
     * control whose funds are spent in each transaction. Unlike bitcoin-style accounts, this method maps directly to
106
     * the blockchain protocol.
107
     *
108
     * @param string $account
109
     * @return mixed
110
     */
111
    public function getNewAddress($account = '')
112
    {
113
        return $this->jsonRPCClient->execute("getnewaddress", array($account));
114
    }
115
116
    /**
117
     * Sends one or more assets to address, returning the txid. In Bitcoin Core, the amount field is the quantity of
118
     * the bitcoin currency. For MultiChain, an {"asset":qty, ...} object can be used for amount, in which each asset
119
     * is an asset name, ref or issuance txid, and each qty is the quantity of that asset to send (see native assets).
120
     * Use "" as the asset inside this object to specify a quantity of the native blockchain currency. See also
121
     * sendassettoaddress for sending a single asset and sendfromaddress to control the address whose funds are used.
122
     *
123
     * @param string $address
124
     * @param string $amount
125
     * @param string $comment
126
     * @param string $commentTo
127
     * @return mixed
128
     */
129
    public function sendToAddress($address, $amount, $comment = '', $commentTo = '')
130
    {
131
        return $this->jsonRPCClient->execute("sendtoaddress", array($address, $amount, $comment, $commentTo));
132
    }
133
134
    /**
135
     * Outputs a list of available API commands, including MultiChain-specific commands.
136
     *
137
     * @return mixed
138
     */
139
    public function help()
140
    {
141
        return $this->jsonRPCClient->execute("help");
142
    }
143
144
    /**
145
     * Adds to the atomic exchange transaction in hexstring given by a previous call to createrawexchange or
146
     * appendrawexchange. This adds an offer to exchange the asset/s in output vout of transaction txid for qty units
147
     * of asset, where asset is an asset name, ref or issuance txid. The txid and vout should generally be taken from
148
     * the response to preparelockunspent or preparelockunspentfrom. Multiple items can be specified within the fourth
149
     * parameter to request multiple assets. Returns a raw hexadecimal transaction in the hex field alongside a
150
     * complete field stating whether the exchange is complete (i.e. balanced) or not. If complete, the transaction can
151
     * be transmitted to the network using sendrawtransaction. If not, it can be passed to a further counterparty, who
152
     * can call decoderawexchange and appendrawexchange as appropriate.
153
     *
154
     * @param $hexString
155
     * @param $txId
156
     * @param $vOut
157
     * @param $extra ({"asset":qty, ...})
158
     * @return mixed
159
     */
160
    public function appendRawExchange($hexString, $txId, $vOut, $extra)
161
    {
162
        return $this->jsonRPCClient->execute("appendrawexchange", array($hexString, $txId, $vOut, $extra));
163
    }
164
165
    /**
166
     * Adds a metadata output to the raw transaction in tx-hex given by a previous call to createrawtransaction. The
167
     * metadata is specified in data-hex in hexadecimal form and added in a new OP_RETURN transaction output. The
168
     * transaction can then be signed and transmitted to the network using signrawtransaction and sendrawtransaction.
169
     *
170
     * @param $txHex
171
     * @param $dataHex
172
     * @return mixed
173
     */
174
    public function appendRawMetadata($txHex, $dataHex)
175
    {
176
        return $this->jsonRPCClient->execute("appendrawmetadata", array($txHex, $dataHex));
177
    }
178
179
    /**
180
     * Sends transactions to combine large groups of unspent outputs (UTXOs) belonging to the same address into a
181
     * single unspent output, returning a list of txids. This can improve wallet performance, especially for miners in
182
     * a chain with short block times and non-zero block rewards. Set addresses to a comma-separated list of addresses
183
     * to combine outputs for, or * for all addresses in the wallet. Only combine outputs with at least minconf
184
     * confirmations, and use between mininputs and maxinputs per transaction. A single call to combineunspent can
185
     * create up to maxcombines transactions over up to maxtime seconds. See also the autocombine runtime parameters.
186
     *
187
     * @param string $addresses
188
     * @param int $minConf
189
     * @param int $maxCombines
190
     * @param int $minInputs
191
     * @param int $maxInputs
192
     * @param int $maxTime
193
     * @return mixed
194
     */
195
    public function combineUnspent($addresses = "*", $minConf = 1, $maxCombines = 1, $minInputs = 10, $maxInputs = 100, $maxTime = 30)
196
    {
197
        return $this->jsonRPCClient->execute("combineunspent", array($addresses, $minConf, $maxCombines, $minInputs, $maxInputs, $maxTime));
198
    }
199
200
    /**
201
     * Creates a new atomic exchange transaction which offers to exchange the asset/s in output vout of transaction
202
     * txid for qty units of asset, where asset is an asset name, ref or issuance txid. The txid and vout should
203
     * generally be taken from the response to preparelockunspent or preparelockunspentfrom. Multiple items can be
204
     * specified within the third parameter to request multiple assets. Returns a raw partial transaction in
205
     * hexadecimal which can be passed to the counterparty, who can call decoderawexchange and appendrawexchange as
206
     * appropriate.
207
     *
208
     * @param $txId
209
     * @param $vOut
210
     * @param $extra
211
     * @return mixed
212
     */
213
    public function createRawExchange($txId, $vOut, $extra)
214
    {
215
        return $this->jsonRPCClient->execute("createrawexchange", array($txId, $vOut, $extra));
216
    }
217
218
    /**
219
     * Decodes the raw exchange transaction in hexstring, given by a previous call to createrawexchange or
220
     * appendrawexchange. Returns details on the offer represented by the exchange and its present state. The offer
221
     * field in the response lists the quantity of native currency and/or assets which are being offered for exchange.
222
     * The ask field lists the native currency and/or assets which are being asked for. The candisable field specifies
223
     * whether this wallet can disable the exchange transaction by double-spending against one of its inputs. The
224
     * cancomplete field specifies whether this wallet has the assets required to complete the exchange. The complete
225
     * field specifies whether the exchange is already complete (i.e. balanced) and ready for sending. If verbose is
226
     * true then all of the individual stages in the exchange are listed. Other fields relating to fees are only
227
     * relevant for blockchains which use a native currency.
228
     *
229
     * @param $hexString
230
     * @param bool $verbose
231
     * @return mixed
232
     */
233
    public function decodeRawExchange($hexString, $verbose = false)
234
    {
235
        return $this->jsonRPCClient->execute("decoderawexchange", array($hexString, $verbose));
236
    }
237
238
    /**
239
     * Sends a transaction to disable the offer of exchange in hexstring, returning the txid. This is achieved by
240
     * spending one of the exchange transaction’s inputs and sending it back to the wallet. To check whether this can
241
     * be used on an exchange transaction, check the candisable field of the output of decoderawexchange.
242
     *
243
     * @param $hexString
244
     * @return mixed
245
     */
246
    public function disableRawTransaction($hexString)
247
    {
248
        return $this->jsonRPCClient->execute("disablerawtransaction", array($hexString));
249
    }
250
251
    /**
252
     * Returns a list of all the asset balances for address in this node’s wallet, with at least minconf confirmations.
253
     * Use includeLocked to include unspent outputs which have been locked, e.g. by a call to preparelockunspent.
254
     *
255
     * @param $address
256
     * @param int $minConf
257
     * @param bool $includeLocked
258
     * @return mixed
259
     */
260
    public function getAddressBalances($address, $minConf = 1, $includeLocked = false)
261
    {
262
        return $this->jsonRPCClient->execute("getaddressbalances", array($address, $minConf, $includeLocked));
263
    }
264
265
    /**
266
     * Returns a list of addresses in this node’s wallet. Set verbose to true to get more information about each
267
     * address, formatted like the output of the validateaddress command.
268
     *
269
     * @param bool $verbose
270
     * @return mixed
271
     */
272
    public function getAddresses($verbose = false)
273
    {
274
        return $this->jsonRPCClient->execute("getaddresses", array($verbose));
275
    }
276
277
    /**
278
     * Provides information about transaction txid related to address in this node’s wallet, including how it affected
279
     * that address’s balance. Use verbose to provide details of transaction inputs and outputs.
280
     *
281
     * @param $address
282
     * @param $txId
283
     * @param bool $verbose
284
     * @return mixed
285
     */
286
    public function getAddressTransaction($address, $txId, $verbose = false)
287
    {
288
        return $this->jsonRPCClient->execute("getaddresstransaction", array($address, $txId, $verbose));
289
    }
290
291
    /**
292
     * Returns a list of all the asset balances for account in this node’s wallet, with at least minconf confirmations.
293
     * Omit the account parameter or use "" for the default account – see note about accounts. Use includeWatchOnly to
294
     * include the balance of watch-only addresses and includeLocked to include unspent outputs which have been locked,
295
     * e.g. by a call to preparelockunspent.
296
     *
297
     * @param string $account
298
     * @param int $minConf
299
     * @param bool $includeWatchOnly
300
     * @param bool $includeLocked
301
     * @return mixed
302
     */
303
    public function getAssetBalances($account = "", $minConf = 1, $includeWatchOnly = false, $includeLocked = false)
304
    {
305
        return $this->jsonRPCClient->execute("getassetbalances", array($account, $minConf, $includeWatchOnly, $includeLocked));
306
    }
307
308
    /**
309
     * Returns a list of all the asset balances in this node’s wallet, with at least minconf confirmations. Use
310
     * includeWatchOnly to include the balance of watch-only addresses and includeLocked to include unspent outputs
311
     * which have been locked, e.g. by a call to preparelockunspent.
312
     *
313
     * @param int $minConf
314
     * @param bool $includeWatchOnly
315
     * @param bool $includeLocked
316
     * @return mixed
317
     */
318
    public function getTotalBalances($minConf = 1, $includeWatchOnly = false, $includeLocked = false)
319
    {
320
        return $this->jsonRPCClient->execute("getassetbalances", array($minConf, $includeWatchOnly, $includeLocked));
321
    }
322
323
    /**
324
     * Returns information about address including a check for its validity.
325
     *
326
     * @param $address
327
     * @return mixed
328
     */
329
    public function validateAddress($address)
330
    {
331
        return $this->jsonRPCClient->execute("validateaddress", array($address));
332
    }
333
334
    /**
335
     * Provides information about transaction txid in this node’s wallet, including how it affected the node’s total
336
     * balance. Use includeWatchOnly to consider watch-only addresses as if they belong to this wallet and verbose to
337
     * provide details of transaction inputs and outputs.
338
     *
339
     * @param $txId
340
     * @param bool $includeWatchOnly
341
     * @param bool $verbose
342
     * @return mixed
343
     */
344
    public function getWalletTransaction($txId, $includeWatchOnly = false, $verbose = false)
345
    {
346
        return $this->jsonRPCClient->execute("getwallettransaction", array($txId, $includeWatchOnly, $verbose));
347
    }
348
349
    /**
350
     * Grants permissions to addresses, where addresses is a comma-separated list of addresses and permissions is one
351
     * of connect, send, receive, issue, mine, admin, or a comma-separated list thereof. If the chain uses a native
352
     * currency, you can send some to each recipient using the native-amount parameter. Returns the txid of the
353
     * transaction granting the permissions. For more information, see permissions management.
354
     *
355
     * @param $addresses
356
     * @param $permissions
357
     * @param int $nativeAmount
358
     * @param string $comment
359
     * @param string $commentTo
360
     * @param int $startBlock
361
     * @param null $endBlock
362
     * @return mixed
363
     */
364
    public function grant($addresses, $permissions, $nativeAmount = 0, $comment = '', $commentTo = '', $startBlock = 0, $endBlock = null)
365
    {
366
        return $this->jsonRPCClient->execute("grant", array($addresses, $permissions, $nativeAmount, $comment, $commentTo, $startBlock, $endBlock));
367
    }
368
369
    /**
370
     * This works like grant, but with control over the from-address used to grant the permissions. If there are
371
     * multiple addresses with administrator permissions on one node, this allows control over which address is used.
372
     *
373
     * @param $fromAddress
374
     * @param $toAddresses
375
     * @param $permissions
376
     * @param int $nativeAmount
377
     * @param string $comment
378
     * @param string $commentTo
379
     * @param int $startBlock
380
     * @param null $endBlock
381
     * @return mixed
382
     */
383
    public function grantFrom($fromAddress, $toAddresses, $permissions, $nativeAmount = 0, $comment = '', $commentTo = '', $startBlock = 0, $endBlock = null)
384
    {
385
        return $this->jsonRPCClient->execute("grantfrom", array($fromAddress, $toAddresses, $permissions, $nativeAmount, $comment, $commentTo, $startBlock, $endBlock));
386
    }
387
388
    /**
389
     * Creates a new asset name on the blockchain, sending the initial qty units to address. The smallest transactable
390
     * unit is given by units, e.g. 0.01. If the chain uses a native currency, you can send some with the new asset
391
     * using the native-amount parameter.
392
     *
393
     * @param $address
394
     * @param $name
395
     * @param $qty
396
     * @param int $units
397
     * @param int $nativeAmount
398
     * @param null $custom
399
     * @return mixed
400
     */
401
    public function issue($address, $name, $qty, $units = 1, $nativeAmount = 0, $custom = null)
402
    {
403
        $params = array($address, $name, $qty, $units, $nativeAmount);
404
        if (!is_null($custom)) {
405
            $params[] = $custom;
406
        }
407
        return $this->jsonRPCClient->execute("issue", $params);
408
    }
409
410
    /**
411
     * This works like issue, but with control over the from-address used to issue the asset. If there are multiple
412
     * addresses with asset issuing permissions on one node, this allows control over which address is used.
413
     *
414
     * @param $fromAddress
415
     * @param $toAddress
416
     * @param $name
417
     * @param $qty
418
     * @param int $units
419
     * @param int $nativeAmount
420
     * @param null $custom
421
     * @return mixed
422
     */
423
    public function issueFrom($fromAddress, $toAddress, $name, $qty, $units = 1, $nativeAmount = 0, $custom = null)
424
    {
425
        return $this->jsonRPCClient->execute("issuefrom", array($fromAddress, $toAddress, $name, $qty, $units, $nativeAmount, $custom));
426
    }
427
428
    /**
429
     * Lists information about the count most recent transactions related to address in this node’s wallet, including
430
     * how they affected that address’s balance. Use skip to go back further in history and verbose to provide details
431
     * of transaction inputs and outputs.
432
     *
433
     * @param $address
434
     * @param int $count
435
     * @param int $skip
436
     * @param bool $verbose
437
     * @return mixed
438
     */
439
    public function listAddressTransactions($address, $count = 10, $skip = 0, $verbose = false)
440
    {
441
        return $this->jsonRPCClient->execute("listaddresstransactions", array($address, $count, $skip, $verbose));
442
    }
443
444
    /**
445
     * Returns information about all assets issued on the blockchain. If an issuance txid
446
     * (see native assets) is provided in asset, then information is only returned about that one asset.
447
     *
448
     * @param null $asset
449
     * @return mixed
450
     */
451
    public function listAssets($asset = null)
452
    {
453
        return $this->jsonRPCClient->execute("listassets", array($asset));
454
    }
455
456
    /**
457
     * Returns a list of all permissions currently granted to addresses. To list information about specific permissions
458
     * only, set permissions to one of connect, send, receive, issue, mine, admin, or a comma-separated list thereof.
459
     * Omit or pass all to list all permissions. Provide a comma-delimited list in addresses to list the permissions
460
     * for particular addresses only or * for all addresses. If verbose is true, the admins output field lists the
461
     * administrator/s who assigned the corresponding permission, and the pending field lists permission changes which
462
     * are waiting to reach consensus.
463
     *
464
     * @param string $permissions
465
     * @param string $addresses
466
     * @param bool $verbose
467
     * @return mixed
468
     */
469
    public function listPermissions($permissions = "all", $addresses = "*", $verbose = false)
470
    {
471
        return $this->jsonRPCClient->execute("listpermissions", array($permissions, $addresses, $verbose));
472
    }
473
474
    /**
475
     * Lists information about the count most recent transactions in this node’s wallet, including how they affected
476
     * the node’s total balance. Use skip to go back further in history and includeWatchOnly to consider watch-only
477
     * addresses as if they belong to this wallet. Use verbose to provide the details of transaction inputs and outputs.
478
     * Note that unlike Bitcoin Core’s listtransactions command, the response contains one element per transaction,
479
     * rather than one per transaction output.
480
     *
481
     * @param int $count
482
     * @param int $skip
483
     * @param bool $includeWatchOnly
484
     * @param bool $verbose
485
     * @return mixed
486
     */
487
    public function listWalletTransactions($count = 10, $skip = 0, $includeWatchOnly = false, $verbose = false)
488
    {
489
        return $this->jsonRPCClient->execute("listwallettransactions", array($count, $skip, $includeWatchOnly, $verbose));
490
    }
491
492
    /**
493
     * Prepares an unspent transaction output (useful for building atomic exchange transactions) containing qty units
494
     * of asset, where asset is an asset name, ref or issuance txid. Multiple items can be specified within the first
495
     * parameter to include several assets within the output. The output will be locked against automatic selection for
496
     * spending unless the optional lock parameter is set to false. Returns the txid and vout of the prepared output.
497
     *
498
     * @param $assetsToLock
499
     * @param bool $lock
500
     * @return mixed
501
     */
502
    public function prepareLockUnspent($assetsToLock, $lock = true)
503
    {
504
        return $this->jsonRPCClient->execute("preparelockunspent", array($assetsToLock, $lock));
505
    }
506
507
    /**
508
     * This works like preparelockunspent, but with control over the from-address whose funds are used to prepare the
509
     * unspent transaction output. Any change from the transaction is send back to from-address.
510
     *
511
     * @param $fromAddress
512
     * @param $assetsToLock
513
     * @param bool $lock
514
     * @return mixed
515
     */
516
    public function prepareLockUnspentFrom($fromAddress, $assetsToLock, $lock = true)
517
    {
518
        return $this->jsonRPCClient->execute("preparelockunspentfrom", array($fromAddress, $assetsToLock, $lock));
519
    }
520
521
    /**
522
     * Revokes permissions from addresses, where addresses is a comma-separated list of addresses and permissions is
523
     * one of connect, send, receive, issue, mine, admin, or a comma-separated list thereof. Equivalent to calling
524
     * grant with start-block=0 and end-block=0. Returns the txid of transaction revoking the permissions. For more
525
     * information, see permissions management.
526
     *
527
     * @param $addresses
528
     * @param $permissions
529
     * @param int $nativeAmount
530
     * @param string $comment
531
     * @param string $commentTo
532
     * @return mixed
533
     */
534
    public function revoke($addresses, $permissions, $nativeAmount = 0, $comment = '', $commentTo = '')
535
    {
536
        return $this->jsonRPCClient->execute("revoke", array($addresses, $permissions, $nativeAmount, $comment, $commentTo));
537
    }
538
539
    /**
540
     * This works like revoke, but with control over the from-address used to revoke the permissions. If there are
541
     * multiple addresses with administrator permissions on one node, this allows control over which address is used.
542
     *
543
     * @param $fromAddress
544
     * @param $toAddresses
545
     * @param $permissions
546
     * @param int $nativeAmount
547
     * @param string $comment
548
     * @param string $commentTo
549
     * @return mixed
550
     */
551
    public function revokeFrom($fromAddress, $toAddresses, $permissions, $nativeAmount = 0, $comment = '', $commentTo = '')
552
    {
553
        return $this->jsonRPCClient->execute("revokefrom", array($fromAddress, $toAddresses, $permissions, $nativeAmount, $comment, $commentTo));
554
    }
555
556
    /**
557
     * This works like sendassettoaddress, but with control over the from-address whose funds are used. Any change from
558
     * the transaction is sent back to from-address. See also sendfromaddress for sending multiple assets in one
559
     * transaction.
560
     *
561
     * @param $fromAddress
562
     * @param $toAddress
563
     * @param $asset
564
     * @param $qty
565
     * @param null $nativeAmount
566
     * @param string $comment
567
     * @param string $commentTo
568
     * @return mixed
569
     */
570
    public function sendAssetFrom($fromAddress, $toAddress, $asset, $qty, $nativeAmount = null, $comment = '', $commentTo = '')
571
    {
572
        $nativeAmount = $this->findDefaultMinimumPerOutput($nativeAmount);
573
        return $this->jsonRPCClient->execute("sendassetfrom", array($fromAddress, $toAddress, $asset, $qty, $nativeAmount, $comment, $commentTo));
574
    }
575
576
    /**
577
     * Returns a list of all the parameters of this blockchain, reflecting the content of its params.dat file.
578
     *
579
     * @return mixed
580
     */
581
    public function getBlockchainParams()
582
    {
583
        return $this->jsonRPCClient->execute("getblockchainparams");
584
    }
585
586
    /**
587
     * Sends qty of asset to address, returning the txid. The asset can be specified using its name, ref or issuance
588
     * txid – see native assets for more information. See also sendassetfrom to control the address whose funds are
589
     * used, sendtoaddress for sending multiple assets in one transaction, and sendfromaddress to combine both of these.
590
     *
591
     * @param $address
592
     * @param $asset
593
     * @param $qty
594
     * @param null $nativeAmount
595
     * @param string $comment
596
     * @param string $commentTo
597
     * @return mixed
598
     */
599
    public function sendAssetToAddress($address, $asset, $qty, $nativeAmount = null, $comment = '', $commentTo = '')
600
    {
601
        $nativeAmount = $this->findDefaultMinimumPerOutput($nativeAmount);
602
        return $this->jsonRPCClient->execute("sendassettoaddress", array($address, $asset, $qty, $nativeAmount, $comment, $commentTo));
603
    }
604
605
    /**
606
     * This works like sendtoaddress, but with control over the from-address whose funds are used. Any
607
     * change from the transaction is sent back to from-address.
608
     *
609
     * @param $fromAddress
610
     * @param $toAddress
611
     * @param $amount
612
     * @param string $comment
613
     * @param string $commentTo
614
     * @return mixed
615
     */
616
    public function sendFromAddress($fromAddress, $toAddress, $amount, $comment = '', $commentTo = '')
617
    {
618
        return $this->jsonRPCClient->execute("sendfromaddress", array($fromAddress, $toAddress, $amount, $comment, $commentTo));
619
    }
620
621
    /**
622
     * This works like sendtoaddress (listed above), but includes the data-hex hexadecimal metadata in an additional
623
     * OP_RETURN transaction output.
624
     *
625
     * @param $address
626
     * @param $amount
627
     * @param $dataHex
628
     * @return mixed
629
     */
630
    public function sendWithMetadata($address, $amount, $dataHex)
631
    {
632
        return $this->jsonRPCClient->execute("sendwithmetadata", array($address, $amount, $dataHex));
633
    }
634
635
    /**
636
     * This works like sendtoaddress (listed above), but with control over the from-address whose funds are used, and
637
     * with the data-hex hexadecimal metadata added in an additional OP_RETURN transaction output. Any change from the
638
     * transaction is sent back to from-address.
639
     *
640
     * @param $fromAddress
641
     * @param $toAddress
642
     * @param $amount
643
     * @param $dataHex
644
     * @return mixed
645
     */
646
    public function sendWithMetadataFrom($fromAddress, $toAddress, $amount, $dataHex)
647
    {
648
        return $this->jsonRPCClient->execute("sendwithmetadatafrom", array($fromAddress, $toAddress, $amount, $dataHex));
649
    }
650
651
    /**
652
     * Creates a transaction spending the specified inputs, sending to the given addresses. In Bitcoin Core, each
653
     * amount field is a quantity of the bitcoin currency. For MultiChain, an {"asset":qty, ...} object can be used for
654
     * amount, in which each asset is an asset name, ref or issuance txid, and each qty is the quantity of that asset
655
     * to send (see native assets). Use "" as the asset inside this object to specify a quantity of the native
656
     * blockchain currency.
657
     *
658
     * @param $inputs
659
     * @param $addresses
660
     * @return mixed
661
     */
662
    public function createRawTransaction($inputs, $addresses)
663
    {
664
        return $this->jsonRPCClient->execute("createrawtransaction", array($inputs, $addresses));
665
    }
666
667
    /**
668
     * Returns a JSON object describing the serialized transaction in hexstring. For a MultiChain blockchain, each
669
     * transaction output includes assets and permissions fields listing any assets or permission changes encoded
670
     * within that output. There will also be a data field listing the content of any OP_RETURN outputs in the
671
     * transaction.
672
     *
673
     * @param $hexString
674
     * @return mixed
675
     */
676
    public function decodeRawTransaction($hexString)
677
    {
678
        return $this->jsonRPCClient->execute("decoderawtransaction", array($hexString));
679
    }
680
681
    /**
682
     * Returns information about the block with hash. If this is a MultiChain blockchain and format is true or omitted,
683
     * then the output includes a field miner showing the address of the miner of the block.
684
     *
685
     * @param $hash
686
     * @param bool $format
687
     * @return mixed
688
     */
689
    public function getBlock($hash, $format = true)
690
    {
691
        return $this->jsonRPCClient->execute("getblock", array($hash, $format));
692
    }
693
694
    /**
695
     * If verbose is 1, returns a JSON object describing transaction txid. For a MultiChain blockchain, each transaction
696
     * output includes assets and permissions fields listing any assets or permission changes encoded within that
697
     * output. There will also be a data field listing the content of any OP_RETURN outputs in the transaction.
698
     *
699
     * @param $txId
700
     * @param int $verbose
701
     * @return mixed
702
     */
703
    public function getRawTransaction($txId, $verbose = 0)
704
    {
705
        return $this->jsonRPCClient->execute("getrawtransaction", array($txId, $verbose));
706
    }
707
708
    /**
709
     * Returns details about an unspent transaction output vout of txid. For a MultiChain blockchain, includes assets
710
     * and permissions fields listing any assets or permission changes encoded within the output. Set confirmed to true
711
     * to include unconfirmed transaction outputs.
712
     *
713
     * @param $txId
714
     * @param $vOut
715
     * @param bool $unconfirmed
716
     * @return mixed
717
     */
718
    public function getTxOut($txId, $vOut, $unconfirmed = false)
719
    {
720
        return $this->jsonRPCClient->execute("gettxout", array($txId, $vOut, $unconfirmed));
721
    }
722
723
    /**
724
     * Returns a list of unspent transaction outputs in the wallet, with between minconf and maxconf confirmations. For
725
     * a MultiChain blockchain, each transaction output includes assets and permissions fields listing any assets or
726
     * permission changes encoded within that output. If addresses is provided, only outputs which pay an address in
727
     * this array will be included.
728
     *
729
     * @param int $minConf
730
     * @param int $maxConf
731
     * @param null $addresses
732
     * @return mixed
733
     */
734
    public function listUnspent($minConf = 1, $maxConf = 999999, $addresses = null)
735
    {
736
        return $this->jsonRPCClient->execute("listunspent", array($minConf, $maxConf, $addresses));
737
    }
738
739
    /**
740
     * @param $nativeAmount
741
     * @return mixed
742
     */
743
    private function findDefaultMinimumPerOutput($nativeAmount)
744
    {
745
        if (is_null($nativeAmount)) {
746
            $blockchainParams = $this->getBlockchainParams();
747
            $nativeAmount = $blockchainParams["minimum-per-output"];
748
            return $nativeAmount;
749
        }
750
        return $nativeAmount;
751
    }
752
753
    /**
754
     * Submits raw transaction (serialized, hex-encoded) to local node and network.
755
     * Returns the transaction hash in hex
756
     *
757
     * @param $hex
758
     * @param bool $allowHighFees
759
     * @return mixed
760
     */
761
    public function sendRawTransaction($hex, $allowHighFees = false)
762
    {
763
        return $this->jsonRPCClient->execute("sendrawtransaction", array($hex, $allowHighFees));
764
    }
765
}
766