/**
  * @param CreateAddressCommand $command
  * @throws \Exception
  */
 public function handle(CreateAddressCommand $command)
 {
     // DEBUG
     //var_dump($command);
     $walletId = $command->getWalletId();
     $addressTag = $command->getTag();
     $addressCallbackUrl = $command->getCallbackUrl();
     // DEBUG: create a sample wallet
     //$wallet = $this->walletRepository->loadFixtures();
     $wallet = $this->walletRepository->walletOfId(new WalletId($walletId));
     // DEBUG
     //var_dump($wallet);
     //die();
     if ($wallet === null) {
         // TODO: create domain exception
         throw new \Exception(sprintf("Wallet not found %s", $walletId));
     }
     // 1.- Call BlockCypher API to generate new address
     $walletGenerateAddressResponse = $this->blockCypherWalletService->generateAddress($wallet->getId()->getValue(), $wallet->getCoinSymbol(), $wallet->getToken());
     // 2.- Create new app Address
     $address = new Address($this->addressRepository->nextIdentity(), new WalletId($walletId), $walletGenerateAddressResponse->getAddress(), $addressTag, $walletGenerateAddressResponse->getPrivate(), $walletGenerateAddressResponse->getPublic(), $walletGenerateAddressResponse->getWif(), $addressCallbackUrl, $this->clock->now());
     $this->addressRepository->insert($address);
 }
 /**
  * @param $allInputsAddresses
  * @param $walletId
  * @return array
  * @throws \Exception
  */
 private function getPrivateKeysFromRepository($allInputsAddresses, $walletId)
 {
     // TODO: Code Review. Support for multisign addresses.
     // PrivateKeys are stored in Address object. They should be stored in a new Key class.
     // Multisign addresses have more than one key pair.
     $privateKeys = array();
     foreach ($allInputsAddresses as $addressInTransaction) {
         $address = $this->addressRepository->addressOfWalletId($addressInTransaction, new WalletId($walletId));
         // DEBUG
         //echo "AddressInTransaction: $addressInTransaction";
         //var_dump($address->getAddress());
         if ($address === null) {
             throw new \Exception(sprintf("Address %s not found in wallet %s", $addressInTransaction, $walletId));
         }
         if ($address !== null) {
             $privateKeys[$address->getAddress()] = $address->getPrivate();
         }
     }
     return $privateKeys;
 }
 /**
  * @param WalletId $walletId
  * @return Address[]
  */
 public function listWalletAddresses(WalletId $walletId)
 {
     return $this->addressRepository->addressesOfWalletId($walletId);
 }