AirDropController.php 4.51 KB
<?php

namespace api\controllers;

use api\base\BaseController;
use common\models\psources\CoinAirDropTrade;
use common\service\chain33\Chain33Service;
use Yii;


class AirDropController extends BaseController
{
    public function actionGameTrade()
    {
        $coins_address = Yii::$app->request->post('coins_address', '');

        if(empty($coins_address)){
            return ['code' => -1, 'msg' => '参数不能为空'];
        }

        $coinTokenTransfer = CoinAirDropTrade::find()->where(['coins_address' => $coins_address, 'type' => CoinAirDropTrade::TYPE_GAME])->one();
        if($coinTokenTransfer){
            return ['code' => -1, 'data' => null, 'msg' => 'record already exists'];
        }

        $fee = 100000;
        $amount = CoinAirDropTrade::AMOUNT_GAME * 1e8;
        $execer = 'coins';
        $note = '';

        $service = new Chain33Service();
        $createRawTransaction  = $service->createRawTransaction($coins_address, $amount, $fee, $note, $execer);
        if(0 != $createRawTransaction['code']){
            $msg = $createRawTransaction['msg'];
            $code = -1;
            goto doEnd;
        }

        $txHex = $createRawTransaction['result'];
        $privkey = '72c3879f1f9b523f266a9545b69bd41c0251483a93e21e348e85118afe17a5e2';
        $expire = '1m';

        $signRawTx = $service->signRawTx($privkey, $txHex, $expire);
        if(0 != $signRawTx['code']){
            $msg = $signRawTx['msg'];
            $code = -1;
            goto doEnd;
        }
        $sign_str = $signRawTx['result'];
        $result = $service->sendTransaction($sign_str);

        if(0 != $result['code']){
            $msg = $result['msg'];
            $code = -1;
            goto doEnd;
        }
        $code = 1;
        $msg = $result['result'];

        doEnd :
        $airDropModel = new CoinAirDropTrade();
        $airDropModel->coins_address = $coins_address;
        $airDropModel->amount = CoinAirDropTrade::AMOUNT_GAME;
        $airDropModel->msg = $msg;
        $airDropModel->attach = 0;
        $airDropModel->balance = 0;
        $airDropModel->type = CoinAirDropTrade::TYPE_GAME;
        $airDropModel->save();

        return ['code' => $code, 'msg' => $msg];
    }

    public function actionGameTradeUpdate()
    {
        $coinAirDropTrade = CoinAirDropTrade::find()->where(['attach' => 2 ,'msg' => '0'])->limit(30)->all();
        foreach ($coinAirDropTrade as $val){
            $fee = 100000;
            $amount = 1 * 1e8;
            $execer = 'coins';
            $note = '';

            $service = new Chain33Service();
            $createRawTransaction  = $service->createRawTransaction($val->coins_address, $amount, $fee, $note, $execer);
            if(0 != $createRawTransaction['code']){
                continue;
            }

            $txHex = $createRawTransaction['result'];
            $privkey = '72c3879f1f9b523f266a9545b69bd41c0251483a93e21e348e85118afe17a5e2';
            $expire = '1m';

            $signRawTx = $service->signRawTx($privkey, $txHex, $expire);
            if(0 != $signRawTx['code']){
                continue;
            }
            $sign_str = $signRawTx['result'];
            $result = $service->sendTransaction($sign_str);

            if(0 != $result['code']){
                continue;
            }
            $currentModel = CoinAirDropTrade::findOne($val->id);
            $currentModel->attach = 2;
            $currentModel->balance = 0;
            $currentModel->msg = $result['result'];
            $currentModel->save();
        }
        return ['code' => 1, 'msg' => 'ok'];
    }

    public function actionGetBalance()
    {
        $coinAirDropTrade = CoinAirDropTrade::find()->where(['balance' => 0])->limit(60)->all();
        $address = [];
        foreach ($coinAirDropTrade as $val){
            $address[] = $val->coins_address;
        }
        $service = new Chain33Service();
        $execer = 'coins';
        $result  = $service->getBalance($address, $execer);
        if(0 == $result['code']){
            $result_balance = $result['result'];
            foreach ($result_balance as $val){
                $coinAirDropTrade = CoinAirDropTrade::find()->where(['coins_address' => $val['addr']])->one();
                if(empty($coinAirDropTrade)) continue;
                $coinAirDropTrade->balance = $val['balance'];
                $coinAirDropTrade->save();
            }
        }
        return ['code' => 1, 'msg' => 'ok'];
    }
}