You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.9 KiB
151 lines
4.9 KiB
<?php
|
|
|
|
|
|
namespace App\Services\CoinService;
|
|
|
|
|
|
use App\Services\CoinService\Interfaces\CoinServiceInterface;
|
|
use App\Services\CoinService\Libs\BitcoinClient;
|
|
use GuzzleHttp\Client;
|
|
|
|
class BitCoinService implements CoinServiceInterface
|
|
{
|
|
private $bitcoinClient;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->walletPassword = env('BITCORE_PASSWORD');
|
|
$this->bitcoinClient = new BitcoinClient(env('BITCORE_USERNAME'), env('BITCORE_UPASSWORD'), env('BITCORE_HOST'), env('BITCORE_PORT'));
|
|
}
|
|
|
|
public function collection($from, $to, $amount)
|
|
{
|
|
if (($result = $this->bitcoinClient->sendtoaddress($to, $amount, 'collection', $from, true)))
|
|
return $result;
|
|
return false;
|
|
}
|
|
|
|
/*获取钱包信息*/
|
|
public function getWalletInfo()
|
|
{
|
|
if ($result = $this->bitcoinClient->getwalletinfo()) return $result;
|
|
return false;
|
|
}
|
|
|
|
/*设置交易费率
|
|
即每1000kb所需的手续费*/
|
|
public function setTXFee($fee)
|
|
{
|
|
if ($this->bitcoinClient->settxfee($fee)) return true;
|
|
return false;
|
|
}
|
|
|
|
/*交易费率估计
|
|
参数:需要网络确认的节点数
|
|
返回费率的估算值*/
|
|
public function getEstimateFee(int $blocks)
|
|
{
|
|
if ($result = $this->bitcoinClient->estimatesmartfee($blocks)) return custom_number_format($result['feerate'], 8);
|
|
return 0;
|
|
}
|
|
|
|
/*返回具有帐户名称作为键,帐户余额作为值的数组*/
|
|
public function listAccounts()
|
|
{
|
|
if ($result = $this->bitcoinClient->listaccounts()) return $result;
|
|
return 0;
|
|
}
|
|
|
|
/*返回账户的余额
|
|
如果未指定[account],则返回服务器的总可用余额。
|
|
如果指定了[account],则返回指定帐户中的余额*/
|
|
// public function getBalance($account = null)
|
|
// {
|
|
// return $this->bitcoinClient->getbalance($account);
|
|
// }
|
|
public function getBalance($address = null)
|
|
{
|
|
if (blank($address)) {
|
|
// $list = $this->bitcoinClient->listunspent(6,9999999);
|
|
// return custom_number_format(array_sum(array_column($list,'amount')),8);
|
|
$balance = $this->bitcoinClient->getbalance();
|
|
return custom_number_format($balance, 8);
|
|
} else {
|
|
$list = $this->bitcoinClient->listunspent(6, 9999999, [$address]);
|
|
// dd($list);
|
|
return custom_number_format(array_sum(array_column($list, 'amount')), 8);
|
|
}
|
|
}
|
|
|
|
public function getBTCBalance($address)
|
|
{
|
|
$url = "https://blockchain.info/balance?active=" . $address;
|
|
$rsp = (new Client())->get($url);
|
|
if (isset(\GuzzleHttp\json_decode($rsp->getBody())->error)) return 0;
|
|
$data = \GuzzleHttp\json_decode($rsp->getBody());
|
|
$balance = get_object_vars($data->$address)['final_balance'];
|
|
return $balance / pow(10, 8);
|
|
}
|
|
|
|
public function newAccount()
|
|
{
|
|
if ($result = $this->bitcoinClient->getnewaddress()) return $result;
|
|
return null;
|
|
}
|
|
|
|
/*发起交易*/
|
|
public function sendFrom($account, $address, $amount, $confirm = 1, $comment = '')
|
|
{
|
|
$this->walletPassPhrase();
|
|
// return $this->bitcoinClient->sendfrom($account,$address,$amount,$confirm,$comment);
|
|
if (($result = $this->bitcoinClient->sendfrom($account, $address, $amount, $confirm, $comment)))
|
|
return $result;
|
|
return 0;
|
|
}
|
|
|
|
/*获取一笔交易的详细信息*/
|
|
public function getTransaction($transactionId)
|
|
{
|
|
if ($result = $this->bitcoinClient->gettransaction($transactionId)) return $result;
|
|
return 0;
|
|
}
|
|
|
|
/*加密钱包*/
|
|
public function encryptWallet($password)
|
|
{
|
|
if ($result = $this->bitcoinClient->encryptwallet($password)) return $result;
|
|
return 0;
|
|
}
|
|
|
|
/*解锁钱包*/
|
|
public function walletPassPhrase($password = '')
|
|
{
|
|
// dd($this->bitcoinClient->walletpassphrase($this->walletPassword,10));
|
|
if ($password) {
|
|
if ($this->bitcoinClient->walletpassphrase($password, 10)) return 1;
|
|
return 0;
|
|
} else {
|
|
if ($this->bitcoinClient->walletpassphrase($this->walletPassword, 10)) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/*创建一个事务*/
|
|
public function createRawTransaction($data1, $data2)
|
|
{
|
|
return $this->bitcoinClient->createrawtransaction($data1, $data2);
|
|
}
|
|
|
|
/*查询事务详情,可用于观测费用*/
|
|
public function fundRawTransaction($transaction)
|
|
{
|
|
return $this->bitcoinClient->fundrawtransaction($transaction);
|
|
}
|
|
|
|
/*查询交易费用*/
|
|
public function checkTransactionFees($toAddress, $amount)
|
|
{
|
|
if (($result = $this->fundRawTransaction($this->createRawTransaction([$this->listUnspent()[0]], [$toAddress => $amount]))['fee']) !== false) return $result;
|
|
return 0;
|
|
}
|
|
}
|
|
|