| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823 | 
							- <?php
 
- namespace App\Services\Web3;
 
- use GuzzleHttp\Client as GuzzleHttp;
 
- class Web3
 
- {
 
-     private $url;
 
-     protected $requestId = 0;
 
-     protected $client;
 
-     protected $chainId;
 
-     public function getProvider()
 
-     {
 
-         return $this->provider;
 
-     }
 
-     public function __construct($url)
 
-     {
 
-         $this->url = $url;
 
-         $this->client = new GuzzleHttp(array_merge(['timeout' => 60, 'verify' => false], ['base_uri' => $url]));
 
-     }
 
-     /**
 
-      * Returns the current client version
 
-      * @throws \Exception
 
-      * Returns: String - the current client version
 
-      */
 
-     public function clientVersion()
 
-     {
 
-         return $this->request('web3_clientVersion', []);
 
-     }
 
-     /**
 
-      * Returns Keccak-256 (not the standardized SHA3-256) of the given data.
 
-      * @param string data
 
-      * @throws \Exception
 
-      * Returns: DATA - The SHA3 result of the given string.
 
-      */
 
-     public function sha3(string $data)
 
-     {
 
-         return $this->request('web3_sha3', [$data]);
 
-     }
 
-     /**
 
-      * Returns the current network id.
 
-      * @throws \Exception
 
-      * Returns: String - The current network id.
 
-      *              "1": Ethereum Mainnet
 
-      *              "2": Morden Testnet (deprecated)
 
-      *              "3": Ropsten Testnet
 
-      *              "4": Rinkeby Testnet
 
-      *              "42": Kovan Testnet
 
-      */
 
-     public function netVersion()
 
-     {
 
-         if (empty($this->chainId)) {
 
-             $this->chainId = $this->request('net_version', []);
 
-         }
 
-         return $this->chainId;
 
-     }
 
-     /**
 
-      * Returns true if client is actively listening for network connections.
 
-      * @throws \Exception
 
-      * Returns: Boolean - true when listening, otherwise false.
 
-      */
 
-     public function netListening()
 
-     {
 
-         return $this->request('net_listening', []);
 
-     }
 
-     /**
 
-      * Returns number of peers currently connected to the client.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the number of connected peers.
 
-      */
 
-     public function netPeerCount()
 
-     {
 
-         return $this->request('net_peerCount', []);
 
-     }
 
-     /**
 
-      * Returns the current ethereum protocol version.
 
-      * @throws \Exception
 
-      * Returns: String - The current ethereum protocol version
 
-      */
 
-     public function protocolVersion()
 
-     {
 
-         return $this->request('eth_protocolVersion', []);
 
-     }
 
-     /**
 
-      * Returns an object with data about the sync status or false.
 
-      * @throws \Exception
 
-      * Returns: Object|Boolean, An object with sync status data or FALSE, when not syncing:
 
-      *              startingBlock: QUANTITY - The block at which the import started (will only be reset, after the sync reached his head)
 
-      *              currentBlock: QUANTITY - The current block, same as eth_blockNumber
 
-      *              highestBlock: QUANTITY - The estimated highest block
 
-      */
 
-     public function syncing()
 
-     {
 
-         return $this->request('eth_syncing', []);
 
-     }
 
-     /**
 
-      * Returns the client coinbase address.
 
-      * @throws \Exception
 
-      * Returns: DATA, 20 bytes - the current coinbase address.
 
-      */
 
-     public function coinbase()
 
-     {
 
-         return $this->request('eth_coinbase', []);
 
-     }
 
-     /**
 
-      * Returns true if client is actively mining new blocks.
 
-      * @throws \Exception
 
-      * Returns: Boolean - returns true of the client is mining, otherwise false.
 
-      */
 
-     public function mining()
 
-     {
 
-         return $this->request('eth_mining', []);
 
-     }
 
-     /**
 
-      * Returns the number of hashes per second that the node is mining with.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - number of hashes per second.
 
-      */
 
-     public function hashrate()
 
-     {
 
-         return $this->request('eth_hashrate', []);
 
-     }
 
-     /**
 
-      * Returns the current price per gas in wei.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the current gas price in wei.
 
-      */
 
-     public function gasPrice()
 
-     {
 
-         return $this->request('eth_gasPrice', []);
 
-     }
 
-     /**
 
-      * Returns a list of addresses owned by client.
 
-      * @throws \Exception
 
-      * Returns: Array of DATA, 20 Bytes - addresses owned by the client.
 
-      */
 
-     public function accounts()
 
-     {
 
-         return $this->request('eth_accounts', []);
 
-     }
 
-     /**
 
-      * Returns the balance of the account of given address.
 
-      * @param $address , 20 Bytes - address to check for balance.
 
-      * @param string $block - integer block number, or the string "latest", "earliest" or "pending", see the default block parameter
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the current balance in wei.
 
-      */
 
-     public function getBalance($address, string $block = 'latest')
 
-     {
 
-         return $this->request('eth_getBalance', [$address, $block]);
 
-     }
 
-     /**
 
-      * Returns the value from a storage position at a given address.
 
-      * @param $data
 
-      * @param $quantity1
 
-      * @param string $quantity2
 
-      * @return mixed
 
-      * @throws \Exception
 
-      * Returns: DATA - the value at this storage position.
 
-      */
 
-     public function getStorageAt($data, $quantity1, string $quantity2 = Quantity::latest)
 
-     {
 
-         return $this->request('eth_getStorageAt', [$data, $quantity1, $quantity2]);
 
-     }
 
-     /**
 
-      * Returns the number of transactions sent from an address.
 
-      * @param $address
 
-      * @param $quantity
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the number of transactions send from this address.
 
-      */
 
-     public function getTransactionCount($address, $quantity = Quantity::latest)
 
-     {
 
-         return $this->request('eth_getTransactionCount', [$address, $quantity]);
 
-     }
 
-     /**
 
-      * Returns the number of transactions in a block from a block matching the given block hash.
 
-      * @param $hash
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the number of transactions in this block.
 
-      */
 
-     public function getBlockTransactionCountByHash($hash)
 
-     {
 
-         return $this->request('eth_getBlockTransactionCountByHash', [$hash]);
 
-     }
 
-     /**
 
-      * Returns the number of transactions in a block matching the given block number.
 
-      * @param string $quantity
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the number of transactions in this block.
 
-      */
 
-     public function getBlockTransactionCountByNumber(string $quantity = Quantity::latest)
 
-     {
 
-         return $this->request('eth_getBlockTransactionCountByNumber', [$quantity]);
 
-     }
 
-     /**
 
-      * Returns the number of uncles in a block from a block matching the given block hash.
 
-      * @param $hash
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the number of uncles in this block.
 
-      */
 
-     public function getUncleCountByBlockHash($hash)
 
-     {
 
-         return $this->request('eth_getUncleCountByBlockHash', [$hash]);
 
-     }
 
-     /**
 
-      * Returns the number of uncles in a block from a block matching the given block number.
 
-      * @param $quantity
 
-      * @throws \Exception
 
-      * Returns:  QUANTITY - integer of the number of uncles in this block.
 
-      */
 
-     public function getUncleCountByBlockNumber($quantity = Quantity::latest)
 
-     {
 
-         return $this->request('eth_getUncleCountByBlockNumber', [$quantity]);
 
-     }
 
-     /**
 
-      * Returns code at a given address.
 
-      * @param $data
 
-      * @param string $quantity
 
-      * @throws \Exception
 
-      * Returns: DATA - the code from the given address.
 
-      */
 
-     public function getCode($data, string $quantity = Quantity::latest)
 
-     {
 
-         return $this->request('eth_getCode', [$data, $quantity]);
 
-     }
 
-     /**
 
-      * The sign method calculates an Ethereum specific signature with:
 
-      *      sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).
 
-      *
 
-      * By adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature.
 
-      * This prevents misuse where a malicious DApp can sign arbitrary data (e.g. transaction) and use the signature to impersonate the victim.
 
-      *
 
-      * Note the address to sign with must be unlocked.
 
-      * @param $address
 
-      * @param $data
 
-      * @throws \Exception
 
-      * Returns: DATA: Signature
 
-      */
 
-     public function sign($address, $data)
 
-     {
 
-         return $this->request('eth_sign', [$address, $data]);
 
-     }
 
-     /**
 
-      * Creates new message call transaction or a contract creation, if the data field contains code.
 
-      * @param $from
 
-      * @param $to
 
-      * @param $gas
 
-      * @param $value
 
-      * @param $data
 
-      * @param $gasPrice
 
-      * @param $nonce
 
-      * @throws \Exception
 
-      * Returns: DATA, 32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available.
 
-      * Use eth_getTransactionReceipt to get the contract address, after the transaction was mined, when you created a contract.
 
-      */
 
-     public function sendTransaction($from, $to, $gas = 90000, $value = '0x0', $data = '0x0', $gasPrice = null, $nonce = null)
 
-     {
 
-         $data = [
 
-             'from' => $from,
 
-             'to' => $to,
 
-             'gas' => $gas,
 
-             'value' => $value,
 
-             'data' => $data,
 
-         ];
 
-         if (!empty($nonce)) {
 
-             $data['nonce'] = $nonce;
 
-         }
 
-         if (!empty($gasPrice)) {
 
-             $data['gasPrice'] = $gasPrice;
 
-         }
 
-         return $this->request('eth_sendTransaction', $data);
 
-     }
 
-     /**
 
-      * Creates new message call transaction or a contract creation for signed transactions.
 
-      * @param $data
 
-      * @throws \Exception
 
-      * Returns: DATA, 32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available.
 
-      * Use eth_getTransactionReceipt to get the contract address, after the transaction was mined, when you created a contract.
 
-      */
 
-     public function sendRawTransaction($data)
 
-     {
 
-         return $this->request('eth_sendRawTransaction', [$data]);
 
-     }
 
-     /**
 
-      * Executes a new message call immediately without creating a transaction on the block chain.
 
-      * @param $to
 
-      * @param string $data
 
-      * @param $from
 
-      * @param $gas
 
-      * @param $value
 
-      * @param $gasPrice
 
-      * @return mixed
 
-      * @throws \Exception Returns: DATA - the return value of executed contract.
 
-      */
 
-     public function call( $to, string $data = '0x0', $from = null, $gas = null, $value = null, $gasPrice = null,$quantity=Quantity::latest)
 
-     {
 
-         $data0 = [
 
-             'to' => $to,
 
-         ];
 
-         if (!empty($gas)) {
 
-             $data0['gas'] = $gas;
 
-         }
 
-         if (!empty($from)) {
 
-             $data0['from'] = $from;
 
-         }
 
-         if (!empty($value)) {
 
-             $data0['value'] = $value;
 
-         }
 
-         if (!empty($data)) {
 
-             $data0['data'] = $data;
 
-         }
 
-         if (!empty($gasPrice)) {
 
-             $data0['gasPrice'] = $gasPrice;
 
-         }
 
-         return $this->request('eth_call', [$data0,$quantity]);
 
-     }
 
-     /**
 
-      * Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.The transaction will not be added to the blockchain.
 
-      * Note that the estimate may be significantly more than the amount of gas actually used by the transaction, for a variety of reasons including EVM mechanics and node performance.
 
-      * @param $to
 
-      * @param string $data
 
-      * @param $from
 
-      * @param $gas
 
-      * @param $value
 
-      * @param $gasPrice
 
-      * @param $nonce
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - the amount of gas used.
 
-      */
 
-     public function estimateGas($to, string $data = '0x0', $from = null, $gas = null, $value = null, $gasPrice = null, $nonce = null)
 
-     {
 
-         $data0 = [];
 
-         if (!empty($from)) {
 
-             $data0['from'] = $from;
 
-         }
 
-         $data0['to'] = $to;
 
-         if (!empty($gas)) {
 
-             $data0['gas'] = $gas;
 
-         }
 
-         if (!empty($value)) {
 
-             $data0['value'] = $value;
 
-         }
 
-         if (!empty($data)) {
 
-             $data0['data'] = $data;
 
-         }
 
-         if (!empty($gasPrice)) {
 
-             $data0['gasPrice'] = $gasPrice;
 
-         }
 
-         return $this->request('eth_estimateGas', [$data0]);
 
-     }
 
-     /**
 
-      * Returns information about a block by hash.
 
-      * @param $hash
 
-      * @throws \Exception
 
-      * Returns: Object - A block object, or null when no block was found:
 
-      *              number: QUANTITY - the block number. null when its pending block.
 
-      *              hash: DATA, 32 Bytes - hash of the block. null when its pending block.
 
-      *              parentHash: DATA, 32 Bytes - hash of the parent block.
 
-      *              nonce: DATA, 8 Bytes - hash of the generated proof-of-work. null when its pending block.
 
-      *              sha3Uncles: DATA, 32 Bytes - SHA3 of the uncles data in the block.
 
-      *              logsBloom: DATA, 256 Bytes - the bloom filter for the logs of the block. null when its pending block.
 
-      *              transactionsRoot: DATA, 32 Bytes - the root of the transaction trie of the block.
 
-      *              stateRoot: DATA, 32 Bytes - the root of the final state trie of the block.
 
-      *              receiptsRoot: DATA, 32 Bytes - the root of the receipts trie of the block.
 
-      *              miner: DATA, 20 Bytes - the address of the beneficiary to whom the mining rewards were given.
 
-      *              difficulty: QUANTITY - integer of the difficulty for this block.
 
-      *              totalDifficulty: QUANTITY - integer of the total difficulty of the chain until this block.
 
-      *              extraData: DATA - the “extra data” field of this block.
 
-      *              size: QUANTITY - integer the size of this block in bytes.
 
-      *              gasLimit: QUANTITY - the maximum gas allowed in this block.
 
-      *              gasUsed: QUANTITY - the total used gas by all transactions in this block.
 
-      *              timestamp: QUANTITY - the unix timestamp for when the block was collated.
 
-      *              transactions: Array - Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter.
 
-      *              uncles: Array - Array of uncle hashes.
 
-      */
 
-     public function getBlockByHash($hash)
 
-     {
 
-         return $this->request('eth_getBlockByHash', [$hash]);
 
-     }
 
-     /**
 
-      * Returns information about a block by block number.
 
-      * @param string $quantity
 
-      * @param bool $allObject
 
-      * @throws \Exception
 
-      * Returns: See eth_getBlockByHash
 
-      */
 
-     public function getBlockByNumber(string $quantity = Quantity::latest, bool $allObject = false)
 
-     {
 
-         return $this->request('eth_getBlockByNumber', [$quantity, $allObject]);
 
-     }
 
-     /**
 
-      * Returns the information about a transaction requested by transaction hash.
 
-      * @param $hash
 
-      * @throws \Exception
 
-      * Returns: Object - A transaction object, or null when no transaction was found:
 
-      *          blockHash: DATA, 32 Bytes - hash of the block where this transaction was in. null when its pending.
 
-      *          blockNumber: QUANTITY - block number where this transaction was in. null when its pending.
 
-      *          from: DATA, 20 Bytes - address of the sender.
 
-      *          gas: QUANTITY - gas provided by the sender.
 
-      *          gasPrice: QUANTITY - gas price provided by the sender in Wei.
 
-      *          hash: DATA, 32 Bytes - hash of the transaction.
 
-      *          input: DATA - the data send along with the transaction.
 
-      *          nonce: QUANTITY - the number of transactions made by the sender prior to this one.
 
-      *          to: DATA, 20 Bytes - address of the receiver. null when its a contract creation transaction.
 
-      *          transactionIndex: QUANTITY - integer of the transactions index position in the block. null when its pending.
 
-      *          value: QUANTITY - value transferred in Wei.
 
-      *          v: QUANTITY - ECDSA recovery id
 
-      *          r: DATA, 32 Bytes - ECDSA signature r
 
-      *          s: DATA, 32 Bytes - ECDSA signature s
 
-      */
 
-     public function getTransactionByHash($hash)
 
-     {
 
-         return $this->request('eth_getTransactionByHash', [$hash]);
 
-     }
 
-     /**
 
-      * Returns information about a transaction by block hash and transaction index position.
 
-      * @param $hash
 
-      * @param int $index
 
-      * @throws \Exception
 
-      * Returns: See eth_getTransactionByHash
 
-      */
 
-     public function getTransactionByBlockHashAndIndex($hash, int $index = 0)
 
-     {
 
-         return $this->request('eth_getTransactionByBlockHashAndIndex', [$hash, $index]);
 
-     }
 
-     /**
 
-      * Returns information about a transaction by block number and transaction index position.
 
-      * @param string $quantity
 
-      * @param int $index
 
-      * @throws \Exception
 
-      * Returns: See eth_getTransactionByHash
 
-      */
 
-     public function getTransactionByBlockNumberAndIndex(string $quantity = Quantity::latest, int $index = 0)
 
-     {
 
-         return $this->request('eth_getTransactionByBlockNumberAndIndex', [$quantity, $index]);
 
-     }
 
-     /**
 
-      * Returns the receipt of a transaction by transaction hash.
 
-      * Note That the receipt is not available for pending transactions.
 
-      * @param $hash
 
-      * @throws \Exception
 
-      * Returns: Object - A transaction receipt object, or null when no receipt was found:
 
-      *              transactionHash : DATA, 32 Bytes - hash of the transaction.
 
-      *              transactionIndex: QUANTITY - integer of the transactions index position in the block.
 
-      *              blockHash: DATA, 32 Bytes - hash of the block where this transaction was in.
 
-      *              blockNumber: QUANTITY - block number where this transaction was in.
 
-      *              from: DATA, 20 Bytes - address of the sender.
 
-      *              to: DATA, 20 Bytes - address of the receiver. null when its a contract creation transaction.
 
-      *              cumulativeGasUsed : QUANTITY  - The total amount of gas used when this transaction was executed in the block.
 
-      *              gasUsed : QUANTITY  - The amount of gas used by this specific transaction alone.
 
-      *              contractAddress : DATA, 20 Bytes - The contract address created, if the transaction was a contract creation, otherwise null.
 
-      *              logs: Array - Array of log objects, which this transaction generated.
 
-      *              logsBloom: DATA, 256 Bytes - Bloom filter for light clients to quickly retrieve related logs.
 
-      *          It also returns either :
 
-      *              root : DATA 32 bytes of post-transaction stateroot (pre Byzantium)
 
-      *              status: QUANTITY either 1 (success) or 0 (failure)
 
-      */
 
-     public function getTransactionReceipt($hash)
 
-     {
 
-         return $this->request('eth_getTransactionReceipt', [$hash]);
 
-     }
 
-     /**
 
-      * Returns information about a uncle of a block by hash and uncle index position.
 
-      * @param $hash
 
-      * @param int $index
 
-      * @throws \Exception
 
-      * Returns: See eth_getBlockByHash
 
-      */
 
-     public function getUncleByBlockHashAndIndex($hash, int $index = 0)
 
-     {
 
-         return $this->request('eth_getUncleByBlockHashAndIndex', [$hash, $index]);
 
-     }
 
-     /**
 
-      * Returns information about a uncle of a block by number and uncle index position.
 
-      * @param string $quantity
 
-      * @param int $index
 
-      * @throws \Exception
 
-      * Returns: See eth_getBlockByHash
 
-      *          Note: An uncle doesn’t contain individual transactions.
 
-      */
 
-     public function getUncleByBlockNumberAndIndex(string $quantity = Quantity::latest, int $index = 0)
 
-     {
 
-         return $this->request('eth_getUncleByBlockNumberAndIndex', [$quantity, $index]);
 
-     }
 
-     /**
 
-      * Returns a list of available compilers in the client.
 
-      * @throws \Exception
 
-      * Returns: Array - Array of available compilers.
 
-      */
 
-     public function getCompilers()
 
-     {
 
-         return $this->request('eth_getCompilers', []);
 
-     }
 
-     /**
 
-      * Returns compiled solidity code.
 
-      * @param $source
 
-      * @throws \Exception
 
-      * Returns: DATA - The compiled source code.
 
-      */
 
-     public function compileSolidity($source)
 
-     {
 
-         return $this->request('eth_compileSolidity', [$source]);
 
-     }
 
-     /**
 
-      * Returns compiled LLL code.
 
-      * @param $source
 
-      * @throws \Exception
 
-      * Returns: DATA - The compiled source code.
 
-      */
 
-     public function compileLLL($source)
 
-     {
 
-         return $this->request('eth_compileLLL', [$source]);
 
-     }
 
-     /**
 
-      * Returns compiled serpent code.
 
-      * @param $source
 
-      * @throws \Exception
 
-      * Returns: DATA - The compiled source code.
 
-      */
 
-     public function compileSerpent($source)
 
-     {
 
-         return $this->request('eth_compileSerpent', [$source]);
 
-     }
 
-     /**
 
-      * Creates a filter object, based on filter options, to notify when the state changes (logs).
 
-      * To check if the state has changed, call eth_getFilterChanges.
 
-      *
 
-      * A note on specifying topic filters:
 
-      * Topics are order-dependent. A transaction with a log with topics [A, B] will be matched by the following topic filters:
 
-      *      [] “anything”
 
-      *      [A] “A in first position (and anything after)”
 
-      *      [null, B] “anything in first position AND B in second position (and anything after)”
 
-      *      [A, B] “A in first position AND B in second position (and anything after)”
 
-      *      [[A, B], [A, B]] “(A OR B) in first position AND (A OR B) in second position (and anything after)”
 
-      *
 
-      * @param $fromBlock
 
-      * @param $toBlock
 
-      * @param $address
 
-      * @param $topic
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - A filter id.
 
-      */
 
-     public function newFilter($fromBlock = null, $toBlock = null, $address = null, $topic = [])
 
-     {
 
-         $data = $this->getData($fromBlock, $toBlock, $address, $topic);
 
-         return $this->request('eth_newFilter', [$data]);
 
-     }
 
-     /**
 
-      * Creates a filter in the node, to notify when a new block arrives.To check if the state has changed, call eth_getFilterChanges.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - A filter id.
 
-      */
 
-     public function newBlockFilter()
 
-     {
 
-         return $this->request('eth_newBlockFilter', []);
 
-     }
 
-     /**
 
-      * Creates a filter in the node, to notify when new pending transactions arrive.To check if the state has changed, call eth_getFilterChanges.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - A filter id.
 
-      */
 
-     public function newPendingTransactionFilter()
 
-     {
 
-         return $this->request('eth_newPendingTransactionFilter', []);
 
-     }
 
-     /**
 
-      * Uninstalls a filter with given id. Should always be called when watch is no longer needed.
 
-      * Additonally Filters timeout when they aren’t requested with eth_getFilterChanges for a period of time.
 
-      * @param $filterNumber
 
-      * @throws \Exception
 
-      * Returns: Boolean - true if the filter was successfully uninstalled, otherwise false.
 
-      */
 
-     public function uninstallFilter($filterNumber)
 
-     {
 
-         return $this->request('eth_uninstallFilter', [$filterNumber]);
 
-     }
 
-     /**
 
-      * Polling method for a filter, which returns an array of logs which occurred since last poll.
 
-      * @param $filterNumber
 
-      * @throws \Exception
 
-      * Returns: Array - Array of log objects, or an empty array if nothing has changed since last poll.
 
-      *          For filters created with eth_newBlockFilter the return are block hashes (DATA, 32 Bytes), e.g. ["0x3454645634534..."].
 
-      *          For filters created with eth_newPendingTransactionFilter  the return are transaction hashes (DATA, 32 Bytes), e.g. ["0x6345343454645..."].
 
-      *          For filters created with eth_newFilter logs are objects with following params:
 
-      *          removed: TAG - true when the log was removed, due to a chain reorganization. false if its a valid log.
 
-      *          logIndex: QUANTITY - integer of the log index position in the block. null when its pending log.
 
-      *          transactionIndex: QUANTITY - integer of the transactions index position log was created from. null when its pending log.
 
-      *          transactionHash: DATA, 32 Bytes - hash of the transactions this log was created from. null when its pending log.
 
-      *          blockHash: DATA, 32 Bytes - hash of the block where this log was in. null when its pending. null when its pending log.
 
-      *          blockNumber: QUANTITY - the block number where this log was in. null when its pending. null when its pending log.
 
-      *          address: DATA, 20 Bytes - address from which this log originated.
 
-      *          data: DATA - contains one or more 32 Bytes non-indexed arguments of the log.
 
-      *          topics: Array of DATA - Array of 0 to 4 32 Bytes DATA of indexed log arguments.
 
-      *          (In solidity: The first topic is the hash of the signature of the event (e.g. Deposit(address,bytes32,uint256)), except you declared the event with the anonymous specifier.)
 
-      */
 
-     public function getFilterChanges($filterNumber)
 
-     {
 
-         return $this->request('eth_getFilterChanges', [$filterNumber]);
 
-     }
 
-     /**
 
-      * Returns an array of all logs matching filter with given id.
 
-      * @param $filterNumber
 
-      * @throws \Exception
 
-      * Returns: See eth_getFilterChanges
 
-      */
 
-     public function getFilterLogs($filterNumber)
 
-     {
 
-         return $this->request('eth_getFilterLogs', [$filterNumber]);
 
-     }
 
-     /**
 
-      * Returns an array of all logs matching a given filter object.
 
-      * @param $fromBlock
 
-      * @param $toBlock
 
-      * @param $address
 
-      * @param $topic
 
-      * @throws \Exception
 
-      * Returns: See eth_getFilterChanges
 
-      */
 
-     public function getLogs(string $fromBlock = null, string $toBlock = null, $address = null, $topic = [])
 
-     {
 
-         $data = $this->getData($fromBlock, $toBlock, $address, $topic);
 
-         return $this->request('eth_getLogs', [$data]);
 
-     }
 
-     /**
 
-      * Returns the hash of the current block, the seedHash, and the boundary condition to be met (“target”).
 
-      * @throws \Exception
 
-      * Returns: Array - Array with the following properties:
 
-      *              DATA, 32 Bytes - current block header pow-hash
 
-      *              DATA, 32 Bytes - the seed hash used for the DAG.
 
-      *              DATA, 32 Bytes - the boundary condition (“target”), 2^256 / difficulty.
 
-      */
 
-     public function getWork()
 
-     {
 
-         return $this->request('eth_getWork', []);
 
-     }
 
-     /**
 
-      * Used for submitting a proof-of-work solution.
 
-      * @param $data1
 
-      * @param $data2
 
-      * @param $data3
 
-      * @throws \Exception
 
-      * Returns: Boolean - returns true if the provided solution is valid, otherwise false.
 
-      */
 
-     public function submitWork($data1, $data2, $data3)
 
-     {
 
-         return $this->request('eth_submitWork', [$data1, $data2 . $data3]);
 
-     }
 
-     /**
 
-      * Used for submitting mining hashrate.
 
-      * @param $hashRate
 
-      * @param $id
 
-      * @throws \Exception
 
-      * Returns: Boolean - returns true if submitting went through succesfully and false otherwise.
 
-      */
 
-     public function submitHashrate($hashRate, $id)
 
-     {
 
-         return $this->request('eth_submitHashrate', [$hashRate, $id]);
 
-     }
 
-     /**
 
-      * Returns the number of most recent block.
 
-      * @throws \Exception
 
-      * Returns: QUANTITY - integer of the current block number the client is on.
 
-      */
 
-     public function blockNumber()
 
-     {
 
-         return $this->request('eth_blockNumber', []);
 
-     }
 
-     /**
 
-      * Returns the current whisper protocol version.
 
-      * @throws \Exception
 
-      * Returns: String - The current whisper protocol version
 
-      */
 
-     public function shhVersion()
 
-     {
 
-         return $this->request('shh_version', []);
 
-     }
 
-     /**
 
-      * Returns the current network id.
 
-      * @throws \Exception
 
-      * Returns: String - The current network id.
 
-      *              "1": Ethereum Mainnet
 
-      *              "2": Morden Testnet (deprecated)
 
-      *              "3": Ropsten Testnet
 
-      *              "4": Rinkeby Testnet
 
-      *              "42": Kovan Testnet
 
-      */
 
-     public function chainId(): int
 
-     {
 
-         return $this->netVersion();
 
-     }
 
-     public function request($method, $params = []){
 
-         $data = [
 
-             'json' => [
 
-                 'jsonrpc' => '2.0',
 
-                 'method' => $method,
 
-                 'params' => $params,
 
-                 'id' => $this->requestId++,
 
-             ]
 
-         ];
 
-         $res = $this->client->post('', $data);
 
-         $body = json_decode($res->getBody());
 
-         if (isset($body->error) && !empty($body->error)) {
 
-             return ['code'=>400,'msg'=>$body->error->message . " [Method] {$method}"];
 
-             throw new \Exception($body->error->message . " [Method] {$method}", $body->error->code);
 
-         }
 
-         return $body->result;
 
-     }
 
-     /**
 
-      * @param $fromBlock
 
-      * @param $toBlock
 
-      * @param $address
 
-      * @param $topic
 
-      * @return array
 
-      */
 
-     private function getData($fromBlock, $toBlock, $address, $topic): array
 
-     {
 
-         $data = [];
 
-         if (!empty($fromBlock)) {
 
-             $data['fromBlock'] = $fromBlock;
 
-         }else{
 
-             $data['fromBlock'] ="0x0";
 
-         }
 
-         if (!empty($toBlock)) {
 
-             $data['toBlock'] = $toBlock;
 
-         }
 
-         if (!empty($address)) {
 
-             $data['address'] = $address;
 
-         }
 
-         if (!empty($topic)) {
 
-             $data['topic'] = $topic;
 
-         }
 
-         return $data;
 
-     }
 
- }
 
 
  |