diff --git a/.gitignore b/.gitignore
index c422267..76b8c52 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,9 @@
composer.phar
/vendor/
+.idea/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
-# composer.lock
+composer.lock
+
+build-docs/
diff --git a/README.md b/README.md
index 553ff5d..924563c 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,43 @@
# cardano-php-api
-A open-source project to allow users to connect to the Cardano API using PHP.
+An open-source project to allow users to connect to the Cardano API using PHP. There will be two APIs included in this Wrapper:
+- Explorer Wrapper - Wrapper for the [Cardano Explorer API](https://cardanodocs.com/technical/explorer/api/).
+- (Upcoming) Cardano-SL Wallet API Wrapper - Wrapper for the [Cardano SL Wallet Backend](https://cardanodocs.com/technical/wallet-backend/).
+
+## Installation
+
+Install with composer:
+
+```bash
+composer require codybutz/cardano-php-api
+```
+
+## Usage
+
+This package contains two components: Explorer Wrapper and Cardano-SL Wallet API Wrapper.
+
+### Using the Explorer API
+
+```php
+getAddressSummary('DdzFF...'); // Returns an AddressSummary object.
+```
+
+### Using the Wrapper API
+
+TODO
+
+## Run tests
+
+Invoke the test runner as follows:
+
+ phpunit
+
+## License
+
+This code is licensed under the MIT License
+
+## Submitting bugs and feature requests
+
+If any problems are found please email me at codyjbutz@gmail.com or submit an issue to this repository.
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..3eece84
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,31 @@
+{
+ "name": "codybutz/cardano-php-api",
+ "version": "0.0.1",
+ "description": "An open-source project to allow users to connect to the Cardano API using PHP.",
+ "authors": [
+ {
+ "name": "Cody Butz",
+ "email": "codyjbutz@gmail.com"
+ }
+ ],
+ "require": {
+ "php": "^5.6|^7.0",
+ "stephenhill/base58": "^1.1",
+ "guzzlehttp/guzzle": "^6.3",
+ "cvuorinen/phpdoc-markdown-public": "^0.2.0"
+ },
+
+ "require-dev": {
+ "phpunit/phpunit": "^7.0",
+ "evert/phpdoc-md": "^0.2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Butz\\Cardano\\": "src/",
+ "Butz\\Tests\\": "test/"
+ }
+ },
+ "scripts": {
+ "test": "./vendor/bin/phpunit"
+ }
+}
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..2958a6f
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,1567 @@
+# Cardano API
+
+## Table of Contents
+
+* [AddressNotFoundException](#addressnotfoundexception)
+* [AddressSummary](#addresssummary)
+ * [fromRequest](#fromrequest)
+ * [getAddress](#getaddress)
+ * [getType](#gettype)
+ * [getTxNum](#gettxnum)
+ * [getBalance](#getbalance)
+ * [getTxList](#gettxlist)
+ * [isRedeemed](#isredeemed)
+* [BlockEntry](#blockentry)
+ * [fromResponse](#fromresponse)
+ * [getEpoch](#getepoch)
+ * [getSlot](#getslot)
+ * [getBlockHash](#getblockhash)
+ * [getTimeIssued](#gettimeissued)
+ * [getTxNum](#gettxnum-1)
+ * [getTotalSent](#gettotalsent)
+ * [getSize](#getsize)
+ * [getBlockLead](#getblocklead)
+ * [getFees](#getfees)
+* [BlockPageSummary](#blockpagesummary)
+ * [fromResponse](#fromresponse-1)
+ * [getTotalSlots](#gettotalslots)
+ * [getEntries](#getentries)
+* [BlockSummary](#blocksummary)
+ * [fromResponse](#fromresponse-2)
+ * [getEntry](#getentry)
+ * [getPrevHash](#getprevhash)
+ * [getNextHash](#getnexthash)
+ * [getMerkleRoot](#getmerkleroot)
+* [Coin](#coin)
+ * [fromRequest](#fromrequest-1)
+ * [getCoin](#getcoin)
+* [ExplorerAPI](#explorerapi)
+ * [__construct](#__construct)
+ * [getAddressSummary](#getaddresssummary)
+ * [getBlockPages](#getblockpages)
+ * [getBlockPageTotal](#getblockpagetotal)
+ * [getBlockSummary](#getblocksummary)
+ * [getBlockTransactions](#getblocktransactions)
+ * [getGenesisAddresses](#getgenesisaddresses)
+ * [getGenesisAddressesPages](#getgenesisaddressespages)
+ * [getGenesisSummary](#getgenesissummary)
+ * [getLastTxs](#getlasttxs)
+ * [getTransactionSummary](#gettransactionsummary)
+* [ExplorerException](#explorerexception)
+* [GenesisAddressInfo](#genesisaddressinfo)
+ * [fromRequest](#fromrequest-2)
+ * [getAddress](#getaddress-1)
+ * [getAmount](#getamount)
+ * [isRedeemed](#isredeemed-1)
+* [GenesisSummary](#genesissummary)
+ * [fromRequest](#fromrequest-3)
+ * [getTotal](#gettotal)
+ * [getRedeemed](#getredeemed)
+ * [getNotRedeemed](#getnotredeemed)
+ * [getAmountRedeemed](#getamountredeemed)
+ * [getAmountNotRedeemed](#getamountnotredeemed)
+* [TransactionBrief](#transactionbrief)
+ * [fromRequest](#fromrequest-4)
+ * [getId](#getid)
+ * [getTimeIssued](#gettimeissued-1)
+ * [getInputSum](#getinputsum)
+ * [getOutputSum](#getoutputsum)
+ * [getInputs](#getinputs)
+ * [getOutputs](#getoutputs)
+* [TransactionEntry](#transactionentry)
+ * [fromRequest](#fromrequest-5)
+ * [getId](#getid-1)
+ * [getTimeIssued](#gettimeissued-2)
+ * [getAmount](#getamount-1)
+* [TransactionIO](#transactionio)
+ * [fromRequest](#fromrequest-6)
+ * [getAddress](#getaddress-2)
+ * [getCoin](#getcoin-1)
+* [TransactionSummary](#transactionsummary)
+ * [fromRequest](#fromrequest-7)
+ * [getId](#getid-2)
+ * [getTimeIssued](#gettimeissued-3)
+ * [getBlockTimeIssued](#getblocktimeissued)
+ * [getBlockHeight](#getblockheight)
+ * [getBlockEpoch](#getblockepoch)
+ * [getBlockSlot](#getblockslot)
+ * [getBlockHash](#getblockhash-1)
+ * [getRelayedBy](#getrelayedby)
+ * [getTotalInput](#gettotalinput)
+ * [getTotalOutput](#gettotaloutput)
+ * [getFees](#getfees-1)
+ * [getInputs](#getinputs-1)
+ * [getOutputs](#getoutputs-1)
+
+## AddressNotFoundException
+
+Class AddressNotFoundException
+
+
+
+* Full name: \Butz\Cardano\Explorer\Exceptions\AddressNotFoundException
+* Parent class: \Butz\Cardano\Explorer\Exceptions\ExplorerException
+
+
+## AddressSummary
+
+Class AddressSummary
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\AddressSummary
+
+
+### fromRequest
+
+Transforms the API response into an AddressSummary.
+
+```php
+AddressSummary::fromRequest( $data ): \Butz\Cardano\Explorer\Models\AddressSummary
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getAddress
+
+The address
+
+```php
+AddressSummary::getAddress( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getType
+
+The type
+
+```php
+AddressSummary::getType( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTxNum
+
+The transaction number
+
+```php
+AddressSummary::getTxNum( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBalance
+
+The balance
+
+```php
+AddressSummary::getBalance( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getTxList
+
+The transaction list.
+
+```php
+AddressSummary::getTxList( ): array
+```
+
+
+
+
+
+
+
+---
+
+### isRedeemed
+
+Is redeemed?
+
+```php
+AddressSummary::isRedeemed( ): boolean
+```
+
+
+
+
+
+
+
+---
+
+## BlockEntry
+
+Class BlockEntry
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\BlockEntry
+
+
+### fromResponse
+
+Takes an API response and transforms into a BlockEntry.
+
+```php
+BlockEntry::fromResponse( $data ): \Butz\Cardano\Explorer\Models\BlockEntry
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getEpoch
+
+The epoch
+
+```php
+BlockEntry::getEpoch( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getSlot
+
+The slot
+
+```php
+BlockEntry::getSlot( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockHash
+
+The block hash
+
+```php
+BlockEntry::getBlockHash( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTimeIssued
+
+The time issued
+
+```php
+BlockEntry::getTimeIssued( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getTxNum
+
+The transaction number
+
+```php
+BlockEntry::getTxNum( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getTotalSent
+
+The total sent
+
+```php
+BlockEntry::getTotalSent( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getSize
+
+The size of the block
+
+```php
+BlockEntry::getSize( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockLead
+
+The block leader
+
+```php
+BlockEntry::getBlockLead( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getFees
+
+The fees
+
+```php
+BlockEntry::getFees( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+## BlockPageSummary
+
+Class BlockPageSummary
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\BlockPageSummary
+
+
+### fromResponse
+
+Transforms an API response into a BlockPageSummary.
+
+```php
+BlockPageSummary::fromResponse( $data ): \Butz\Cardano\Explorer\Models\BlockPageSummary
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getTotalSlots
+
+The total slots
+
+```php
+BlockPageSummary::getTotalSlots( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getEntries
+
+The entries
+
+```php
+BlockPageSummary::getEntries( ): array
+```
+
+
+
+
+
+
+
+---
+
+## BlockSummary
+
+Class BlockSummary
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\BlockSummary
+
+
+### fromResponse
+
+Build a BlockSummary from the API.
+
+```php
+BlockSummary::fromResponse( $data ): \Butz\Cardano\Explorer\Models\BlockSummary
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getEntry
+
+Gets associated BlockEntry to this summary.
+
+```php
+BlockSummary::getEntry( ): \Butz\Cardano\Explorer\Models\BlockEntry
+```
+
+
+
+
+
+
+
+---
+
+### getPrevHash
+
+Retrieves the previous hash to this block.
+
+```php
+BlockSummary::getPrevHash( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getNextHash
+
+Retrieves the next hash to this block
+
+```php
+BlockSummary::getNextHash( ): string|null
+```
+
+
+
+
+
+
+
+---
+
+### getMerkleRoot
+
+Gets the root node in the merkle tree.
+
+```php
+BlockSummary::getMerkleRoot( ): string
+```
+
+
+
+
+
+
+
+---
+
+## Coin
+
+Class Coin
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\Coin
+
+
+### fromRequest
+
+Takes an object from a response and translates into a Coin Object.
+
+```php
+Coin::fromRequest( $data ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getCoin
+
+The coin
+
+```php
+Coin::getCoin( ): string
+```
+
+
+
+
+
+
+
+---
+
+## ExplorerAPI
+
+Class ExplorerAPI
+
+
+
+* Full name: \Butz\Cardano\Explorer\ExplorerAPI
+
+
+### __construct
+
+ExplorerAPI constructor.
+
+```php
+ExplorerAPI::__construct( \GuzzleHttp\HandlerStack|null $handler = null )
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$handler` | **\GuzzleHttp\HandlerStack|null** | |
+
+
+
+
+---
+
+### getAddressSummary
+
+Get summary information about an address.
+
+```php
+ExplorerAPI::getAddressSummary( $address ): \Butz\Cardano\Explorer\Models\AddressSummary
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$address` | **** | |
+
+
+
+
+---
+
+### getBlockPages
+
+Get summary info from a block page.
+
+```php
+ExplorerAPI::getBlockPages( integer $page = 1, integer $pageSize = 10 ): \Butz\Cardano\Explorer\Models\BlockPageSummary
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$page` | **integer** | |
+| `$pageSize` | **integer** | |
+
+
+
+
+---
+
+### getBlockPageTotal
+
+Get total blocks.
+
+```php
+ExplorerAPI::getBlockPageTotal( integer $pageSize = 10 ): integer
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$pageSize` | **integer** | |
+
+
+
+
+---
+
+### getBlockSummary
+
+Get summary information about an block.
+
+```php
+ExplorerAPI::getBlockSummary( $hash ): \Butz\Cardano\Explorer\Models\BlockSummary
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$hash` | **** | |
+
+
+
+
+---
+
+### getBlockTransactions
+
+Get transactions that took place during an block.
+
+```php
+ExplorerAPI::getBlockTransactions( $hash ): array
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$hash` | **** | |
+
+
+
+
+---
+
+### getGenesisAddresses
+
+Get all genesis addresses.
+
+```php
+ExplorerAPI::getGenesisAddresses( integer $page = 1, integer $pageSize = 15, string $filter = 'all' ): array
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$page` | **integer** | |
+| `$pageSize` | **integer** | |
+| `$filter` | **string** | |
+
+
+
+
+---
+
+### getGenesisAddressesPages
+
+Get the number of pages for a particular genesis address query.
+
+```php
+ExplorerAPI::getGenesisAddressesPages( integer $pageSize = 15, string $filter = 'all' ): integer
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$pageSize` | **integer** | |
+| `$filter` | **string** | |
+
+
+
+
+---
+
+### getGenesisSummary
+
+Gets the summary of the Genesis Addresses.
+
+```php
+ExplorerAPI::getGenesisSummary( ): \Butz\Cardano\Explorer\Models\GenesisSummary
+```
+
+
+
+
+
+
+
+---
+
+### getLastTxs
+
+Get information about the N latest transactions.
+
+```php
+ExplorerAPI::getLastTxs( ): array
+```
+
+
+
+
+
+
+
+---
+
+### getTransactionSummary
+
+Get information about the N latest transactions.
+
+```php
+ExplorerAPI::getTransactionSummary( $txid ): \Butz\Cardano\Explorer\Models\TransactionSummary
+```
+
+
+
+
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$txid` | **** | |
+
+
+
+
+---
+
+## ExplorerException
+
+Class ExplorerException
+
+
+
+* Full name: \Butz\Cardano\Explorer\Exceptions\ExplorerException
+* Parent class:
+
+
+## GenesisAddressInfo
+
+Class GenesisAddressInfo
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\GenesisAddressInfo
+
+
+### fromRequest
+
+Takes an object from a response and translates into a Coin Object.
+
+```php
+GenesisAddressInfo::fromRequest( $data ): \Butz\Cardano\Explorer\Models\GenesisAddressInfo
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getAddress
+
+The address
+
+```php
+GenesisAddressInfo::getAddress( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getAmount
+
+The amount
+
+```php
+GenesisAddressInfo::getAmount( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### isRedeemed
+
+Is redeemed?
+
+```php
+GenesisAddressInfo::isRedeemed( ): boolean
+```
+
+
+
+
+
+
+
+---
+
+## GenesisSummary
+
+Class GenesisSummary
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\GenesisSummary
+
+
+### fromRequest
+
+Transforms an API response to a Genesis Summary
+
+```php
+GenesisSummary::fromRequest( $data ): \Butz\Cardano\Explorer\Models\GenesisSummary
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getTotal
+
+The total
+
+```php
+GenesisSummary::getTotal( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getRedeemed
+
+The redeemed address count
+
+```php
+GenesisSummary::getRedeemed( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getNotRedeemed
+
+The not redeemed address count
+
+```php
+GenesisSummary::getNotRedeemed( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getAmountRedeemed
+
+The amount redeemed
+
+```php
+GenesisSummary::getAmountRedeemed( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getAmountNotRedeemed
+
+The amount not redeemed.
+
+```php
+GenesisSummary::getAmountNotRedeemed( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+## TransactionBrief
+
+Class TransactionBrief
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\TransactionBrief
+
+
+### fromRequest
+
+Takes an object from a response and translates into a TransactionBrief Object.
+
+```php
+TransactionBrief::fromRequest( $data ): \Butz\Cardano\Explorer\Models\TransactionBrief
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getId
+
+The tx id
+
+```php
+TransactionBrief::getId( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTimeIssued
+
+The time issued
+
+```php
+TransactionBrief::getTimeIssued( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getInputSum
+
+The input sum
+
+```php
+TransactionBrief::getInputSum( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getOutputSum
+
+The output sum
+
+```php
+TransactionBrief::getOutputSum( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getInputs
+
+The inputs
+
+```php
+TransactionBrief::getInputs( ): array
+```
+
+
+
+
+
+
+
+---
+
+### getOutputs
+
+The outputs
+
+```php
+TransactionBrief::getOutputs( ): array
+```
+
+
+
+
+
+
+
+---
+
+## TransactionEntry
+
+Class TransactionEntry
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\TransactionEntry
+
+
+### fromRequest
+
+Takes an object from a response and translates into a TransactionEntry Object.
+
+```php
+TransactionEntry::fromRequest( $data ): \Butz\Cardano\Explorer\Models\TransactionEntry
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getId
+
+The id
+
+```php
+TransactionEntry::getId( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTimeIssued
+
+The time issued
+
+```php
+TransactionEntry::getTimeIssued( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getAmount
+
+The amount
+
+```php
+TransactionEntry::getAmount( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+## TransactionIO
+
+Class TransactionIO
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\TransactionIO
+
+
+### fromRequest
+
+Takes an object from a response and translates into a Coin Object.
+
+```php
+TransactionIO::fromRequest( $data ): \Butz\Cardano\Explorer\Models\TransactionIO
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getAddress
+
+The address
+
+```php
+TransactionIO::getAddress( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getCoin
+
+The coin
+
+```php
+TransactionIO::getCoin( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+## TransactionSummary
+
+Class TransactionSummary
+
+
+
+* Full name: \Butz\Cardano\Explorer\Models\TransactionSummary
+
+
+### fromRequest
+
+Takes an object from a response and translates into a TransactionSummary Object.
+
+```php
+TransactionSummary::fromRequest( $data ): \Butz\Cardano\Explorer\Models\TransactionSummary
+```
+
+
+
+* This method is **static**.
+**Parameters:**
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `$data` | **** | |
+
+
+
+
+---
+
+### getId
+
+The id
+
+```php
+TransactionSummary::getId( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTimeIssued
+
+Get time issued.
+
+```php
+TransactionSummary::getTimeIssued( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockTimeIssued
+
+The block time issued
+
+```php
+TransactionSummary::getBlockTimeIssued( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockHeight
+
+The block height
+
+```php
+TransactionSummary::getBlockHeight( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockEpoch
+
+The block epoch
+
+```php
+TransactionSummary::getBlockEpoch( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockSlot
+
+The block slot
+
+```php
+TransactionSummary::getBlockSlot( ): integer
+```
+
+
+
+
+
+
+
+---
+
+### getBlockHash
+
+The block hash
+
+```php
+TransactionSummary::getBlockHash( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getRelayedBy
+
+The relayed bby network address
+
+```php
+TransactionSummary::getRelayedBy( ): string
+```
+
+
+
+
+
+
+
+---
+
+### getTotalInput
+
+The total input
+
+```php
+TransactionSummary::getTotalInput( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getTotalOutput
+
+The total output
+
+```php
+TransactionSummary::getTotalOutput( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getFees
+
+The fees
+
+```php
+TransactionSummary::getFees( ): \Butz\Cardano\Explorer\Models\Coin
+```
+
+
+
+
+
+
+
+---
+
+### getInputs
+
+The inputs
+
+```php
+TransactionSummary::getInputs( ): array
+```
+
+
+
+
+
+
+
+---
+
+### getOutputs
+
+The outputs
+
+```php
+TransactionSummary::getOutputs( ): array
+```
+
+
+
+
+
+
+
+---
+
+
+
+--------
+> This document was automatically generated from source code comments on 2018-04-22 using [phpDocumentor](http://www.phpdoc.org/) and [cvuorinen/phpdoc-markdown-public](https://github.com/cvuorinen/phpdoc-markdown-public)
diff --git a/phpdoc.xml b/phpdoc.xml
new file mode 100644
index 0000000..8b93db5
--- /dev/null
+++ b/phpdoc.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ Cardano API
+
+ build-docs
+
+
+ docs
+
+
+
+
+
+ src
+ test/*
+
+
\ No newline at end of file
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..b641d65
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ ./test/Cardano/Explorer/
+
+
+
\ No newline at end of file
diff --git a/src/Explorer/Exceptions/AddressNotFoundException.php b/src/Explorer/Exceptions/AddressNotFoundException.php
new file mode 100644
index 0000000..bb2921e
--- /dev/null
+++ b/src/Explorer/Exceptions/AddressNotFoundException.php
@@ -0,0 +1,33 @@
+client = new Client([
+ // Base URI is the public Cardano Explorer API.
+ 'base_uri' => self::$baseUri,
+ // 2.5 second timeout on request
+ 'timeout' => 2.5,
+ // Handler
+ 'handler' => $handler
+ ]);
+ }
+
+ /**
+ * Get summary information about an address.
+ *
+ * @param $address
+ * @return AddressSummary
+ * @throws ExplorerException
+ * @throws AddressNotFoundException
+ */
+ public function getAddressSummary($address)
+ {
+ if (empty($address)) {
+ throw new AddressNotFoundException("Address cannot be blank.");
+ }
+
+ $data = $this->getExplorer('addresses/summary/' . $address);
+
+
+ return AddressSummary::fromRequest($data->Right);
+ }
+
+ /**
+ * Extends the functionality of `get` by adding exception handling.
+ *
+ * @param $url
+ * @return mixed
+ * @throws ExplorerException
+ */
+ private function getExplorer($url)
+ {
+
+ $response = $this->get($url);
+
+ $data = \GuzzleHttp\json_decode($response->getBody()->getContents());
+
+ if (isset($data->Left)) {
+ if ($data->Left == "Invalid Cardano address!") {
+ throw new AddressNotFoundException("Address was not found.");
+ }
+
+ throw new ExplorerException($data->Left);
+ }
+
+
+ return $data;
+ }
+
+ /**
+ * Sends an HTTP request to the Cardano Explorer API.
+ *
+ * @param $uri string The API to call.
+ * @return \Psr\Http\Message\ResponseInterface
+ * @throws ExplorerException
+ */
+ private function get($uri)
+ {
+ $response = $this->client->get($uri);
+
+ if ($response->getStatusCode() != 200) {
+ throw new ExplorerException("Invalid HTTP Response returned (" . $response->getStatusCode() . ").");
+ }
+
+ $data = \GuzzleHttp\json_decode($response->getBody()->getContents());
+
+ if (!isset($data->Left) && !isset($data->Right)) {
+ throw new ExplorerException("Invalid Data returned, invalid JSON object returned.");
+ }
+
+ $response->getBody()->rewind();
+
+ return $response;
+ }
+
+ /**
+ * Get summary info from a block page.
+ *
+ * @param int $page
+ * @param int $pageSize
+ * @return BlockPageSummary
+ * @throws ExplorerException
+ */
+ public function getBlockPages($page = 1, $pageSize = 10)
+ {
+ $query = build_query([
+ 'page' => $page,
+ 'pageSize' => $pageSize
+ ]);
+
+ $data = $this->getExplorer('addresses/address/blocks?' . $query);
+
+ return BlockPageSummary::fromResponse($data->Right);
+ }
+
+ /**
+ * Get total blocks.
+ *
+ * @param int $pageSize
+ * @return integer
+ * @throws ExplorerException
+ */
+ public function getBlockPageTotal($pageSize = 10)
+ {
+ $query = build_query([
+ 'pageSize' => $pageSize
+ ]);
+
+ $data = $this->getExplorer('addresses/address/blocks/total?' . $query);
+
+ return $data->Right;
+ }
+
+ /**
+ * Get summary information about an block.
+ *
+ * @param $hash
+ * @return BlockSummary
+ * @throws ExplorerException
+ */
+ public function getBlockSummary($hash)
+ {
+ $data = $this->getExplorer('blocks/summary/' . $hash);
+
+ return BlockSummary::fromResponse($data->Right);
+ }
+
+ /**
+ * Get transactions that took place during an block.
+ *
+ * @param $hash
+ * @return array
+ * @throws ExplorerException
+ */
+ public function getBlockTransactions($hash)
+ {
+ $data = $this->getExplorer('blocks/txs/' . $hash);
+
+ $results = [];
+
+ foreach ($data->Right as $transaction) {
+ $results[] = TransactionBrief::fromRequest($transaction);
+ }
+
+ return $results;
+ }
+
+ /**
+ * Get all genesis addresses.
+ *
+ * @param int $page
+ * @param int $pageSize
+ * @param string $filter
+ *
+ * @return array
+ * @throws ExplorerException
+ */
+ public function getGenesisAddresses($page = 1, $pageSize = 15, $filter = 'all')
+ {
+ if (!in_array($filter, $this->addressFilters)) {
+ throw new ExplorerException('Invalid filter given. Must be in: ' . implode(', ', $this->addressFilters));
+ }
+
+ $query = build_query([
+ 'page' => $page,
+ 'pageSize' => $pageSize,
+ 'filter' => $filter
+ ]);
+
+ $data = $this->getExplorer('genesis/address?' . $query);
+
+ $results = [];
+
+ foreach ($data->Right as $address) {
+ $results[] = GenesisAddressInfo::fromRequest($address);
+ }
+
+ return $results;
+ }
+
+ /**
+ * Get the number of pages for a particular genesis address query.
+ *
+ * @param int $pageSize
+ * @param string $filter
+ *
+ * @return integer
+ * @throws ExplorerException
+ */
+ public function getGenesisAddressesPages($pageSize = 15, $filter = 'all')
+ {
+ if (!in_array($filter, $this->addressFilters)) {
+ throw new ExplorerException('Invalid filter given. Must be in: ' . implode(', ', $this->addressFilters));
+ }
+
+ $query = build_query([
+ 'pageSize' => $pageSize,
+ 'filter' => $filter
+ ]);
+
+ $data = $this->getExplorer('genesis/address/pages/total?' . $query);
+
+ return $data->Right;
+ }
+
+ /**
+ * Gets the summary of the Genesis Addresses.
+ *
+ * @return GenesisSummary
+ * @throws ExplorerException
+ */
+ public function getGenesisSummary()
+ {
+ $data = $this->getExplorer('genesis/summary');
+
+ return GenesisSummary::fromRequest($data->Right);
+ }
+
+ /**
+ * Get information about the N latest transactions.
+ *
+ * @return array
+ * @throws ExplorerException
+ */
+ public function getLastTxs()
+ {
+ $data = $this->getExplorer('txs/last');
+
+ $results = [];
+
+ foreach ($data->Right as $tx) {
+ $results[] = TransactionEntry::fromRequest($tx);
+ }
+
+ return $results;
+ }
+
+ /**
+ * Get information about a particular transaction.
+ *
+ * @param $txid
+ * @return TransactionSummary
+ * @throws ExplorerException
+ */
+ public function getTransactionSummary($txid)
+ {
+ $data = $this->getExplorer('txs/summary/' . $txid);
+
+ return TransactionSummary::fromRequest($data->Right);
+ }
+}
diff --git a/src/Explorer/Models/AddressSummary.php b/src/Explorer/Models/AddressSummary.php
new file mode 100644
index 0000000..9b18c83
--- /dev/null
+++ b/src/Explorer/Models/AddressSummary.php
@@ -0,0 +1,163 @@
+address = $data->caAddress;
+ $summary->type = $data->caType;
+ $summary->txNum = $data->caTxNum;
+ $summary->redeemed = isset($data->caIsRedeemed) ? $data->caIsRedeemed : false;
+ $summary->balance = Coin::fromRequest($data->caBalance);
+
+ foreach ($data->caTxList as $transaction) {
+ $summary->txList[] = TransactionBrief::fromRequest($transaction);
+ }
+
+ return $summary;
+ }
+
+ /**
+ * The address
+ *
+ * @return string
+ */
+ public function getAddress()
+ {
+ return $this->address;
+ }
+
+ /**
+ * The type
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * The transaction number
+ *
+ * @return int
+ */
+ public function getTxNum()
+ {
+ return $this->txNum;
+ }
+
+ /**
+ * The balance
+ *
+ * @return Coin
+ */
+ public function getBalance()
+ {
+ return $this->balance;
+ }
+
+ /**
+ * The transaction list.
+ *
+ * @return array
+ */
+ public function getTxList()
+ {
+ return $this->txList;
+ }
+
+ /**
+ * Is redeemed?
+ *
+ * @return bool
+ */
+ public function isRedeemed()
+ {
+ return $this->redeemed;
+ }
+}
diff --git a/src/Explorer/Models/BlockEntry.php b/src/Explorer/Models/BlockEntry.php
new file mode 100644
index 0000000..841e1fb
--- /dev/null
+++ b/src/Explorer/Models/BlockEntry.php
@@ -0,0 +1,215 @@
+epoch = $data->cbeEpoch;
+ $entry->slot = $data->cbeSlot;
+ $entry->blockHash = $data->cbeBlkHash;
+ $entry->timeIssued = $data->cbeTimeIssued;
+ $entry->txNum = $data->cbeTxNum;
+ $entry->totalSent = Coin::fromRequest($data->cbeTotalSent);
+ $entry->size = $data->cbeSize;
+ $entry->blockLead = $data->cbeBlockLead;
+ $entry->fees = Coin::fromRequest($data->cbeFees);
+
+ return $entry;
+ }
+
+ /**
+ * The epoch
+ *
+ * @return int
+ */
+ public function getEpoch()
+ {
+ return $this->epoch;
+ }
+
+ /**
+ * The slot
+ *
+ * @return int
+ */
+ public function getSlot()
+ {
+ return $this->slot;
+ }
+
+ /**
+ * The block hash
+ *
+ * @return string
+ */
+ public function getBlockHash()
+ {
+ return $this->blockHash;
+ }
+
+ /**
+ * The time issued
+ *
+ * @return int
+ */
+ public function getTimeIssued()
+ {
+ return $this->timeIssued;
+ }
+
+ /**
+ * The transaction number
+ *
+ * @return int
+ */
+ public function getTxNum()
+ {
+ return $this->txNum;
+ }
+
+ /**
+ * The total sent
+ *
+ * @return Coin
+ */
+ public function getTotalSent()
+ {
+ return $this->totalSent;
+ }
+
+ /**
+ * The size of the block
+ *
+ * @return int
+ */
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ /**
+ * The block leader
+ *
+ * @return string
+ */
+ public function getBlockLead()
+ {
+ return $this->blockLead;
+ }
+
+ /**
+ * The fees
+ *
+ * @return Coin
+ */
+ public function getFees()
+ {
+ return $this->fees;
+ }
+}
diff --git a/src/Explorer/Models/BlockPageSummary.php b/src/Explorer/Models/BlockPageSummary.php
new file mode 100644
index 0000000..199579f
--- /dev/null
+++ b/src/Explorer/Models/BlockPageSummary.php
@@ -0,0 +1,91 @@
+totalSlots = $data[0];
+
+ foreach ($data[1] as $entry) {
+ $summary->entries[] = BlockEntry::fromResponse($entry);
+ }
+
+ return $summary;
+ }
+
+ /**
+ * The total slots
+ *
+ * @return string
+ */
+ public function getTotalSlots()
+ {
+ return $this->totalSlots;
+ }
+
+ /**
+ * The entries
+ *
+ * @return array
+ */
+ public function getEntries()
+ {
+ return $this->entries;
+ }
+}
diff --git a/src/Explorer/Models/BlockSummary.php b/src/Explorer/Models/BlockSummary.php
new file mode 100644
index 0000000..136047e
--- /dev/null
+++ b/src/Explorer/Models/BlockSummary.php
@@ -0,0 +1,124 @@
+entry = BlockEntry::fromResponse($data->cbsEntry);
+ $summary->prevHash = $data->cbsPrevHash;
+ $summary->nextHash = $data->cbsNextHash; // Optional
+ $summary->merkleRoot = $data->cbsMerkleRoot;
+
+ return $summary;
+ }
+
+ /**
+ * Gets associated BlockEntry to this summary.
+ *
+ * @return BlockEntry
+ */
+ public function getEntry()
+ {
+ return $this->entry;
+ }
+
+ /**
+ * Retrieves the previous hash to this block.
+ *
+ * @return string
+ */
+ public function getPrevHash()
+ {
+ return $this->prevHash;
+ }
+
+ /**
+ * Retrieves the next hash to this block
+ *
+ * @return string|null
+ */
+ public function getNextHash()
+ {
+ return $this->nextHash;
+ }
+
+ /**
+ * Gets the root node in the merkle tree.
+ *
+ * @return string
+ */
+ public function getMerkleRoot()
+ {
+ return $this->merkleRoot;
+ }
+}
diff --git a/src/Explorer/Models/Coin.php b/src/Explorer/Models/Coin.php
new file mode 100644
index 0000000..8e4355f
--- /dev/null
+++ b/src/Explorer/Models/Coin.php
@@ -0,0 +1,69 @@
+coin = $data->getCoin;
+
+ return $coin;
+ }
+
+ /**
+ * The coin
+ *
+ * @return string
+ */
+ public function getCoin()
+ {
+ return $this->coin;
+ }
+}
diff --git a/src/Explorer/Models/GenesisAddressInfo.php b/src/Explorer/Models/GenesisAddressInfo.php
new file mode 100644
index 0000000..27740df
--- /dev/null
+++ b/src/Explorer/Models/GenesisAddressInfo.php
@@ -0,0 +1,100 @@
+address = $data->cgaiCardanoAddress;
+ $address->amount = Coin::fromRequest($data->cgaiGenesisAmount);
+ $address->redeemed = $data->cgaiIsRedeemed;
+
+ return $address;
+ }
+
+ /**
+ * The address
+ *
+ * @return string
+ */
+ public function getAddress()
+ {
+ return $this->address;
+ }
+
+ /**
+ * The amount
+ *
+ * @return Coin
+ */
+ public function getAmount()
+ {
+ return $this->amount;
+ }
+
+ /**
+ * Is redeemed?
+ *
+ * @return bool
+ */
+ public function isRedeemed()
+ {
+ return $this->redeemed;
+ }
+}
diff --git a/src/Explorer/Models/GenesisSummary.php b/src/Explorer/Models/GenesisSummary.php
new file mode 100644
index 0000000..9022c9b
--- /dev/null
+++ b/src/Explorer/Models/GenesisSummary.php
@@ -0,0 +1,133 @@
+total = $data->cgsNumTotal;
+ $summary->redeemed = $data->cgsNumRedeemed;
+ $summary->notRedeemed = $data->cgsNumNotRedeemed;
+ $summary->amountRedeemed = Coin::fromRequest($data->cgsRedeemedAmountTotal);
+ $summary->amountNotRedeemed = Coin::fromRequest($data->cgsNonRedeemedAmountTotal);
+
+ return $summary;
+ }
+
+ /**
+ * The total
+ *
+ * @return int
+ */
+ public function getTotal()
+ {
+ return $this->total;
+ }
+
+ /**
+ * The redeemed address count
+ *
+ * @return int
+ */
+ public function getRedeemed()
+ {
+ return $this->redeemed;
+ }
+
+ /**
+ * The not redeemed address count
+ *
+ * @return int
+ */
+ public function getNotRedeemed()
+ {
+ return $this->notRedeemed;
+ }
+
+ /**
+ * The amount redeemed
+ *
+ * @return Coin
+ */
+ public function getAmountRedeemed()
+ {
+ return $this->amountRedeemed;
+ }
+
+ /**
+ * The amount not redeemed.
+ *
+ * @return Coin
+ */
+ public function getAmountNotRedeemed()
+ {
+ return $this->amountNotRedeemed;
+ }
+}
diff --git a/src/Explorer/Models/TransactionBrief.php b/src/Explorer/Models/TransactionBrief.php
new file mode 100644
index 0000000..39f7823
--- /dev/null
+++ b/src/Explorer/Models/TransactionBrief.php
@@ -0,0 +1,165 @@
+id = $data->ctbId;
+ $transaction->timeIssued = $data->ctbTimeIssued;
+ $transaction->inputSum = Coin::fromRequest($data->ctbInputSum);
+ $transaction->outputSum = Coin::fromRequest($data->ctbOutputSum);
+
+ foreach ($data->ctbOutputs as $output) {
+ $transaction->outputs[] = TransactionIO::fromRequest($output);
+ }
+
+ foreach ($data->ctbInputs as $input) {
+ $transaction->inputs[] = TransactionIO::fromRequest($input);
+ }
+
+ return $transaction;
+ }
+
+ /**
+ * The tx id
+ *
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * The time issued
+ *
+ * @return int
+ */
+ public function getTimeIssued()
+ {
+ return $this->timeIssued;
+ }
+
+ /**
+ * The input sum
+ *
+ * @return Coin
+ */
+ public function getInputSum()
+ {
+ return $this->inputSum;
+ }
+
+ /**
+ * The output sum
+ *
+ * @return Coin
+ */
+ public function getOutputSum()
+ {
+ return $this->outputSum;
+ }
+
+ /**
+ * The inputs
+ *
+ * @return array
+ */
+ public function getInputs()
+ {
+ return $this->inputs;
+ }
+
+ /**
+ * The outputs
+ *
+ * @return array
+ */
+ public function getOutputs()
+ {
+ return $this->outputs;
+ }
+}
diff --git a/src/Explorer/Models/TransactionEntry.php b/src/Explorer/Models/TransactionEntry.php
new file mode 100644
index 0000000..3108005
--- /dev/null
+++ b/src/Explorer/Models/TransactionEntry.php
@@ -0,0 +1,105 @@
+id = $data->cteId;
+ $transaction->timeIssued = $data->cteTimeIssued;
+ $transaction->amount = Coin::fromRequest($data->cteAmount);
+
+ return $transaction;
+ }
+
+ /**
+ * The id
+ *
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * The time issued
+ *
+ * @return int
+ */
+ public function getTimeIssued()
+ {
+ return $this->timeIssued;
+ }
+
+ /**
+ * The amount
+ *
+ * @return Coin
+ */
+ public function getAmount()
+ {
+ return $this->amount;
+ }
+}
diff --git a/src/Explorer/Models/TransactionIO.php b/src/Explorer/Models/TransactionIO.php
new file mode 100644
index 0000000..e7f20e9
--- /dev/null
+++ b/src/Explorer/Models/TransactionIO.php
@@ -0,0 +1,87 @@
+address = $data[0];
+ $io->coin = Coin::fromRequest($data[1]);
+
+ return $io;
+ }
+
+ /**
+ * The address
+ *
+ * @return string
+ */
+ public function getAddress()
+ {
+ return $this->address;
+ }
+
+ /**
+ * The coin
+ *
+ * @return Coin
+ */
+ public function getCoin()
+ {
+ return $this->coin;
+ }
+}
diff --git a/src/Explorer/Models/TransactionSummary.php b/src/Explorer/Models/TransactionSummary.php
new file mode 100644
index 0000000..62d3e7c
--- /dev/null
+++ b/src/Explorer/Models/TransactionSummary.php
@@ -0,0 +1,292 @@
+id = $data->ctsId;
+ $transaction->timeIssued = $data->ctsTxTimeIssued;
+ $transaction->blockTimeIssued = $data->ctsBlockTimeIssued;
+ $transaction->blockHeight = $data->ctsBlockHeight;
+ $transaction->blockEpoch = $data->ctsBlockEpoch;
+ $transaction->blockSlot = $data->ctsBlockSlot;
+ $transaction->blockHash = $data->ctsBlockHash;
+ $transaction->relayedBy = $data->ctsRelayedBy;
+
+ $transaction->fees = Coin::fromRequest($data->ctsFees);
+ $transaction->totalInput = Coin::fromRequest($data->ctsTotalInput);
+ $transaction->totalOutput = Coin::fromRequest($data->ctsTotalOutput);
+
+ foreach ($data->ctsOutputs as $output) {
+ $transaction->outputs[] = TransactionIO::fromRequest($output);
+ }
+
+ foreach ($data->ctsInputs as $input) {
+ $transaction->inputs[] = TransactionIO::fromRequest($input);
+ }
+
+ return $transaction;
+ }
+
+ /**
+ * The id
+ *
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Get time issued.
+ *
+ * @return int
+ */
+ public function getTimeIssued()
+ {
+ return $this->timeIssued;
+ }
+
+ /**
+ * The block time issued
+ *
+ * @return int
+ */
+ public function getBlockTimeIssued()
+ {
+ return $this->blockTimeIssued;
+ }
+
+ /**
+ * The block height
+ *
+ * @return int
+ */
+ public function getBlockHeight()
+ {
+ return $this->blockHeight;
+ }
+
+ /**
+ * The block epoch
+ *
+ * @return int
+ */
+ public function getBlockEpoch()
+ {
+ return $this->blockEpoch;
+ }
+
+ /**
+ * The block slot
+ *
+ * @return int
+ */
+ public function getBlockSlot()
+ {
+ return $this->blockSlot;
+ }
+
+ /**
+ * The block hash
+ *
+ * @return string
+ */
+ public function getBlockHash()
+ {
+ return $this->blockHash;
+ }
+
+ /**
+ * The relayed bby network address
+ *
+ * @return string
+ */
+ public function getRelayedBy()
+ {
+ return $this->relayedBy;
+ }
+
+ /**
+ * The total input
+ *
+ * @return Coin
+ */
+ public function getTotalInput()
+ {
+ return $this->totalInput;
+ }
+
+ /**
+ * The total output
+ *
+ * @return Coin
+ */
+ public function getTotalOutput()
+ {
+ return $this->totalOutput;
+ }
+
+ /**
+ * The fees
+ *
+ * @return Coin
+ */
+ public function getFees()
+ {
+ return $this->fees;
+ }
+
+ /**
+ * The inputs
+ *
+ * @return array
+ */
+ public function getInputs()
+ {
+ return $this->inputs;
+ }
+
+ /**
+ * The outputs
+ *
+ * @return array
+ */
+ public function getOutputs()
+ {
+ return $this->outputs;
+ }
+}
diff --git a/test/Cardano/Explorer/ExplorerAPITest.php b/test/Cardano/Explorer/ExplorerAPITest.php
new file mode 100644
index 0000000..cced537
--- /dev/null
+++ b/test/Cardano/Explorer/ExplorerAPITest.php
@@ -0,0 +1,554 @@
+generateRandomAddress();
+
+ $this->mock->append($this->mockSuccess('getAddressSummary-Success.json'));
+
+ // Get Response
+ $summary = $this->explorer->getAddressSummary($address);
+
+ $this->accountSummaryTest($summary);
+ }
+
+ /**
+ * @param AddressSummary $summary
+ */
+ private function accountSummaryTest(AddressSummary $summary)
+ {
+ $this->assertInstanceOf(AddressSummary::class, $summary, 'AddressSummary was expected but not returned.');
+
+ $this->assertNotNull($summary->getAddress(), 'AddressSummary->address is null');
+ $this->assertNotNull($summary->getBalance(), 'AddressSummary->balance is null');
+ $this->assertNotNull($summary->getType(), 'AddressSummary->type is null');
+ $this->assertNotNull($summary->getTxNum(), 'AddressSummary->balance is null');
+ $this->assertNotNull($summary->isRedeemed(), 'AddressSummary->redeemed is null');
+ $this->assertNotEmpty($summary->getTxList(), 'AddressSummary->txList is empty');
+
+ $this->coinTest($summary->getBalance());
+
+ foreach ($summary->getTxList() as $transaction) {
+ $this->transactionBriefTest($transaction);
+ }
+ }
+
+ /**
+ * @param Coin $coin
+ */
+ private function coinTest(Coin $coin)
+ {
+ $this->assertInstanceOf(Coin::class, $coin, 'Coin was expected but not returned.');
+
+ $this->assertNotNull($coin->getCoin());
+ }
+
+ /**
+ * @param TransactionBrief $transaction
+ */
+ private function transactionBriefTest(TransactionBrief $transaction)
+ {
+ $this->assertInstanceOf(TransactionBrief::class, $transaction, 'TransactionBrief was expected but not returned.');
+
+ $this->assertNotNull($transaction->getId(), 'Transaction->id is null');
+ $this->assertNotNull($transaction->getTimeIssued(), 'Transaction->timeIssued is null');
+ $this->assertNotNull($transaction->getInputSum(), 'Transaction->inputSum is null');
+ $this->assertNotNull($transaction->getOutputSum(), 'Transaction->outputSum is null');
+ $this->assertNotNull($transaction->getInputs(), 'Transaction->inputs is null');
+ $this->assertNotEmpty($transaction->getInputs(), 'Transaction->inputs is empty');
+ $this->assertNotNull($transaction->getOutputs(), 'Transaction->outputs is null');
+ $this->assertNotEmpty($transaction->getOutputs(), 'Transaction->outputs is empty');
+
+ $this->coinTest($transaction->getInputSum());
+ $this->coinTest($transaction->getOutputSum());
+
+ foreach ($transaction->getInputs() as $input) {
+ $this->transactionIoTest($input);
+ }
+ foreach ($transaction->getOutputs() as $output) {
+ $this->transactionIoTest($output);
+ }
+ }
+
+ /**
+ * @param TransactionIO $io
+ */
+ private function transactionIoTest(TransactionIO $io)
+ {
+ $this->assertInstanceOf(TransactionIO::class, $io, 'TransactionIO was expected but not returned.');
+
+ $this->assertNotNull($io->getAddress(), 'TransactionIO->address is null');
+ $this->assertNotNull($io->getCoin(), 'TransactionIO->coin is null');
+
+ $this->coinTest($io->getCoin());
+ }
+
+ /**
+ * Tests that when an Address Summary API Call returns a AddressNotFoundException that we retrieve an invalid address.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\AddressNotFoundException
+ * @throws AddressNotFoundException
+ * @throws ExplorerException
+ */
+ public function testAddressSummaryFailure()
+ {
+ // Generate a random address.
+ $address = $this->generateRandomAddress();
+
+ // Mock failure
+ $this->mock->append($this->mockSuccess('getAddressSummary-Failure.json'));
+
+ // Get Response
+ $this->explorer->getAddressSummary($address);
+ }
+
+ /**
+ * Tests that when an Address Summary API Call returns a AddressNotFoundException when an empty address is given.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\AddressNotFoundException
+ * @throws AddressNotFoundException
+ * @throws ExplorerException
+ */
+ public function testAddressSummaryNotFound()
+ {
+ $this->explorer->getAddressSummary('');
+ }
+
+ /**
+ * Tests that when an Block Page API Call returns a success the data is decoded properly.
+ *
+ * @throws ExplorerException
+ */
+ public function testBlockPageSizeSuccess()
+ {
+
+ $this->mock->append($this->mockSuccess('getBlockPages-Success.json'));
+
+ $response = $this->explorer->getBlockPages();
+
+ $this->blockPageSummaryTest($response);
+ }
+
+ /**
+ * @param BlockPageSummary $response
+ */
+ private function blockPageSummaryTest(BlockPageSummary $response)
+ {
+ $this->assertInstanceOf(BlockPageSummary::class, $response, 'BlockPageSummary was expected.');
+
+ $this->assertNotNull($response->getTotalSlots());
+ $this->assertNotEmpty($response->getEntries());
+
+ foreach ($response->getEntries() as $entry) {
+ $this->blockEntryTest($entry);
+ }
+ }
+
+ /**
+ * @param BlockEntry $entry
+ */
+ private function blockEntryTest(BlockEntry $entry)
+ {
+ $this->assertInstanceOf(BlockEntry::class, $entry, 'BlockEntry was expected.');
+
+ $this->assertNotNull($entry->getTimeIssued());
+ $this->assertNotNull($entry->getTxNum());
+ $this->assertNotNull($entry->getBlockHash());
+ $this->assertNotNull($entry->getBlockLead());
+ $this->assertNotNull($entry->getEpoch());
+ $this->assertNotNull($entry->getFees());
+ $this->assertNotNull($entry->getSlot());
+ $this->assertNotNull($entry->getTotalSent());
+ $this->assertNotNull($entry->getSize());
+
+ $this->coinTest($entry->getFees());
+ $this->coinTest($entry->getTotalSent());
+ }
+
+ /**
+ * Tests that when an Block Page API Call returns a success the data is decoded properly.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testBlockPageSizeFailure()
+ {
+
+ $this->mock->append($this->mockSuccess('getBlockPages-Failure.json'));
+
+ $this->explorer->getBlockPages();
+ }
+
+ /**
+ * Tests that when an Block Page Total API Call returns a success the data is decoded properly.
+ *
+ * @throws ExplorerException
+ */
+ public function testBlockPageSizeTotalSuccess()
+ {
+
+ $this->mock->append($this->mockSuccess('getBlockPagesTotal-Success.json'));
+
+ $response = $this->explorer->getBlockPageTotal();
+
+ $this->assertGreaterThan(0, $response);
+ }
+
+ /**
+ * Tests that when an Block Page Total API Call returns a success the data is decoded properly
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testBlockPageSizeTotalFailure()
+ {
+
+ $this->mock->append($this->mockSuccess('getBlockPagesTotal-Failure.json'));
+
+ $this->explorer->getBlockPageTotal();
+ }
+
+ /**
+ * Tests that when an Block Summary API Call returns a success the data is decoded properly.
+ *
+ * @throws ExplorerException
+ */
+ public function testBlockSummarySuccess()
+ {
+
+ $hash = $this->generateRandomAddress();
+
+ $this->mock->append($this->mockSuccess('getBlockSummary-Success.json'));
+
+ $response = $this->explorer->getBlockSummary($hash);
+
+ $this->blockSummaryTest($response);
+ }
+
+ /**
+ * @param BlockSummary $summary
+ */
+ private function blockSummaryTest(BlockSummary $summary)
+ {
+ $this->assertInstanceOf(BlockSummary::class, $summary, 'BlockSummary was expected');
+
+ $this->assertNotNull($summary->getEntry());
+ $this->blockEntryTest($summary->getEntry());
+ $this->assertNotNull($summary->getPrevHash());
+ $this->assertNotNull($summary->getNextHash());
+ $this->assertNotNull($summary->getMerkleRoot());
+ }
+
+ /**
+ * Tests that when an Block Summary API Call returns a failure an exception is thrown.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testBlockSummaryFailure()
+ {
+ $hash = $this->generateRandomAddress();
+
+ $this->mock->append($this->mockSuccess('getBlockSummary-Failure.json'));
+
+ $this->explorer->getBlockSummary($hash);
+ }
+
+ /**
+ * Tests that when an Block Transactions API Call returns a success we receive the correct data.
+ *
+ * @throws ExplorerException
+ */
+ public function testBlockTransactionListSuccess()
+ {
+ $hash = $this->generateRandomAddress();
+
+ $this->mock->append($this->mockSuccess('getBlockTransactions-Success.json'));
+
+ $response = $this->explorer->getBlockTransactions($hash);
+
+ foreach ($response as $transaction) {
+ $this->transactionBriefTest($transaction);
+ }
+ }
+
+ /**
+ * Tests that when an Block Transactions API Call returns a failure an exception is thrown.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testBlockTransactionListFailure()
+ {
+ $hash = $this->generateRandomAddress();
+
+ $this->mock->append($this->mockSuccess('getBlockTransactions-Failure.json'));
+
+ $this->explorer->getBlockTransactions($hash);
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressInfoSuccess()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddresses-Success.json'));
+
+ $response = $this->explorer->getGenesisAddresses();
+
+ foreach ($response as $info) {
+ $this->genesisAddressInfoTest($info);
+ }
+ }
+
+ /**
+ * @param GenesisAddressInfo $info
+ */
+ private function genesisAddressInfoTest(GenesisAddressInfo $info)
+ {
+ $this->assertInstanceOf(GenesisAddressInfo::class, $info, 'GenesisAddressInfo was expected');
+
+ $this->assertNotNull($info->getAddress());
+ $this->coinTest($info->getAmount());
+ $this->assertNotNull($info->isRedeemed());
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressInfoFailure()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddresses-Failure.json'));
+
+ $this->explorer->getGenesisAddresses();
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressInfoFilterFailure()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddresses-Failure.json'));
+
+ $this->explorer->getGenesisAddresses(5, 5, 'someinvlaidtest');
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressPagesSuccess()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddressesPages-Success.json'));
+
+ $pages = $this->explorer->getGenesisAddressesPages();
+
+ $this->assertEquals(1414, $pages);
+ }
+
+ /**
+ * Tests that when requesting pages it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressPagesFailure()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddressesPages-Failure.json'));
+
+ $this->explorer->getGenesisAddressesPages();
+ }
+
+ /**
+ * Tests that when requesting pages it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testGenesisAddressPagesFilterFailure()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisAddressesPages-Failure.json'));
+
+ $this->explorer->getGenesisAddressesPages(5, 'someinvalidvalue');
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @throws ExplorerException
+ */
+ public function testGenesisSummarySuccess()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisSummary-Success.json'));
+
+ $response = $this->explorer->getGenesisSummary();
+
+ $this->genesisSummaryTest($response);
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testGenesisSummaryFailure()
+ {
+ $this->mock->append($this->mockSuccess('getGenesisSummary-Failure.json'));
+
+ $this->explorer->getGenesisAddressesPages();
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @throws ExplorerException
+ */
+ public function testLastTransactionsSuccess()
+ {
+ $this->mock->append($this->mockSuccess('getLastTransactions-Success.json'));
+
+ $response = $this->explorer->getLastTxs();
+
+ foreach ($response as $tx) {
+ $this->transactionEntryTest($tx);
+ }
+ }
+
+ /**
+ * @param TransactionEntry $transaction
+ */
+ private function transactionEntryTest(TransactionEntry $transaction)
+ {
+ $this->assertInstanceOf(TransactionEntry::class, $transaction, 'TransactionEntry was expected but not returned.');
+
+ $this->assertNotNull($transaction->getId(), 'Transaction->id is null');
+ $this->assertNotNull($transaction->getTimeIssued(), 'Transaction->timeIssued is null');
+ $this->assertNotEmpty($transaction->getAmount(), 'Transaction->outputs is empty');
+
+ $this->coinTest($transaction->getAmount());
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testLastTransactionsFailure()
+ {
+ $this->mock->append($this->mockSuccess('getLastTransactions-Failure.json'));
+
+ $this->explorer->getLastTxs();
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @throws ExplorerException
+ */
+ public function testTransactionSummarySuccess()
+ {
+ $this->mock->append($this->mockSuccess('getTransactionSummary-Success.json'));
+
+ $response = $this->explorer->getTransactionSummary('9a8d6f4f9508abd23c3a3073df1dc3c1668977768c77abc3137b7ae831d25fea');
+
+ $this->transactionSummaryTest($response);
+ }
+
+ /**
+ * @param TransactionSummary $summary
+ */
+ private function transactionSummaryTest(TransactionSummary $summary)
+ {
+ $this->assertInstanceOf(TransactionSummary::class, $summary, 'TransactionSummary was expected');
+
+
+ $this->assertNotNull($summary->getId(), 'Transaction->id is null');
+ $this->assertNotNull($summary->getTimeIssued(), 'Transaction->timeIssued is null');
+ $this->assertNotNull($summary->getBlockEpoch());
+ $this->assertNotNull($summary->getBlockSlot());
+ $this->assertNotNull($summary->getBlockHash());
+ $this->assertNotNull($summary->getBlockTimeIssued());
+ $this->assertNotNull($summary->getFees());
+ $this->assertNotNull($summary->getTotalInput());
+ $this->assertNotNull($summary->getTotalOutput());
+ $this->assertNotNull($summary->getInputs());
+ $this->assertNotNull($summary->getOutputs());
+
+
+
+ foreach ($summary->getInputs() as $input) {
+ $this->transactionIoTest($input);
+ }
+ foreach ($summary->getOutputs() as $output) {
+ $this->transactionIoTest($output);
+ }
+ }
+
+ /**
+ * Tests that when an Genesis Address Info is generated it gets the correct response.
+ *
+ * @expectedException \Butz\Cardano\Explorer\Exceptions\ExplorerException
+ * @throws ExplorerException
+ */
+ public function testTransactionSummaryFailure()
+ {
+ $this->mock->append($this->mockSuccess('getTransactionSummary-Failure.json'));
+
+ $this->explorer->getLastTxs();
+ }
+
+ /**
+ * @param GenesisSummary $summary
+ */
+ private function genesisSummaryTest(GenesisSummary $summary)
+ {
+ $this->assertInstanceOf(GenesisSummary::class, $summary, 'GenesisSummary was expected');
+
+ $this->assertNotNull($summary->getTotal());
+ $this->assertNotNull($summary->getRedeemed());
+ $this->assertNotNull($summary->getNotRedeemed());
+
+ $this->coinTest($summary->getAmountRedeemed());
+ $this->coinTest($summary->getAmountNotRedeemed());
+ }
+}
diff --git a/test/Cardano/Explorer/ExplorerTestBase.php b/test/Cardano/Explorer/ExplorerTestBase.php
new file mode 100644
index 0000000..c2f72b0
--- /dev/null
+++ b/test/Cardano/Explorer/ExplorerTestBase.php
@@ -0,0 +1,71 @@
+encode(uniqid('cardano_address_', true));
+ }
+
+ /**
+ * Set up.
+ */
+ public function setUp()
+ {
+ $this->mock = new MockHandler();
+
+ $handler = HandlerStack::create($this->mock);
+
+ $this->explorer = new ExplorerAPI($handler);
+ }
+
+ /**
+ * Tear down.
+ */
+ public function tearDown()
+ {
+ }
+
+ /**
+ * Returns a 200 response
+ *
+ * @param $data string
+ * @return Response
+ */
+ protected function mockSuccess($filename)
+ {
+ $data = file_get_contents('test/data/' . $filename);
+
+ return new Response(200, ['Content-Type' => 'application/json;charset=utf-8'], $data);
+ }
+
+ /**
+ * @return Response
+ */
+ protected function mockNotFound()
+ {
+ return new Response(404, [], '');
+ }
+}
diff --git a/test/data/getAddressSummary-Failure.json b/test/data/getAddressSummary-Failure.json
new file mode 100644
index 0000000..74fcffc
--- /dev/null
+++ b/test/data/getAddressSummary-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "Invalid Cardano address!"
+}
\ No newline at end of file
diff --git a/test/data/getAddressSummary-Success.json b/test/data/getAddressSummary-Success.json
new file mode 100644
index 0000000..205aa4f
--- /dev/null
+++ b/test/data/getAddressSummary-Success.json
@@ -0,0 +1,76 @@
+{
+ "Right": {
+ "caAddress": "DdzFFzCqrhsvwAnGP2fP4uRJrdACxSy2SmEETm21GNa2dEQDQQeFC9BxgUMN7cZsk5zbiHvQF6DDAWigA1djCsnpFvzMDuyCEmTvmkgj",
+ "caType": "CPubKeyAddress",
+ "caTxNum": 2,
+ "caBalance": {
+ "getCoin": "0"
+ },
+ "caTxList": [
+ {
+ "ctbId": "73830040c24c777fc6174e92ef037bc755b50e90449f2bb52bdfb0fcc4b26eac",
+ "ctbTimeIssued": 1520269571,
+ "ctbInputs": [
+ [
+ "DdzFFzCqrht6ih35cCt5npY2oFHUaG3cc6HE3UJ1TD7nDQG5CzgzRxGnWVsQx4L1dKKTkFXJnTnZaBHmWC4czeDC17aQziiWLqiXhGgR",
+ {
+ "getCoin": "800000"
+ }
+ ],
+ [
+ "DdzFFzCqrhsvwAnGP2fP4uRJrdACxSy2SmEETm21GNa2dEQDQQeFC9BxgUMN7cZsk5zbiHvQF6DDAWigA1djCsnpFvzMDuyCEmTvmkgj",
+ {
+ "getCoin": "4213657382"
+ }
+ ]
+ ],
+ "ctbOutputs": [
+ [
+ "DdzFFzCqrht4CEwYzfKAgngW2dqQJEH4rzh9nYukc5YYFMu9CWyEs3pynKyPrDLeL1ZQ6EMmdJWHnWFwNSTvxdSowQJpyCrLnuydgFf3",
+ {
+ "getCoin": "4214278621"
+ }
+ ]
+ ],
+ "ctbInputSum": {
+ "getCoin": "4214457382"
+ },
+ "ctbOutputSum": {
+ "getCoin": "4214278621"
+ }
+ },
+ {
+ "ctbId": "856bc4888222f41cdcba9ca6851a1dc7d7471e6d07d977d87257e9dfd216447b",
+ "ctbTimeIssued": 1520269171,
+ "ctbInputs": [
+ [
+ "DdzFFzCqrht6WxJxeWzQDNQ9uPV7YykWd7JoK2mzd2s43xiic9KmNZxN9PvssHf6xLrb8jo9BFLbDQ9GnZeQCAAfRQF4QQFQCL1chi99",
+ {
+ "getCoin": "805067488597"
+ }
+ ]
+ ],
+ "ctbOutputs": [
+ [
+ "DdzFFzCqrhsesq8M48WY7aKN46QMc6aSxvG3zFUMxw2j4nbYxnHamMLMoHMwm45JbyyRucRPmnDBpeY5JNSNR33fqmSvip1WqVNRUTVu",
+ {
+ "getCoin": "800853660145"
+ }
+ ],
+ [
+ "DdzFFzCqrhsvwAnGP2fP4uRJrdACxSy2SmEETm21GNa2dEQDQQeFC9BxgUMN7cZsk5zbiHvQF6DDAWigA1djCsnpFvzMDuyCEmTvmkgj",
+ {
+ "getCoin": "4213657382"
+ }
+ ]
+ ],
+ "ctbInputSum": {
+ "getCoin": "805067488597"
+ },
+ "ctbOutputSum": {
+ "getCoin": "805067317527"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/test/data/getBlockPages-Failure.json b/test/data/getBlockPages-Failure.json
new file mode 100644
index 0000000..f61a5b7
--- /dev/null
+++ b/test/data/getBlockPages-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "We currently support only page size of 10."
+}
\ No newline at end of file
diff --git a/test/data/getBlockPages-Success.json b/test/data/getBlockPages-Success.json
new file mode 100644
index 0000000..4a5ec18
--- /dev/null
+++ b/test/data/getBlockPages-Success.json
@@ -0,0 +1,127 @@
+{
+ "Right": [
+ 82155,
+ [
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 842,
+ "cbeBlkHash": "798a029fa76ea520f4061cb509dd96a0b22e0be69cf9605a5123474e62004832",
+ "cbeTimeIssued": 1522635931,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 841,
+ "cbeBlkHash": "d90963d1a35eda698678d18d970e6f2e8a0c870622d95d636c86872821a3f4fd",
+ "cbeTimeIssued": 1522635911,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "5071d8802ddd05c59f4db907bd1749e82e6242caf6512b20a8368fcf",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 840,
+ "cbeBlkHash": "8cb6c672f34d22cc6815a416d5165b82202ef915c43c4d6b8e670f61f97e74b1",
+ "cbeTimeIssued": 1522635891,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 839,
+ "cbeBlkHash": "0deb99c42638bc55bb49e0fbffcb62a6ae773f2bcd55fedd5f98ffc7d85f98ae",
+ "cbeTimeIssued": 1522635871,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 838,
+ "cbeBlkHash": "9728882b7e3016324c21492f979a2d73889bbb7b1172c60853ec052ee32667d0",
+ "cbeTimeIssued": 1522635851,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 837,
+ "cbeBlkHash": "8604a40d718a54f91a8697fecf22e3e1cf677b60fe77a1a4f822749eb69f0c47",
+ "cbeTimeIssued": 1522635831,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "5411c7bf87c252609831a337a713e4859668cba7bba70a9c3ef7c398",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 836,
+ "cbeBlkHash": "0a6ab757cb782c9bf264274913fa8e3191b3fecfe3017982f2e8b2be375e4255",
+ "cbeTimeIssued": 1522635811,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "1deb82908402c7ee3efeb16f369d97fba316ee621d09b32b8969e54b",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ {
+ "cbeEpoch": 38,
+ "cbeSlot": 835,
+ "cbeBlkHash": "a97194ada4f8a2bc9ad9145e67f826b1f9f834d468cff2eb6f6599c127e5ed61",
+ "cbeTimeIssued": 1522635791,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 672,
+ "cbeBlockLead": "43011479a595b300e0726910d0b602ffcdd20466a3b8ceeacd3fbc26",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ }
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/test/data/getBlockPagesTotal-Failure.json b/test/data/getBlockPagesTotal-Failure.json
new file mode 100644
index 0000000..43dd61f
--- /dev/null
+++ b/test/data/getBlockPagesTotal-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "Unknown"
+}
\ No newline at end of file
diff --git a/test/data/getBlockPagesTotal-Success.json b/test/data/getBlockPagesTotal-Success.json
new file mode 100644
index 0000000..2815a82
--- /dev/null
+++ b/test/data/getBlockPagesTotal-Success.json
@@ -0,0 +1,3 @@
+{
+ "Right": 82169
+}
\ No newline at end of file
diff --git a/test/data/getBlockSummary-Failure.json b/test/data/getBlockSummary-Failure.json
new file mode 100644
index 0000000..26cdb0c
--- /dev/null
+++ b/test/data/getBlockSummary-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "No block found"
+}
\ No newline at end of file
diff --git a/test/data/getBlockSummary-Success.json b/test/data/getBlockSummary-Success.json
new file mode 100644
index 0000000..ee2872f
--- /dev/null
+++ b/test/data/getBlockSummary-Success.json
@@ -0,0 +1,22 @@
+{
+ "Right": {
+ "cbsEntry": {
+ "cbeEpoch": 38,
+ "cbeSlot": 21093,
+ "cbeBlkHash": "20fa54ea843d1624c2d42cd204c7466e83b1d66aeb370e472dfb29b2887b023a",
+ "cbeTimeIssued": 1523040951,
+ "cbeTxNum": 0,
+ "cbeTotalSent": {
+ "getCoin": "0"
+ },
+ "cbeSize": 669,
+ "cbeBlockLead": "65904a89e6d0e5f881513d1736945e051b76f095eca138ee869d543d",
+ "cbeFees": {
+ "getCoin": "0"
+ }
+ },
+ "cbsPrevHash": "b377a33afcaa5dbc8c3ee35b525347329313fbdd67a16147b494cebf8c8c6184",
+ "cbsNextHash": "e3b28bf74a388489315b6a7d08edd6fab784f58e3284921d5115d6b9d90ca663",
+ "cbsMerkleRoot": "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8"
+ }
+}
\ No newline at end of file
diff --git a/test/data/getBlockTransactions-Failure.json b/test/data/getBlockTransactions-Failure.json
new file mode 100644
index 0000000..26cdb0c
--- /dev/null
+++ b/test/data/getBlockTransactions-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "No block found"
+}
\ No newline at end of file
diff --git a/test/data/getBlockTransactions-Success.json b/test/data/getBlockTransactions-Success.json
new file mode 100644
index 0000000..aa60e0f
--- /dev/null
+++ b/test/data/getBlockTransactions-Success.json
@@ -0,0 +1,36 @@
+{
+ "Right": [
+ {
+ "ctbId": "49078d1d99eb32d2df706bc41273bfb9e087a50126949fb9a3768ea807ff22d3",
+ "ctbTimeIssued": 1523040971,
+ "ctbInputs": [
+ [
+ "DdzFFzCqrht6kuqDpDWPWR1cF5cnB439BmUdunZGVjdqZ31bENrP8LakEy3zv5yc94yYFwz763k3a424QKz5vFthRTeicnEE8m8z8DDG",
+ {
+ "getCoin": "690834711030"
+ }
+ ]
+ ],
+ "ctbOutputs": [
+ [
+ "DdzFFzCqrhsxY4bCb9ovxSMGLdGui581JXfcBxn5TQ3kt1hKQXySC52HjksUZZgBf13HUZBDNENj2C2rDu6ADh4gGQwpTvGZmpMMxVLN",
+ {
+ "getCoin": "643334441484"
+ }
+ ],
+ [
+ "DdzFFzCqrht8CysiDhsFvQSxUj6YdnrC6ypzjhNUaF1oo4VRVLcEaTCNzuxn8iMGcaFNAPNkFySgzr9wHjiA2egatAg91yy8F7EZb9Hb",
+ {
+ "getCoin": "47500098300"
+ }
+ ]
+ ],
+ "ctbInputSum": {
+ "getCoin": "690834711030"
+ },
+ "ctbOutputSum": {
+ "getCoin": "690834539784"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/data/getGenesisAddresses-Failure.json b/test/data/getGenesisAddresses-Failure.json
new file mode 100644
index 0000000..243c2ef
--- /dev/null
+++ b/test/data/getGenesisAddresses-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "No page found"
+}
\ No newline at end of file
diff --git a/test/data/getGenesisAddresses-Success.json b/test/data/getGenesisAddresses-Success.json
new file mode 100644
index 0000000..c13460d
--- /dev/null
+++ b/test/data/getGenesisAddresses-Success.json
@@ -0,0 +1,109 @@
+{
+ "Right": [
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZHhgPpDi2g5nE1UhHn6hCqihNxwkhTgxQayQ6FwE3eKEypDZU",
+ "cgaiGenesisAmount": {
+ "getCoin": "3011269000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEYyVPUHmDGGLy75Yx4rvcZGygbYXQi4b2jP7T1qyGYhXa8JH3d",
+ "cgaiGenesisAmount": {
+ "getCoin": "8217726000000"
+ },
+ "cgaiIsRedeemed": false
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZ4kRcdmzGCpg9AB8nEGWc3AEbEzTndnQrLSH1xEEuWX7fpZWL",
+ "cgaiGenesisAmount": {
+ "getCoin": "378561000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZArs24o8b2PRvDGhsvkk9jJVcBBHcRCWf4sdyndQP4p86ePRQ",
+ "cgaiGenesisAmount": {
+ "getCoin": "453638000000"
+ },
+ "cgaiIsRedeemed": false
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEYwQovDJGWUDPJkbks9KkJxA1tUcAtXjpfMs13w2sCUiKapRcF",
+ "cgaiGenesisAmount": {
+ "getCoin": "833348000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZLvFpq1McFTf7HEKuE3mtbb4QqpTA75oT9Y6bvfZ84kMU5EsZ",
+ "cgaiGenesisAmount": {
+ "getCoin": "385528000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZKeC2CkaU1PZwacf7iui65dHjctSqXGXkhqH2sXEeXnxt5D8S",
+ "cgaiGenesisAmount": {
+ "getCoin": "384774000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZJ1yxrvdXdS3wNprgrJ8s6i59pSVt4vAJakvat5jxFb2xjkaJ",
+ "cgaiGenesisAmount": {
+ "getCoin": "379928000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEYxjEabxxD2YRu4QGsd8KbppGbraSGXg9HjXodk6dGaypRbhXa",
+ "cgaiGenesisAmount": {
+ "getCoin": "769230000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZ3N2AuMYpqerifycLiLPtsV8B72VgAsPjPAwrLa7xyfWBUJ2t",
+ "cgaiGenesisAmount": {
+ "getCoin": "5007593000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZAxKViD5szxQCY1mXQCt1rWHg7woxvwadBKZWFFcTMXWPzTzP",
+ "cgaiGenesisAmount": {
+ "getCoin": "462146000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZ3MQSR1DwRsiWqbPdx5zTiywmY1mdyYiqgQakQNsxFZFBxHvN",
+ "cgaiGenesisAmount": {
+ "getCoin": "416666000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZHfUQniiuXPQocjXtviU8UuXTqbcrQRhyqPyxVpVKuNAMNtJ8",
+ "cgaiGenesisAmount": {
+ "getCoin": "416337000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEZEwkfDa8Y9QLsoLpYK7txQ4M2xEC5izyr6vThrJLX6JyZqWYM",
+ "cgaiGenesisAmount": {
+ "getCoin": "415901000000"
+ },
+ "cgaiIsRedeemed": true
+ },
+ {
+ "cgaiCardanoAddress": "Ae2tdPwUPEYycJ77DaXcWEdM3jaSBg2HgmK9jT1HmBzeLJ94x8mRw33xpBM",
+ "cgaiGenesisAmount": {
+ "getCoin": "389217000000"
+ },
+ "cgaiIsRedeemed": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/data/getGenesisAddressesPages-Failure.json b/test/data/getGenesisAddressesPages-Failure.json
new file mode 100644
index 0000000..243c2ef
--- /dev/null
+++ b/test/data/getGenesisAddressesPages-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "No page found"
+}
\ No newline at end of file
diff --git a/test/data/getGenesisAddressesPages-Success.json b/test/data/getGenesisAddressesPages-Success.json
new file mode 100644
index 0000000..78337a7
--- /dev/null
+++ b/test/data/getGenesisAddressesPages-Success.json
@@ -0,0 +1,3 @@
+{
+ "Right": 1414
+}
\ No newline at end of file
diff --git a/test/data/getGenesisSummary-Failure.json b/test/data/getGenesisSummary-Failure.json
new file mode 100644
index 0000000..04f0c03
--- /dev/null
+++ b/test/data/getGenesisSummary-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "Some error."
+}
\ No newline at end of file
diff --git a/test/data/getGenesisSummary-Success.json b/test/data/getGenesisSummary-Success.json
new file mode 100644
index 0000000..0bbbb1a
--- /dev/null
+++ b/test/data/getGenesisSummary-Success.json
@@ -0,0 +1,13 @@
+{
+ "Right": {
+ "cgsNumTotal": 14505,
+ "cgsNumRedeemed": 13212,
+ "cgsNumNotRedeemed": 1293,
+ "cgsRedeemedAmountTotal": {
+ "getCoin": "29786442256000000"
+ },
+ "cgsNonRedeemedAmountTotal": {
+ "getCoin": "1326042489000000"
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/data/getLastTransactions-Failure.json b/test/data/getLastTransactions-Failure.json
new file mode 100644
index 0000000..04f0c03
--- /dev/null
+++ b/test/data/getLastTransactions-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "Some error."
+}
\ No newline at end of file
diff --git a/test/data/getLastTransactions-Success.json b/test/data/getLastTransactions-Success.json
new file mode 100644
index 0000000..c349dd0
--- /dev/null
+++ b/test/data/getLastTransactions-Success.json
@@ -0,0 +1,144 @@
+{
+ "Right": [
+ {
+ "cteId": "9a8d6f4f9508abd23c3a3073df1dc3c1668977768c77abc3137b7ae831d25fea",
+ "cteTimeIssued": 1524432171,
+ "cteAmount": {
+ "getCoin": "2589670453960"
+ }
+ },
+ {
+ "cteId": "f64378db84db207bf57eba6b929b3f053cd0a5ec8773a17f948d72d939bfe1e6",
+ "cteTimeIssued": 1524432011,
+ "cteAmount": {
+ "getCoin": "1223002104"
+ }
+ },
+ {
+ "cteId": "2e017e6ff55f08a6f9d9ce3c06c84482ce14ea4afa56727aa1b5742f54b421ec",
+ "cteTimeIssued": 1524419671,
+ "cteAmount": {
+ "getCoin": "865266285137"
+ }
+ },
+ {
+ "cteId": "a6a4c3f8ee941755f079899295b664e3266a3fefef34c9871ec2ba49544c8037",
+ "cteTimeIssued": 1524420231,
+ "cteAmount": {
+ "getCoin": "861669235421"
+ }
+ },
+ {
+ "cteId": "a0512bcd10843227bcbd4ba14204d6a588b247d7f049a412aaf7a704a1be747f",
+ "cteTimeIssued": 1524423111,
+ "cteAmount": {
+ "getCoin": "2595872015156"
+ }
+ },
+ {
+ "cteId": "44911085f4162a71818675b75e01dbdcfa6d137c767954bfb256b47458d5ae61",
+ "cteTimeIssued": 1524425311,
+ "cteAmount": {
+ "getCoin": "3099499649730"
+ }
+ },
+ {
+ "cteId": "efcd4d7409cf7c649a90dcafbcb7df8c60f34d40a7f236420b457efa501bc7b8",
+ "cteTimeIssued": 1524425591,
+ "cteAmount": {
+ "getCoin": "28443577303"
+ }
+ },
+ {
+ "cteId": "004eaca5ae2a9f9cd68622ab99f67ae1325c215e33076a3438e47ba7ca98903a",
+ "cteTimeIssued": 1524425671,
+ "cteAmount": {
+ "getCoin": "1259822215"
+ }
+ },
+ {
+ "cteId": "d7426af6ebf597041415338c51d5365dea97916da7fcb113615fec9e9d47c86a",
+ "cteTimeIssued": 1524425671,
+ "cteAmount": {
+ "getCoin": "544972712"
+ }
+ },
+ {
+ "cteId": "c3b7a74933d565b3ee0023fd15148fd257fbd40922056ad4558180cd8c4635f1",
+ "cteTimeIssued": 1524425671,
+ "cteAmount": {
+ "getCoin": "584217195951"
+ }
+ },
+ {
+ "cteId": "9e7167823ac1889f705b3615d6422621f1e0cfceef5772f4c5d413316466d391",
+ "cteTimeIssued": 1524425711,
+ "cteAmount": {
+ "getCoin": "4401630860"
+ }
+ },
+ {
+ "cteId": "93363128f5ca9f0c363ef1677fb15b0fe87f8d7357d0bc5e9244a6eaae7639af",
+ "cteTimeIssued": 1524426391,
+ "cteAmount": {
+ "getCoin": "87599447289"
+ }
+ },
+ {
+ "cteId": "579bbee62988b1590d1028bfcd744ec0543b77043e313c4493b7ea619e3f1d5f",
+ "cteTimeIssued": 1524426671,
+ "cteAmount": {
+ "getCoin": "2593024421722"
+ }
+ },
+ {
+ "cteId": "45011fc9f23881c775891bace3933f15df368926b6aa76b71acf93c4117da76e",
+ "cteTimeIssued": 1524430231,
+ "cteAmount": {
+ "getCoin": "52329106"
+ }
+ },
+ {
+ "cteId": "c515e5c15e60b79b510fe765b295def6f3373bd3c6c09861310daca7b44291b9",
+ "cteTimeIssued": 1524430311,
+ "cteAmount": {
+ "getCoin": "67840418846"
+ }
+ },
+ {
+ "cteId": "2a41192e3fb6867b96e6ce9160d9eae925d7343eb79ebfc630ed9cae833a9f37",
+ "cteTimeIssued": 1524430791,
+ "cteAmount": {
+ "getCoin": "1464727167"
+ }
+ },
+ {
+ "cteId": "878c8d4e40459781169c853ff9732eba51ebe58e8a633c822be2ce54eca9a16f",
+ "cteTimeIssued": 1524431071,
+ "cteAmount": {
+ "getCoin": "2054192363"
+ }
+ },
+ {
+ "cteId": "77062a667812813b7c7705c3df330553e4fe4b731d6417731442d45304927f30",
+ "cteTimeIssued": 1524431471,
+ "cteAmount": {
+ "getCoin": "89239506775"
+ }
+ },
+ {
+ "cteId": "21c09009cb37d370376ddd5b52538ef8d73ae421bdcefee65122331113b9775f",
+ "cteTimeIssued": 1524431471,
+ "cteAmount": {
+ "getCoin": "1460848734"
+ }
+ },
+ {
+ "cteId": "5d2f2a7100cc3744e783d35825c78144b49be3b5c20bf9a72d1358263799ce10",
+ "cteTimeIssued": 1524432191,
+ "cteAmount": {
+ "getCoin": "583965606976"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/data/getTransactionSummary-Failure.json b/test/data/getTransactionSummary-Failure.json
new file mode 100644
index 0000000..04f0c03
--- /dev/null
+++ b/test/data/getTransactionSummary-Failure.json
@@ -0,0 +1,3 @@
+{
+ "Left": "Some error."
+}
\ No newline at end of file
diff --git a/test/data/getTransactionSummary-Success.json b/test/data/getTransactionSummary-Success.json
new file mode 100644
index 0000000..7e48b96
--- /dev/null
+++ b/test/data/getTransactionSummary-Success.json
@@ -0,0 +1,61 @@
+{
+ "Right": {
+ "ctsId": "9a8d6f4f9508abd23c3a3073df1dc3c1668977768c77abc3137b7ae831d25fea",
+ "ctsTxTimeIssued": 1524432171,
+ "ctsBlockTimeIssued": 1524432171,
+ "ctsBlockHeight": 911351,
+ "ctsBlockEpoch": 42,
+ "ctsBlockSlot": 4254,
+ "ctsBlockHash": "7b0a441040fc30a934170b93aa2c1648ee6b66fba5160e38e30bce3da64ab65b",
+ "ctsRelayedBy": null,
+ "ctsTotalInput": {
+ "getCoin": "2589670636193"
+ },
+ "ctsTotalOutput": {
+ "getCoin": "2589670453960"
+ },
+ "ctsFees": {
+ "getCoin": "182233"
+ },
+ "ctsInputs": [
+ [
+ "DdzFFzCqrht2E9Yqe8WYqAbo2846GxmkrCaYV71TQ7AEV6m6fGZfzVM2N7UG94PkUan2uiMusZgNbJ97jtjMPx5iPje2FDEawBDmppmr",
+ {
+ "getCoin": "2589670636193"
+ }
+ ]
+ ],
+ "ctsOutputs": [
+ [
+ "DdzFFzCqrhtCBChmP3QyAhT96XsJoSWb9QDnUGrwuVEWFbGq48DGLVsiEAqXY8KQWKXMPaXWqaUtfZmFphd89SgyzkT2tpJhKBat2mBn",
+ {
+ "getCoin": "2431471305271"
+ }
+ ],
+ [
+ "DdzFFzCqrht4jn3sL4J8marqMwVQq9TWWFiV35PiMT17b6rUhyv3mx2fqRzGkZvQnQE8za8c6dSV3HpB68hCginkAcCN1u9uBGdPJdQv",
+ {
+ "getCoin": "250748000"
+ }
+ ],
+ [
+ "DdzFFzCqrht4iYhzRgHKPzrEggjWq6UpKHLzYsvEPyjLFRNvy3XN892v51VFnviMRMr6cweDe1k9L5NqBTwrvqGuujpC7MWRXWvkn8Eo",
+ {
+ "getCoin": "536929589"
+ }
+ ],
+ [
+ "DdzFFzCqrhsvnYabi5jZ7iDEHtViXQqdq3A9Xep4R8rn7hpBta4c9DSMR8v4fCAnBkQtqZbfkX5bxpZ62ZoAnmXsvNaxTyAuMZyLo7uB",
+ {
+ "getCoin": "149667471100"
+ }
+ ],
+ [
+ "DdzFFzCqrhsqDkT2ukmusyhY724z7b7Ha9KshsSZ8y46o61cotmrUnsK8zEsiDZWKCJLzfoent1SU2EQSMin4dwzk99wNndneZ49JhJ4",
+ {
+ "getCoin": "7744000000"
+ }
+ ]
+ ]
+ }
+}
\ No newline at end of file