Skip to content
Snippets Groups Projects
Wallet.php 3.33 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()
        {
    
    
            $subaddress = $this->createSubaddress();
            if (!$subaddress) {
    
    beardedwarrior's avatar
    beardedwarrior committed
                return ['address' => 'not valid', 'expiration_time' => 900];
            }
            $project = new Project();
    
            $project->subaddr_index = $subaddress['address_index'];
    
    beardedwarrior's avatar
    beardedwarrior committed
            $project->save();
    
    
            return ['address' => $subaddress['address'], 'subaddr_index' => $subaddress['address_index']];
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * Returns the actual available and useable balance (unlocked balance)
         *
         * @return float|int|mixed
         */
        public function balance()
        {
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
    
         * @param $min_height
         * @param $account_index
    
    beardedwarrior's avatar
    beardedwarrior committed
         *
    
         * @return \Illuminate\Support\Collection
    
    beardedwarrior's avatar
    beardedwarrior committed
         */
    
        public function scanIncomingTransfers($min_height = 0, $account_index = 0)
    
    beardedwarrior's avatar
    beardedwarrior committed
        {
    
            $response = $this->client->incomingTransfers($min_height);
            if (!$response) {
                return collect([]);
    
    beardedwarrior's avatar
    beardedwarrior committed
            }
    
            $transactions = [];
    
            const toScan = ['pool', 'in'];        
            foreach (toScan as $entry) {
                if (!isset($response[$entry])) {
                    continue;
                }
                foreach ($response[$entry] as $payment) {
                    if $payment['subaddr_index']['major'] != $account_index {
                        continue;
                    }
    
    beardedwarrior's avatar
    beardedwarrior committed
                    $transaction = new Transaction(
                        $payment['txid'],
                        $payment['amount'],
    
                        $payment['address'],
                        $payment['confirmations'],
    
    beardedwarrior's avatar
    beardedwarrior committed
                        0,
                        Carbon::now(),
    
                        $payment['subaddr_index']['minor'],
                        $payment['height']
    
    beardedwarrior's avatar
    beardedwarrior committed
                    );
                    $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
         *
         * @return mixed
         */
    
        public function createSubaddress()
    
    beardedwarrior's avatar
    beardedwarrior committed
        {
    
            return $this->client->createSubaddress();
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    
        /**
         * @param $address
    
    beardedwarrior's avatar
    beardedwarrior committed
         *
         * @return string
         */
    
        public function createQrCodeString($address, $amount): string
    
    beardedwarrior's avatar
    beardedwarrior committed
        {
            return 'monero:'.$address.'?tx_amount='.$amount;
        }
    
        /**
    
         * gets all the subaddr_indexes outstanding from the address_pool, we use these to check against the latest mined blocks
    
    beardedwarrior's avatar
    beardedwarrior committed
         *
    
    beardedwarrior's avatar
    beardedwarrior committed
         */
    
        public function getSubaddressIndexes()
    
            return Project::pluck('subaddr_index'); //stop scanning for subaddr_index after 24h
    
    beardedwarrior's avatar
    beardedwarrior committed
        }
    }