One Hat Cyber Team
Your IP:
216.73.216.30
Server IP:
198.54.114.155
Server:
Linux server71.web-hosting.com 4.18.0-513.18.1.lve.el8.x86_64 #1 SMP Thu Feb 22 12:55:50 UTC 2024 x86_64
Server Software:
LiteSpeed
PHP Version:
5.6.40
Create File
|
Create Folder
Execute
Dir :
~
/
proc
/
self
/
root
/
proc
/
thread-self
/
cwd
/
Edit File:
Exchange.tar
FixedExchange.php 0000644 00000002123 15110652044 0007753 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Money\Currency; use Money\CurrencyPair; use Money\Exception\UnresolvableCurrencyPairException; use Money\Exchange; /** * Provides a way to get exchange rate from a static list (array). */ final class FixedExchange implements Exchange { /** @psalm-var array<non-empty-string, array<non-empty-string, numeric-string>> */ private array $list; /** @psalm-param array<non-empty-string, array<non-empty-string, numeric-string>> $list */ public function __construct(array $list) { $this->list = $list; } public function quote(Currency $baseCurrency, Currency $counterCurrency): CurrencyPair { if (isset($this->list[$baseCurrency->getCode()][$counterCurrency->getCode()])) { return new CurrencyPair( $baseCurrency, $counterCurrency, $this->list[$baseCurrency->getCode()][$counterCurrency->getCode()] ); } throw UnresolvableCurrencyPairException::createFromCurrencies($baseCurrency, $counterCurrency); } } IndirectExchangeQueuedItem.php 0000644 00000000613 15110652044 0012447 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Money\Currency; /** @internal for sole consumption by {@see IndirectExchange} */ final class IndirectExchangeQueuedItem { public Currency $currency; public bool $discovered = false; public ?self $parent = null; public function __construct(Currency $currency) { $this->currency = $currency; } } SwapExchange.php 0000644 00000002162 15110652044 0007631 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Exchanger\Exception\Exception as ExchangerException; use Money\Currency; use Money\CurrencyPair; use Money\Exception\UnresolvableCurrencyPairException; use Money\Exchange; use Swap\Swap; use function assert; use function is_numeric; use function sprintf; /** * Provides a way to get exchange rate from a third-party source and return a currency pair. */ final class SwapExchange implements Exchange { private Swap $swap; public function __construct(Swap $swap) { $this->swap = $swap; } public function quote(Currency $baseCurrency, Currency $counterCurrency): CurrencyPair { try { $rate = $this->swap->latest($baseCurrency->getCode() . '/' . $counterCurrency->getCode()); } catch (ExchangerException) { throw UnresolvableCurrencyPairException::createFromCurrencies($baseCurrency, $counterCurrency); } $rateValue = sprintf('%.14F', $rate->getValue()); assert(is_numeric($rateValue)); return new CurrencyPair($baseCurrency, $counterCurrency, $rateValue); } } IndirectExchange.php 0000644 00000010250 15110652044 0010455 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Money\Currencies; use Money\Currency; use Money\CurrencyPair; use Money\Exception\UnresolvableCurrencyPairException; use Money\Exchange; use Money\Money; use SplQueue; use function array_reduce; use function array_reverse; /** * Provides a way to get an exchange rate through a minimal set of intermediate conversions. */ final class IndirectExchange implements Exchange { private Currencies $currencies; private Exchange $exchange; public function __construct(Exchange $exchange, Currencies $currencies) { $this->exchange = $exchange; $this->currencies = $currencies; } public function quote(Currency $baseCurrency, Currency $counterCurrency): CurrencyPair { try { return $this->exchange->quote($baseCurrency, $counterCurrency); } catch (UnresolvableCurrencyPairException) { $rate = array_reduce( $this->getConversions($baseCurrency, $counterCurrency), /** * @psalm-param numeric-string $carry * * @psalm-return numeric-string */ static function (string $carry, CurrencyPair $pair) { $calculator = Money::getCalculator(); return $calculator::multiply($carry, $pair->getConversionRatio()); }, '1.0' ); return new CurrencyPair($baseCurrency, $counterCurrency, $rate); } } /** * @return CurrencyPair[] * * @throws UnresolvableCurrencyPairException */ private function getConversions(Currency $baseCurrency, Currency $counterCurrency): array { $startNode = new IndirectExchangeQueuedItem($baseCurrency); $startNode->discovered = true; /** @psalm-var array<non-empty-string, IndirectExchangeQueuedItem> $nodes */ $nodes = [$baseCurrency->getCode() => $startNode]; /** @psam-var SplQueue<IndirectExchangeQueuedItem> $frontier */ $frontier = new SplQueue(); $frontier->enqueue($startNode); while ($frontier->count()) { /** @psalm-var IndirectExchangeQueuedItem $currentNode */ $currentNode = $frontier->dequeue(); $currentCurrency = $currentNode->currency; if ($currentCurrency->equals($counterCurrency)) { return $this->reconstructConversionChain($nodes, $currentNode); } foreach ($this->currencies as $candidateCurrency) { if (! isset($nodes[$candidateCurrency->getCode()])) { $nodes[$candidateCurrency->getCode()] = new IndirectExchangeQueuedItem($candidateCurrency); } $node = $nodes[$candidateCurrency->getCode()]; if ($node->discovered) { continue; } try { // Check if the candidate is a neighbor. This will throw an exception if it isn't. $this->exchange->quote($currentCurrency, $candidateCurrency); $node->discovered = true; $node->parent = $currentNode; $frontier->enqueue($node); } catch (UnresolvableCurrencyPairException $exception) { // Not a neighbor. Move on. } } } throw UnresolvableCurrencyPairException::createFromCurrencies($baseCurrency, $counterCurrency); } /** * @psalm-param array<non-empty-string, IndirectExchangeQueuedItem> $currencies * * @return CurrencyPair[] * @psalm-return list<CurrencyPair> */ private function reconstructConversionChain(array $currencies, IndirectExchangeQueuedItem $goalNode): array { $current = $goalNode; $conversions = []; while ($current->parent) { $previous = $currencies[$current->parent->currency->getCode()]; $conversions[] = $this->exchange->quote($previous->currency, $current->currency); $current = $previous; } return array_reverse($conversions); } } ReversedCurrenciesExchange.php 0000644 00000002433 15110652044 0012522 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Money\Currency; use Money\CurrencyPair; use Money\Exception\UnresolvableCurrencyPairException; use Money\Exchange; use Money\Money; /** * Tries the reverse of the currency pair if one is not available. * * Note: adding nested ReversedCurrenciesExchange could cause a huge performance hit. */ final class ReversedCurrenciesExchange implements Exchange { private Exchange $exchange; public function __construct(Exchange $exchange) { $this->exchange = $exchange; } public function quote(Currency $baseCurrency, Currency $counterCurrency): CurrencyPair { try { return $this->exchange->quote($baseCurrency, $counterCurrency); } catch (UnresolvableCurrencyPairException $exception) { $calculator = Money::getCalculator(); try { $currencyPair = $this->exchange->quote($counterCurrency, $baseCurrency); return new CurrencyPair( $baseCurrency, $counterCurrency, $calculator::divide('1', $currencyPair->getConversionRatio()) ); } catch (UnresolvableCurrencyPairException) { throw $exception; } } } } ExchangerExchange.php 0000644 00000002624 15110652044 0010626 0 ustar 00 <?php declare(strict_types=1); namespace Money\Exchange; use Exchanger\Contract\ExchangeRateProvider; use Exchanger\CurrencyPair as ExchangerCurrencyPair; use Exchanger\Exception\Exception as ExchangerException; use Exchanger\ExchangeRateQuery; use Money\Currency; use Money\CurrencyPair; use Money\Exception\UnresolvableCurrencyPairException; use Money\Exchange; use function assert; use function is_numeric; use function sprintf; /** * Provides a way to get exchange rate from a third-party source and return a currency pair. */ final class ExchangerExchange implements Exchange { private ExchangeRateProvider $exchanger; public function __construct(ExchangeRateProvider $exchanger) { $this->exchanger = $exchanger; } public function quote(Currency $baseCurrency, Currency $counterCurrency): CurrencyPair { try { $query = new ExchangeRateQuery( new ExchangerCurrencyPair($baseCurrency->getCode(), $counterCurrency->getCode()) ); $rate = $this->exchanger->getExchangeRate($query); } catch (ExchangerException) { throw UnresolvableCurrencyPairException::createFromCurrencies($baseCurrency, $counterCurrency); } $rateValue = sprintf('%.14F', $rate->getValue()); assert(is_numeric($rateValue)); return new CurrencyPair($baseCurrency, $counterCurrency, $rateValue); } }
Simpan