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.
144 lines
5.2 KiB
144 lines
5.2 KiB
<?php
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
use App\Models\UserWallet;
|
|
use App\Services\CoinService\BitCoinService;
|
|
use App\Services\CoinService\GethService;
|
|
use App\Services\CoinService\Interfaces\CoinServiceInterface;
|
|
use App\Services\CoinService\TronService;
|
|
|
|
class CoinService
|
|
{
|
|
// public function __construct()
|
|
// {
|
|
//
|
|
// }
|
|
|
|
/*创建区块钱包地址*/
|
|
public function createBlockAccount(CoinServiceInterface $coinService, $wallet)
|
|
{
|
|
if ($wallet['coin_name'] == 'BTC') {
|
|
if ($address = $coinService->newAccount()) {
|
|
$wallet->update(['wallet_address' => $address]);
|
|
return $address;
|
|
}
|
|
} elseif ($wallet['coin_name'] == 'ETH') {
|
|
if ($address = $coinService->newAccount()) {
|
|
$wallet->update(['wallet_address' => $address]);
|
|
return $address;
|
|
}
|
|
} elseif ($wallet['coin_name'] == 'TRX') {
|
|
$res = $coinService->newAccount();
|
|
if ($res instanceof \IEXBase\TronAPI\TronAddress) {
|
|
$raw_data = $res->getRawData();
|
|
$address = $res->getAddress(true);
|
|
$wallet->update(['wallet_address' => $address, 'raw_data' => $raw_data]);
|
|
return $address;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
}
|
|
|
|
public function createERC20USDTAccount($wallet)
|
|
{
|
|
$eth_account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'ETH'])->first();
|
|
if (!blank($eth_account)) {
|
|
if (blank($eth_account['wallet_address'])) {
|
|
$address = $this->createBlockAccount(new GethService(), $eth_account);
|
|
return $wallet->update(['wallet_address' => $address]);
|
|
} else {
|
|
return $wallet->update(['wallet_address' => $eth_account['wallet_address']]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function createTRC20USDTAccount($wallet)
|
|
{
|
|
$trx_account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'TRX'])->first();
|
|
if (!blank($trx_account)) {
|
|
if (blank($trx_account['wallet_address'])) {
|
|
$address = $this->createBlockAccount(new TronService(), $trx_account);
|
|
return $wallet->update(['trx_wallet_address' => $address]);
|
|
} else {
|
|
return $wallet->update(['trx_wallet_address' => $trx_account['wallet_address']]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function createOMNIUSDTAccount($wallet)
|
|
{
|
|
$btc_account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'BTC'])->first();
|
|
if (!blank($btc_account)) {
|
|
if (blank($btc_account['wallet_address'])) {
|
|
$address = $this->createBlockAccount(new BitCoinService(), $btc_account);
|
|
return $wallet->update(['omni_wallet_address' => $address]);
|
|
} else {
|
|
return $wallet->update(['omni_wallet_address' => $btc_account['wallet_address']]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 优盾钱包
|
|
* @param $wallet
|
|
* @param $coin_name
|
|
* @param null $addressType 钱包类型 1:USDT-OMNI 2:USDT-ERC20 3:USDT-TRC20
|
|
* @return mixed
|
|
*/
|
|
public function createAddress($wallet, $coin_name, $addressType = null)
|
|
{
|
|
|
|
$map = [
|
|
'BTC' => 0,
|
|
'ETH' => 60,
|
|
'TRX' => 195,
|
|
'SHIB' => 60,
|
|
'DOGE' => 60,
|
|
'USDT' => 60,
|
|
];
|
|
// dd($map,$coin_name);
|
|
$coinType = $map[$coin_name] ?? null;
|
|
if (blank($coinType)) return;
|
|
// info($coinType);
|
|
if (blank($addressType)) {
|
|
// dd('22221');
|
|
$res = (new UdunWalletService())->createAddress($coinType);
|
|
// info($res);
|
|
if ($res['code'] == 200) {
|
|
$address = $res['data']['address'];
|
|
$wallet->update(['wallet_address' => $address]);
|
|
}
|
|
} else {
|
|
if ($addressType == 1) {
|
|
$account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'BTC'])->first();
|
|
$field = 'omni_wallet_address';
|
|
} elseif ($addressType == 2) {
|
|
$account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'ETH'])->first();
|
|
$field = 'wallet_address';
|
|
} else {
|
|
$account = UserWallet::query()->where(['user_id' => $wallet['user_id'], 'coin_name' => 'TRX'])->first();
|
|
$field = 'trx_wallet_address';
|
|
}
|
|
|
|
if (empty($account['wallet_address'])) {
|
|
|
|
$res = (new UdunWalletService())->createAddress($coinType);
|
|
if ($res['code'] == 200) {
|
|
$address = $res['data']['address'];
|
|
$wallet->update([$field => $address]);
|
|
$account->update(['wallet_address' => $address]);
|
|
} else {
|
|
info(json_encode($res));
|
|
}
|
|
} else {
|
|
// dd($account);
|
|
return $wallet->update([$field => $account['wallet_address']]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|