Skip to content
Snippets Groups Projects
Wallet.php 4.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • beardedwarrior's avatar
    beardedwarrior committed
    <?php
    
    namespace Monero;
    
    use App\Project;
    use Carbon\Carbon;
    
    beardedwarrior's avatar
    beardedwarrior committed
    
    class Wallet
    {
        /**
         * Wallet constructor.
         *
         * @param null $client
         */
        public function __construct($client = null)
        {
            $this->client = $client ?: new jsonRPCClient(env('RPC_URL'));
        }
    
        /**
         * Gets a Payment address for receiving payments
         *
         * @return array
         *
         * @internal param \Wallet $wallet
         */
        public function getPaymentAddress()
        {
    
            $integratedAddress = $this->createIntegratedAddress();
            if (!$integratedAddress) {
                return ['address' => 'not valid', 'expiration_time' => 900];
            }
            $project = new Project();
            $project->payment_id = $integratedAddress['payment_id'];
            $project->save();
    
            return ['address' => $integratedAddress['integrated_address'], 'paymentId' => $integratedAddress['payment_id']];
        }
    
        /**
         * Returns the actual available and useable balance (unlocked balance)
         *
         * @return float|int|mixed
         */
        public function balance()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        public function mempoolTransfers()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        public function bulkPayments($paymentIds)
        {
            $blockBuffer = 10;
    
    
            return $this->client->payments($paymentIds, intval($this->wallet->last_scanned_block_height) - $blockBuffer);
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * Scans the monero blockchain for transactions for the payment ids
         *
         * @param $blockheight
         * @param $paymentIDs
         *
         * @return array|Transaction
         */
        public function scanBlocks($blockheight, $paymentIDs)
        {
            $response = $this->bulkPayments($paymentIDs);
            $address = $this->getAddress();
            $transactions = [];
            if ($response && isset($response['payments'])) {
                foreach ($response['payments'] as $payment) {
                    $transaction = new Transaction(
                        $payment['tx_hash'],
                        $payment['amount'],
                        $address,
                        $blockheight - $payment['block_height'],
                        0,
                        Carbon::now(),
                        $payment['payment_id'],
                        $payment['block_height']
                    );
                    $transactions[] = $transaction;
                }
            }
    
            return collect($transactions);
        }
    
        /**
         * @param $blockheight
         *
         * @return \Illuminate\Support\Collection
         */
        public function scanMempool($blockheight)
        {
            $address = $this->getAddress();
            $transactions = [];
            $response = $this->mempoolTransfers();
            if ($response && isset($response['pool'])) {
                foreach ($response['pool'] as $payment) {
                    $transaction = new Transaction(
                        $payment['txid'],
                        $payment['amount'],
                        $address,
                        0,
                        0,
                        Carbon::now(),
                        $payment['payment_id'],
                        $blockheight
                    );
                    $transactions[] = $transaction;
                }
            }
    
            return collect($transactions);
        }
    
        /**
         * Gets the current blockheight of xmr
         *
         * @return int
         */
        public function blockHeight()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * Returns monero wallet address
         *
         * @return string
         */
        public function getAddress()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * Returns XMR integrated address
         *
         * @return mixed
         */
        public function createIntegratedAddress()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * @param $amount
         * @param $address
         * @param $paymentId
         *
         * @return string
         */
        public function createQrCodeString($amount, $address, $paymentId = ''): string
        {
            // @todo add tx_payment_id support
            // monero payment_id is passed through the address
            return 'monero:'.$address.'?tx_amount='.$amount;
        }
    
        /**
         * gets all the payment_ids outstanding from the address_pool, we use these to check against the latest mined blocks
         *
    
    beardedwarrior's avatar
    beardedwarrior committed
         */
        public function getPaymentIds()
        {
    
    
            return Project::pluck('payment_id'); //stop scanning for payment_ids after 24h
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    }