select('id')->where(['charge_pay' => CoinIssueCoin::ALLOW_PAY])->asArray()->all(); if (false == $issue_coin_model) { echo date('Y-m-d H:i:s') . '暂无手续费划转任务' . PHP_EOL; return 0; } $issue_transfer = CoinIssueTransfer::find() ->where(['unissue' => 1]) ->andWhere(['in', 'issue_coin_id', ArrayHelper::getColumn($issue_coin_model, 'id')]) ->asArray() ->all(); if (false == $issue_transfer) { echo date('Y-m-d H:i:s') . '暂无手续费划转任务' . PHP_EOL; return 0; } $node = Yii::$app->params['chain_nodes']['STO']; $service = new Chain33Service($node); foreach ($issue_transfer as $val) { $result = $service->sendTransaction($val['txhex']); if (0 == $result['code']) { $send_result = $result['result']; $currentModel = CoinIssueTransfer::findOne($val['id']); $currentModel->send_result = $send_result; $currentModel->msg = 0; $currentModel->save(); } else { $currentModel = CoinIssueTransfer::findOne($val['id']); $currentModel->msg = $result['msg']; $currentModel->save(); } } echo date('Y-m-d H:i:s') . '手续费划转任务完成' . PHP_EOL; return 0; } /** * 手续费划转状态确认 * @return */ public function actionPayChargeStatus() { $unissue = -1; $model = CoinIssueTransfer::find()->where(['<>', 'send_result', '0'])->andWhere(['msg' => '0'])->asArray()->all(); if (empty($model)) { echo date('Y-m-d H:i:s') . '暂无需要确认的手续费划转状态' . PHP_EOL; return 0; } $node = \Yii::$app->params['chain_parallel']['primary']; $service = new Chain33Service($node); foreach ($model as $val) { $send_result = $val['send_result']; $result = $service->QueryTransaction($send_result); if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) { $query_result = 'success'; $msg = 'success'; goto doEnd; } else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) { $query_result = 'success'; $msg = 'success'; goto doEnd; } else { if (isset($result['result']['receipt']['logs'])) { foreach ($result['result']['receipt']['logs'] as $log) { if (isset($log['tyName']) && 'LogErr' == $log['tyName']) { $msg = $log['tyName']; break; } } } else { $msg = $result['msg']; } $query_result = $result['code']; goto doEnd; } doEnd : if ('success' == $msg) { $unissue = 0; $coin_issue_coin = CoinIssueCoin::find()->where(['id' => $val['issue_coin_id']])->one(); $coin_issue_coin->charge_pay = CoinIssueCoin::SUCCESS_PAY; $coin_issue_coin->save(); } $currentModel = CoinIssueTransfer::findOne($val['id']); $currentModel->query_result = $query_result; if ($unissue > -1) { $currentModel->unissue = $unissue; } $currentModel->msg = $msg; $currentModel->save(); } } /** * 自动发币 * @param $type 0 未开启人工 1 已开启人工 * @return */ public function actionAutoTransfer() { $issue_coin_model = CoinIssueCoin::find() ->select('id, step_one_tx') ->where(['step_one_result' => 0]) ->andWhere(['<>', 'step_one_tx', '']) ->asArray() ->all(); if (false == $issue_coin_model) { echo date('Y-m-d H:i:s') . '暂无1.1执行任务' . PHP_EOL; return 0; } $node = Yii::$app->params['chain_nodes']['STO']; $service = new Chain33Service($node); foreach ($issue_coin_model as $val) { go(function () use ($val, $service) { \Co::sleep(0.5); $result = $service->sendTransaction($val['step_one_tx']); $send_result = $result['result']; $currentModel = CoinIssueCoin::findOne($val['id']); $currentModel->step_one_result = $send_result; $currentModel->save(); }); } echo date('Y-m-d H:i:s') . '1.1 交易完成' . PHP_EOL; return 0; } /** * 自动发币 * @param $type 0 未开启人工 1 已开启人工 * @return */ public function actionAutoIssue($type) { if (0 == $type) { $status = CoinIssueCoin::UN_AUDIT; $manual_review = Yii::$app->redis->get('issue_chain_manual_review'); if ('close' == $manual_review) { return 0; } } if (1 == $type) { $status = CoinIssueCoin::ALLOW_ISSUE; } $issue_coin_model = CoinIssueCoin::find() ->select('id, name, platform_id, chain_id, symbol, introduction, total, category, owner') ->where(['status' => $status]) ->andWhere(['<>', 'step_one_result', 0]) ->all(); if (false == $issue_coin_model) { echo date('Y-m-d H:i:s') . '暂无发行任务' . PHP_EOL; return 0; } $node = Yii::$app->params['chain_nodes']['STO']; $chain_service = new Chain33Service($node); foreach ($issue_coin_model as $issue_coin) { //执行1.2构造 $result = $chain_service->createRawTokenFinishTx($issue_coin->symbol, $issue_coin->owner); if (null != $result['error']) { $data = [ 'status' => CoinIssueCoin::FAIL_ISSUE, 'msg' => $result['msg'] ]; goto doEnd; } $txHex = $result['result']; #$privkey = '72c3879f1f9b523f266a9545b69bd41c0251483a93e21e348e85118afe17a5e21'; $privkey = $issue_coin->chain->private_key; $expire = '1m'; //执行1.2签名 $signRawTx = $chain_service->signRawTx($privkey, $txHex, $expire); if (0 != $signRawTx['code']) { $data = [ 'status' => CoinIssueCoin::FAIL_ISSUE, 'msg' => $result['msg'] ]; goto doEnd; } //执行1.2交易 $result = $chain_service->sendTransaction($signRawTx['result']); if (0 != $result['code']) { $data = [ 'status' => CoinIssueCoin::FAIL_ISSUE, 'msg' => $result['msg'] ]; goto doEnd; } $data = [ 'msg' => $result['result'], 'status' => CoinIssueCoin::SUCCESS_ISSUE, 'charge_pay' => CoinIssueCoin::ALLOW_PAY ]; $params['platform_id'] = $issue_coin->platform_id; $params['platform'] = $issue_coin->chain->platform; $this->syncRecord($params); $this->syncCoin($params); doEnd : CoinIssueCoin::updateAll($data, [ 'id' => $issue_coin->id, ]); } echo date('Y-m-d H:i:s') . '发行成功' . PHP_EOL; return 0; $params = [ 'name' => $issue_coin->name, 'symbol' => $issue_coin->symbol, 'introduction' => $issue_coin->introduction, 'total' => (int)$issue_coin->total, 'price' => isset($issue_coin->platform->issue_charge) ? (int)$issue_coin->platform->issue_charge : 0, 'category' => (int)$issue_coin->category, 'owner' => $issue_coin->owner ]; $result = $chain_service->createRawTokenPreCreateTx($params); if (null == $result['error'] && false == $result['code']) { $data = [ 'msg' => $result['result'], 'status' => CoinIssueCoin::SUCCESS_ISSUE, 'charge_pay' => CoinIssueCoin::ALLOW_PAY ]; $params['platform_id'] = $issue_coin->platform_id; $params['platform'] = $issue_coin->chain->platform; #$this->syncTransfer($issue_transfer['id']); $this->syncRecord($params); $this->syncCoin($params); } else { $data = [ 'status' => CoinIssueCoin::FAIL_ISSUE, ]; } if ($data['status'] > CoinIssueCoin::REFUSE_ISSUE) { CoinIssueCoin::updateAll($data, [ 'id' => $issue_coin->id, ]); } } public function syncCoin($params = []) { $model_coin = Coin::find()->where(['name' => $params['name'], 'platform' => $params['platform']])->one(); if (false == $model_coin) { $model = new Coin(); $model->name = $params['symbol']; $model->sid = $params['name']; $model->platform = $params['platform']; $model->chain = 'BTY'; $model->treaty = 1; $model->save(); } } public function syncRecord($params = []) { $coin_issue_record = new CoinIssueRecord(); $coin_issue_record->platform_id = $params['platform_id']; $coin_issue_record->total = $params['total']; $coin_issue_record->save(); } public function syncTransfer($id) { $issue_transfer = CoinIssueTransfer::find()->where(['id' => $id])->one(); $issue_transfer->unissue = 0; $issue_transfer->save(); } }