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')->where(['status' => $status])->asArray()->all(); if (false == $issue_coin_model) { echo date('Y-m-d H:i:s') . '暂无执行任务' . PHP_EOL; return 0; } $issue_coin_ids = ArrayHelper::getColumn($issue_coin_model, 'id'); if (1 == $step) { $columns = ['id', 'pre_create_tx', 'issue_coin_id']; $condition = [ 'pre_send_transaction' => 'standby', 'pre_query_transaction' => 'standby' ]; } if (2 == $step) { $columns = ['id', 'finish_tx', 'issue_coin_id']; $condition = [ 'pre_query_transaction' => 'success', 'finish_tx' => 'standby', 'finish_send_transaction' => 'standby', 'finish_query_transaction' => 'standby' ]; } $model = CoinIssueChainRecord::find()->select($columns)->where($condition)->andWhere(['in', 'issue_coin_id', $issue_coin_ids])->all(); if (false == $model) { echo date('Y-m-d H:i:s') . ' STEP: ' . $step . '暂无交易计划' . PHP_EOL; return 0; } $node = Yii::$app->params['chain_nodes']['STO']; $chain_service = new Chain33Service($node); foreach ($model as $val) { //执行1.2构造 $result = $chain_service->createRawTokenFinishTx($val->coin->symbol, $val->coin->owner); if (null != $result['error']) { $status = CoinIssueCoin::FAIL_ISSUE; $data = [ 'status' => CoinIssueCoin::FAIL_ISSUE, 'finish_query_transaction' => $result['msg'] ]; goto doEnd; } $txHex = $result['result']; $privkey = '8ac19c0b8858ccd6ed34e2bce0f11be2fc696e658d0b98fb1d3ef85ec5a3992c'; #$privkey = $val->coin->chain->private_key; $expire = '1m'; //执行1.2签名 $signRawTx = $chain_service->signRawTx($privkey, $txHex, $expire); if (0 != $signRawTx['code']) { $status = CoinIssueCoin::FAIL_ISSUE; $data = [ 'finish_query_transaction' => $signRawTx['msg'] ]; goto doEnd; } //执行1.2交易 $result = $chain_service->sendTransaction($signRawTx['result']); if (0 != $result['code']) { $status = CoinIssueCoin::FAIL_ISSUE; $data = [ 'finish_tx' => $signRawTx['result'], 'finish_query_transaction' => $result['msg'] ]; goto doEnd; } $status = CoinIssueCoin::SUCCESS_ISSUE; $data = [ 'finish_tx' => $signRawTx['result'], 'finish_send_transaction' => $result['result'] ]; doEnd : CoinIssueChainRecord::updateAll($data, [ 'id' => $val->id, ]); //交易失败 if ($status == CoinIssueCoin::FAIL_ISSUE) { CoinIssueCoin::updateAll(['status' => $status], [ 'id' => $val->coin->id, ]); } } echo date('Y-m-d H:i:s') . '执行完成' . PHP_EOL; return 0; } public function actionQueryTransaction($step) { if (1 == $step) { $model = CoinIssueChainRecord::find()->where(['pre_query_transaction' => 'standby'])->all(); } if (2 == $step) { $model = CoinIssueChainRecord::find()->where(['pre_query_transaction' => 'success'])->andWhere(['<>', 'finish_send_transaction', 'standby'])->all(); } if (false == $model) { echo date('Y-m-d H:i:s') . ' STEP: ' . $step . '暂无完成的发送交易' . PHP_EOL; return 0; } $node = Yii::$app->params['chain_nodes']['STO']; $service = new Chain33Service($node); foreach ($model as $val) { if (1 == $step) { $result = $service->QueryTransaction($val->pre_send_transaction); } if (2 == $step) { $result = $service->QueryTransaction($val->finish_send_transaction); } if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) { $status = CoinIssueCoin::SUCCESS_ISSUE; $data = [ 'finish_query_transaction' => 'success' ]; goto doEnd; } else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) { $status = CoinIssueCoin::SUCCESS_ISSUE; $data = [ 'finish_query_transaction' => 'success' ]; goto doEnd; } else { $status = CoinIssueCoin::FAIL_ISSUE; if (isset($result['result']['receipt']['logs'])) { foreach ($result['result']['receipt']['logs'] as $log) { if (isset($log['tyName']) && 'LogErr' == $log['tyName']) { $data = [ 'finish_query_transaction' => $log['log'] ]; break; } } } else { $data = [ 'finish_query_transaction' => $result['msg'] ]; } goto doEnd; } doEnd : CoinIssueChainRecord::updateAll($data, [ 'id' => $val->id, ]); //查询后,交易失败 if ($status == CoinIssueCoin::FAIL_ISSUE) { CoinIssueCoin::updateAll(['status' => $status], [ 'id' => $val->coin->id, ]); } //查询后,交易成功 if ($status == CoinIssueCoin::SUCCESS_ISSUE) { CoinIssueCoin::updateAll(['status' => $status, 'charge_pay' => CoinIssueCoin::SUCCESS_PAY], [ 'id' => $val->coin->id, ]); $params = [ 'name' => $val->coin->name, 'symbol' => $val->coin->symbol, 'introduction' => $val->coin->introduction, 'total' => (int)$val->coin->total, 'price' => isset($val->coin->platform->issue_charge) ? (int)$val->coin->platform->issue_charge : 0, 'category' => (int)$val->coin->category, 'owner' => $val->coin->owner, 'platform_id' => $val->coin->platform_id, 'platform' => $val->coin->chain->platform ]; $this->syncRecord($params); $this->syncCoin($params); } } echo date('Y-m-d H:i:s') . '查询完成,同步完成' . PHP_EOL; return 0; } public function actionCancel() { $issue_coin_model = CoinIssueCoin::find()->where(['status' => CoinIssueCoin::CANCEL_ISSUE])->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 $val) { $data = []; $result = $chain_service->createRawTokenRevokeTx($val->symbol, $val->owner); if (null == $val->transfer) { $status = CoinIssueCoin::CANCEL_FAIL; goto doEnd; } if (null != $result['error']) { $status = CoinIssueCoin::CANCEL_FAIL; $data = [ 'pre_query_transaction' => $result['error'] ]; goto doEnd; } $status = CoinIssueCoin::CANCEL_SUCCESS; $data = [ 'pre_query_transaction' => $result['result'] ]; doEnd : CoinIssueCoin::updateAll(['status' => $status], [ 'id' => $val->id, ]); if (false != $data) { CoinIssueChainRecord::updateAll($data, [ 'issue_coin_id' => $val->id, ]); } } echo date('Y-m-d H:i:s') . '已撤消' . PHP_EOL; return 0; } 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(); } }