├── public
├── favicon.ico
├── googleb51c09f1a25c7afb.html
├── img
│ ├── aex.png
│ ├── btc38.png
│ ├── kraken.png
│ ├── liquid.png
│ ├── okex.png
│ ├── paribu.png
│ ├── apay.io.png
│ ├── binance.png
│ ├── bittrex.png
│ ├── equid.co.png
│ ├── exrates.png
│ ├── golix.io.png
│ ├── indodax.png
│ ├── lapo.io.png
│ ├── moni.com.png
│ ├── poloniex.png
│ ├── stellarx.png
│ ├── token.io.png
│ ├── anclax.com.png
│ ├── astral9.io.png
│ ├── changelly.png
│ ├── coins.asia.png
│ ├── fchain.io.png
│ ├── jetmint.org.png
│ ├── naobtc.com.png
│ ├── nezly.com.png
│ ├── nrvcoin.in.png
│ ├── ntokens.com.png
│ ├── papayabot.png
│ ├── papayaswap.png
│ ├── pedity.com.png
│ ├── pr.network.png
│ ├── repocoin.io.png
│ ├── ripplefox.png
│ ├── six.network.png
│ ├── stellarport.png
│ ├── stellarterm.png
│ ├── stronghold.png
│ ├── ternio.io.png
│ ├── tonaira.com.png
│ ├── vcbear.net.png
│ ├── ximcoin.com.png
│ ├── xirkle.com.png
│ ├── anchorusd.com.png
│ ├── cryptotari.io.png
│ ├── fireflywallet.png
│ ├── frasindo.com.png
│ ├── interstellar.png
│ ├── irene.energy.png
│ ├── ripplefox.com.png
│ ├── smartlands.io.png
│ ├── stemchain.io.png
│ ├── stronghold.co.png
│ ├── sureremit.co.png
│ ├── tempo.eu.com.png
│ ├── winsome.gift.png
│ ├── wirexapp.com.png
│ ├── charnatoken.top.png
│ ├── collective21.org.png
│ ├── cowrie.exchange.png
│ ├── cryptomover.com.png
│ ├── flutterwave.com.png
│ ├── mobius.network.png
│ ├── old.repocoin.io.png
│ ├── old.sureremit.co.png
│ ├── superlumen.org.png
│ ├── thefutbolcoin.io.png
│ ├── thewwallet.com.png
│ ├── tontinetrust.com.png
│ ├── interstellar.exchange.png
│ ├── liquido.i-server.org.png
│ ├── support.svg
│ └── gh.svg
├── logo128.png
├── logo512.png
├── logo64.png
├── stellar.ico
├── favicon-16x16.png
├── favicon-32x32.png
├── search
│ ├── search_asset.png
│ ├── search_ledger.png
│ ├── search_tx_hash.png
│ ├── search_account_public.png
│ ├── search_anchor_name_full.png
│ ├── search_stellar_address.png
│ └── search_anchor_name_partial.png
├── languages
│ ├── en.json
│ └── languages
│ │ └── es.json
├── search.xml
├── manifest.json
├── logo.svg
├── sitemap.xml
└── index.html
├── screenshots
├── assets.png
├── effects.png
├── header.png
├── trades.png
├── new.style.png
├── opensearch.png
├── payments.png
├── horizon.json.png
├── stellar.toml.png
├── account.offers.png
├── inflation_pools.png
├── mobile.splash.png
├── search_by_asset.png
├── search_by_anchor.png
└── mobile.add.homescreen.jpg
├── src
├── img
│ ├── lang-select.png
│ └── logo.svg
├── index.css
├── lib
│ ├── stellar.js
│ ├── __tests__
│ │ ├── csv.test.js
│ │ ├── __data__
│ │ │ ├── effects.js
│ │ │ └── pathPayments.js
│ │ ├── search.test.js
│ │ └── utils.test.js
│ ├── stellar
│ │ ├── networks.js
│ │ ├── utils.js
│ │ ├── __tests__
│ │ │ └── networks.test.js
│ │ └── server.js
│ ├── csv.js
│ └── search.js
├── __mocks__
│ └── MockXHR.js
├── components
│ ├── operations
│ │ ├── Inflation.js
│ │ ├── Unrecognized.js
│ │ ├── BumpSequence.js
│ │ ├── AccountMerge.js
│ │ ├── ChangeTrust.js
│ │ ├── Trust.js
│ │ ├── AllowTrust.js
│ │ ├── PathPayment.js
│ │ ├── CreateAccount.js
│ │ ├── ManageData.js
│ │ ├── __tests__
│ │ │ ├── ManageData.test.js
│ │ │ └── __snapshots__
│ │ │ │ └── ManageData.test.js.snap
│ │ ├── Payment.js
│ │ ├── Offer.js
│ │ └── SetOptions.js
│ ├── shared
│ │ ├── NewWindowIcon.js
│ │ ├── __tests__
│ │ │ ├── __snapshots__
│ │ │ │ ├── JSONButton.test.js.snap
│ │ │ │ ├── TitleWithJSONButton.test.js.snap
│ │ │ │ └── LumensRates.test.js.snap
│ │ │ ├── JSONButton.test.js
│ │ │ ├── TitleWithJSONButton.test.js
│ │ │ ├── LumensRates.test.js
│ │ │ └── AccountLink.test.js
│ │ ├── FormattedAmount.js
│ │ ├── JSONButton.js
│ │ ├── ExportButton.js
│ │ ├── StellarTomlBadge.js
│ │ ├── Spinner.js
│ │ ├── HOCs.js
│ │ ├── PagingControls.js
│ │ ├── TransactionHash.js
│ │ ├── TitleWithJSONButton.js
│ │ ├── Asset.js
│ │ ├── Error.js
│ │ ├── TitleWithLink.js
│ │ ├── OperationType.js
│ │ ├── NoMatchError.js
│ │ ├── InsecureNetworkError.js
│ │ ├── Logo.js
│ │ ├── TimeSynchronizedFormattedRelative.js
│ │ ├── Paging.js
│ │ ├── ClipboardCopy.js
│ │ ├── InfoBanner.js
│ │ ├── LumensRates.js
│ │ ├── CSVExport.js
│ │ └── AccountLink.js
│ ├── Accounts.js
│ ├── Trades.js
│ ├── Effects.js
│ ├── Payments.js
│ ├── Ledgers.js
│ ├── Operations.js
│ ├── layout
│ │ ├── NetworkSelector.js
│ │ ├── Footer.js
│ │ └── LanguageSelector.js
│ ├── Transactions.js
│ ├── LedgerTableContainer.js
│ ├── TransactionTableContainer.js
│ └── Home.js
├── __tests__
│ └── App.test.js
├── index.js
├── data
│ ├── inflation_pools.json
│ ├── distributers.js
│ └── __tests__
│ │ └── known_accounts.test.js
└── constants.py
├── .travis.yml
├── static.json
├── config
├── animationShim.js
├── jest
│ ├── fileTransform.js
│ └── cssTransform.js
├── polyfills.js
├── config.js
└── paths.js
├── .gitignore
├── .whitesource
├── .eslintrc
├── views
├── transaction.ejs
└── block.ejs
├── banner.json
├── app
├── controllers
│ ├── BlockController.js
│ ├── AccountController.js
│ └── TransactionController.js
├── server.js
├── routes.js
├── utils
│ ├── stellar.js
│ └── horizon.js
└── app.js
├── .github
├── workflows
│ ├── clojure.yml
│ ├── docker-image.yml
│ ├── rust.yml
│ ├── crystal.yml
│ ├── c-cpp.yml
│ ├── erlang.yml
│ ├── greetings.yml
│ ├── makefile.yml
│ ├── swift.yml
│ ├── jekyll-docker.yml
│ ├── android.yml
│ ├── npm-gulp.yml
│ ├── npm-grunt.yml
│ ├── webpack.yml
│ ├── label.yml
│ ├── pylint.yml
│ ├── go.yml
│ ├── ant.yml
│ ├── dotnet.yml
│ ├── django.yml
│ ├── stale.yml
│ ├── npm-publish.yml
│ ├── super-linter.yml
│ ├── node.js.yml
│ ├── scala.yml
│ ├── d.yml
│ ├── php.yml
│ ├── npm-publish-github-packages.yml
│ ├── gradle.yml
│ ├── laravel.yml
│ ├── manual.yml
│ ├── maven-publish.yml
│ ├── elixir.yml
│ ├── haskell.yml
│ ├── python-package-conda.yml
│ ├── python-publish.yml
│ ├── r.yml
│ ├── maven.yml
│ ├── objective-c-xcode.yml
│ ├── ruby.yml
│ ├── python-app.yml
│ ├── jekyll-gh-pages.yml
│ ├── python-package.yml
│ ├── dart.yml
│ ├── msbuild.yml
│ ├── gem-push.yml
│ ├── gradle-publish.yml
│ ├── symfony.yml
│ ├── cmake-single-platform.yml
│ ├── rubyonrails.yml
│ ├── go-ossf-slsa3-publish.yml
│ ├── jekyll.yml
│ ├── azure-functions-app-powershell.yml
│ ├── ios.yml
│ ├── codacy.yml
│ └── generator-generic-ossf-slsa3-publish.yml
└── issue_template.md
├── ai
└── predictive_analytics
│ └── predict.py
├── scripts
└── test.js
├── docker
└── nginx-defaults.conf
├── jest.config.js
├── Dockerfile
├── kubernetes
├── scripts
│ └── deploy_kubernetes_components
└── config
│ └── app.yaml
├── .deepsource.toml
└── README.md
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/googleb51c09f1a25c7afb.html:
--------------------------------------------------------------------------------
1 | google-site-verification: googleb51c09f1a25c7afb.html
2 |
--------------------------------------------------------------------------------
/public/img/aex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/aex.png
--------------------------------------------------------------------------------
/public/logo128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/logo128.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/public/logo64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/logo64.png
--------------------------------------------------------------------------------
/public/stellar.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/stellar.ico
--------------------------------------------------------------------------------
/public/img/btc38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/btc38.png
--------------------------------------------------------------------------------
/public/img/kraken.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/kraken.png
--------------------------------------------------------------------------------
/public/img/liquid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/liquid.png
--------------------------------------------------------------------------------
/public/img/okex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/okex.png
--------------------------------------------------------------------------------
/public/img/paribu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/paribu.png
--------------------------------------------------------------------------------
/public/img/apay.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/apay.io.png
--------------------------------------------------------------------------------
/public/img/binance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/binance.png
--------------------------------------------------------------------------------
/public/img/bittrex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/bittrex.png
--------------------------------------------------------------------------------
/public/img/equid.co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/equid.co.png
--------------------------------------------------------------------------------
/public/img/exrates.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/exrates.png
--------------------------------------------------------------------------------
/public/img/golix.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/golix.io.png
--------------------------------------------------------------------------------
/public/img/indodax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/indodax.png
--------------------------------------------------------------------------------
/public/img/lapo.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/lapo.io.png
--------------------------------------------------------------------------------
/public/img/moni.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/moni.com.png
--------------------------------------------------------------------------------
/public/img/poloniex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/poloniex.png
--------------------------------------------------------------------------------
/public/img/stellarx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stellarx.png
--------------------------------------------------------------------------------
/public/img/token.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/token.io.png
--------------------------------------------------------------------------------
/screenshots/assets.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/assets.png
--------------------------------------------------------------------------------
/screenshots/effects.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/effects.png
--------------------------------------------------------------------------------
/screenshots/header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/header.png
--------------------------------------------------------------------------------
/screenshots/trades.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/trades.png
--------------------------------------------------------------------------------
/src/img/lang-select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/src/img/lang-select.png
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/img/anclax.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/anclax.com.png
--------------------------------------------------------------------------------
/public/img/astral9.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/astral9.io.png
--------------------------------------------------------------------------------
/public/img/changelly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/changelly.png
--------------------------------------------------------------------------------
/public/img/coins.asia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/coins.asia.png
--------------------------------------------------------------------------------
/public/img/fchain.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/fchain.io.png
--------------------------------------------------------------------------------
/public/img/jetmint.org.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/jetmint.org.png
--------------------------------------------------------------------------------
/public/img/naobtc.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/naobtc.com.png
--------------------------------------------------------------------------------
/public/img/nezly.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/nezly.com.png
--------------------------------------------------------------------------------
/public/img/nrvcoin.in.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/nrvcoin.in.png
--------------------------------------------------------------------------------
/public/img/ntokens.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/ntokens.com.png
--------------------------------------------------------------------------------
/public/img/papayabot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/papayabot.png
--------------------------------------------------------------------------------
/public/img/papayaswap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/papayaswap.png
--------------------------------------------------------------------------------
/public/img/pedity.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/pedity.com.png
--------------------------------------------------------------------------------
/public/img/pr.network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/pr.network.png
--------------------------------------------------------------------------------
/public/img/repocoin.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/repocoin.io.png
--------------------------------------------------------------------------------
/public/img/ripplefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/ripplefox.png
--------------------------------------------------------------------------------
/public/img/six.network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/six.network.png
--------------------------------------------------------------------------------
/public/img/stellarport.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stellarport.png
--------------------------------------------------------------------------------
/public/img/stellarterm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stellarterm.png
--------------------------------------------------------------------------------
/public/img/stronghold.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stronghold.png
--------------------------------------------------------------------------------
/public/img/ternio.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/ternio.io.png
--------------------------------------------------------------------------------
/public/img/tonaira.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/tonaira.com.png
--------------------------------------------------------------------------------
/public/img/vcbear.net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/vcbear.net.png
--------------------------------------------------------------------------------
/public/img/ximcoin.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/ximcoin.com.png
--------------------------------------------------------------------------------
/public/img/xirkle.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/xirkle.com.png
--------------------------------------------------------------------------------
/screenshots/new.style.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/new.style.png
--------------------------------------------------------------------------------
/screenshots/opensearch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/opensearch.png
--------------------------------------------------------------------------------
/screenshots/payments.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/payments.png
--------------------------------------------------------------------------------
/public/img/anchorusd.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/anchorusd.com.png
--------------------------------------------------------------------------------
/public/img/cryptotari.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/cryptotari.io.png
--------------------------------------------------------------------------------
/public/img/fireflywallet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/fireflywallet.png
--------------------------------------------------------------------------------
/public/img/frasindo.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/frasindo.com.png
--------------------------------------------------------------------------------
/public/img/interstellar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/interstellar.png
--------------------------------------------------------------------------------
/public/img/irene.energy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/irene.energy.png
--------------------------------------------------------------------------------
/public/img/ripplefox.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/ripplefox.com.png
--------------------------------------------------------------------------------
/public/img/smartlands.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/smartlands.io.png
--------------------------------------------------------------------------------
/public/img/stemchain.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stemchain.io.png
--------------------------------------------------------------------------------
/public/img/stronghold.co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/stronghold.co.png
--------------------------------------------------------------------------------
/public/img/sureremit.co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/sureremit.co.png
--------------------------------------------------------------------------------
/public/img/tempo.eu.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/tempo.eu.com.png
--------------------------------------------------------------------------------
/public/img/winsome.gift.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/winsome.gift.png
--------------------------------------------------------------------------------
/public/img/wirexapp.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/wirexapp.com.png
--------------------------------------------------------------------------------
/screenshots/horizon.json.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/horizon.json.png
--------------------------------------------------------------------------------
/screenshots/stellar.toml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/stellar.toml.png
--------------------------------------------------------------------------------
/public/img/charnatoken.top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/charnatoken.top.png
--------------------------------------------------------------------------------
/public/img/collective21.org.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/collective21.org.png
--------------------------------------------------------------------------------
/public/img/cowrie.exchange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/cowrie.exchange.png
--------------------------------------------------------------------------------
/public/img/cryptomover.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/cryptomover.com.png
--------------------------------------------------------------------------------
/public/img/flutterwave.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/flutterwave.com.png
--------------------------------------------------------------------------------
/public/img/mobius.network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/mobius.network.png
--------------------------------------------------------------------------------
/public/img/old.repocoin.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/old.repocoin.io.png
--------------------------------------------------------------------------------
/public/img/old.sureremit.co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/old.sureremit.co.png
--------------------------------------------------------------------------------
/public/img/superlumen.org.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/superlumen.org.png
--------------------------------------------------------------------------------
/public/img/thefutbolcoin.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/thefutbolcoin.io.png
--------------------------------------------------------------------------------
/public/img/thewwallet.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/thewwallet.com.png
--------------------------------------------------------------------------------
/public/img/tontinetrust.com.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/tontinetrust.com.png
--------------------------------------------------------------------------------
/public/search/search_asset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_asset.png
--------------------------------------------------------------------------------
/public/search/search_ledger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_ledger.png
--------------------------------------------------------------------------------
/screenshots/account.offers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/account.offers.png
--------------------------------------------------------------------------------
/screenshots/inflation_pools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/inflation_pools.png
--------------------------------------------------------------------------------
/screenshots/mobile.splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/mobile.splash.png
--------------------------------------------------------------------------------
/screenshots/search_by_asset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/search_by_asset.png
--------------------------------------------------------------------------------
/public/search/search_tx_hash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_tx_hash.png
--------------------------------------------------------------------------------
/screenshots/search_by_anchor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/search_by_anchor.png
--------------------------------------------------------------------------------
/public/img/interstellar.exchange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/interstellar.exchange.png
--------------------------------------------------------------------------------
/public/img/liquido.i-server.org.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/img/liquido.i-server.org.png
--------------------------------------------------------------------------------
/screenshots/mobile.add.homescreen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/screenshots/mobile.add.homescreen.jpg
--------------------------------------------------------------------------------
/public/search/search_account_public.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_account_public.png
--------------------------------------------------------------------------------
/public/search/search_anchor_name_full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_anchor_name_full.png
--------------------------------------------------------------------------------
/public/search/search_stellar_address.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_stellar_address.png
--------------------------------------------------------------------------------
/public/search/search_anchor_name_partial.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KOSASIH/Revoluterium/HEAD/public/search/search_anchor_name_partial.png
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | html {
2 | font-size: 16px !important; /* override bootstrap */
3 | }
4 |
5 | body {
6 | margin: 0;
7 | padding: 0;
8 | font-family: sans-serif;
9 | }
10 |
--------------------------------------------------------------------------------
/src/lib/stellar.js:
--------------------------------------------------------------------------------
1 | import networks from './stellar/networks'
2 | import sdk from './stellar/sdk'
3 | import Server from './stellar/server'
4 |
5 | export { networks, sdk, Server }
6 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | dist: trusty
2 | language: node_js
3 | node_js:
4 | - 14
5 | cache:
6 | directories:
7 | - node_modules
8 | script:
9 | - npm test
10 | - npm run build
11 |
--------------------------------------------------------------------------------
/public/languages/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "blockExplorer": "Block Explorer",
3 | "block": "Block",
4 | "transaction": "Transaction",
5 | "from": "From",
6 | "to": "To",
7 | "amount": "Amount"
8 | }
9 |
--------------------------------------------------------------------------------
/public/languages/languages/es.json:
--------------------------------------------------------------------------------
1 | {
2 | "blockExplorer": "Explorador de Bloques",
3 | "block": "Bloque",
4 | "transaction": "Transacción",
5 | "from": "De",
6 | "to": "A",
7 | "amount": "Cantidad"
8 | }
9 |
--------------------------------------------------------------------------------
/src/__mocks__/MockXHR.js:
--------------------------------------------------------------------------------
1 | const xhrMockClass = () => ({
2 | open: jest.fn(),
3 | send: jest.fn(),
4 | setRequestHeader: jest.fn()
5 | })
6 |
7 | window.XMLHttpRequest = jest.fn().mockImplementation(xhrMockClass)
8 |
--------------------------------------------------------------------------------
/src/components/operations/Inflation.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 |
4 | // no props - just runs inflation
5 | const Inflation = () =>
6 |
7 | export default Inflation
8 |
--------------------------------------------------------------------------------
/static.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": "build/",
3 | "routes": {
4 | "/**": "index.html"
5 | },
6 | "https_only": true,
7 | "headers": {
8 | "/search.xml": {
9 | "Content-Type": "application/opensearchdescription+xml"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/shared/NewWindowIcon.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Glyphicon from 'react-bootstrap/lib/Glyphicon'
3 |
4 | const NewWindowIcon = () => (
5 |
6 | )
7 |
8 | export default NewWindowIcon
9 |
--------------------------------------------------------------------------------
/src/components/operations/Unrecognized.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 |
4 | const Unrecognized = ({ type }) => (
5 |
11 | )
12 |
13 | export default Unrecognized
14 |
--------------------------------------------------------------------------------
/config/animationShim.js:
--------------------------------------------------------------------------------
1 | // This is a workaround for:
2 | // Warning: React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers. http://fb.me/react-polyfills
3 | // that occurs in tests after upgrading to React 16.
4 | global.requestAnimationFrame = (callback) => {
5 | setTimeout(callback, 0)
6 | }
7 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/__snapshots__/JSONButton.test.js.snap:
--------------------------------------------------------------------------------
1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
2 |
3 | exports[`renders button with given url 1`] = `
4 | Array [
5 | ,
9 | ]
10 | `;
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env
15 | .vscode
16 | npm-debug.log*
17 | yarn-debug.log*
18 | yarn-error.log*
19 | yarn.lock
20 |
21 |
--------------------------------------------------------------------------------
/.whitesource:
--------------------------------------------------------------------------------
1 | {
2 | "scanSettings": {
3 | "baseBranches": []
4 | },
5 | "checkRunSettings": {
6 | "vulnerableCheckRunConclusionLevel": "failure",
7 | "displayMode": "diff",
8 | "useMendCheckNames": true
9 | },
10 | "issueSettings": {
11 | "minSeverityLevel": "LOW",
12 | "issueType": "DEPENDENCY"
13 | }
14 | }
--------------------------------------------------------------------------------
/src/components/operations/BumpSequence.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 |
4 | const BumpSequence = (props) => (
5 |
11 | )
12 |
13 | export default BumpSequence
14 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "react-app",
3 | "rules": {
4 | "react/jsx-wrap-multilines": "off",
5 | "jsx-a11y/anchor-has-content": "off",
6 | "comma-dangle": ["warn", "always-multiline"],
7 | "object-curly-spacing": ["warn", "never"],
8 | "quotes": ["warn", "single"],
9 | "semi": ["warn", "never"]
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/views/transaction.ejs:
--------------------------------------------------------------------------------
1 |
Transaction <%= transaction.hash %>
2 |
3 |
4 | - Transaction Hash: <%= transaction.hash %>
5 | - Block Number: <%= transaction.block_number %>
6 | - From: <%= transaction.from %>
7 | - To: <%= transaction.to %>
8 | - Amount: <%= transaction.amount %>
9 |
10 |
--------------------------------------------------------------------------------
/src/components/shared/FormattedAmount.js:
--------------------------------------------------------------------------------
1 | import PropTypes from 'prop-types'
2 | import { formatAmount } from '../../lib/utils'
3 |
4 | // chop off any trailing 0s
5 | const FormattedAmount = ({ amount }) => formatAmount(amount)
6 |
7 | FormattedAmount.propTypes = {
8 | amount: PropTypes.string.isRequired
9 | }
10 |
11 | export default FormattedAmount
12 |
--------------------------------------------------------------------------------
/banner.json:
--------------------------------------------------------------------------------
1 | {
2 | "message": "\uD83D\uDCA1 Testnet will be reset on February 27th, 2019. See here for more information.",
3 | "expiry": 1553644800000
4 | }
5 |
--------------------------------------------------------------------------------
/config/jest/fileTransform.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const path = require('path')
4 |
5 | // This is a custom Jest transformer turning file imports into filenames.
6 | // http://facebook.github.io/jest/docs/tutorial-webpack.html
7 |
8 | module.exports = {
9 | process (src, filename) {
10 | return `module.exports = ${JSON.stringify(path.basename(filename))};`
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app/controllers/BlockController.js:
--------------------------------------------------------------------------------
1 | import { getBlock } from '../utils/horizon';
2 | import { getBlockTime } from '../utils/stellar';
3 |
4 | export async function getBlockData(req, res) {
5 | const blockHash = req.params.blockHash;
6 | const block = await getBlock(blockHash);
7 | const blockTime = await getBlockTime(blockHash);
8 | res.render('block', { block, blockTime });
9 | }
10 |
--------------------------------------------------------------------------------
/config/jest/cssTransform.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | // This is a custom Jest transformer turning style imports into empty objects.
4 | // http://facebook.github.io/jest/docs/tutorial-webpack.html
5 |
6 | module.exports = {
7 | process () {
8 | return 'module.exports = {};'
9 | },
10 | getCacheKey () {
11 | // The output is always the same.
12 | return 'cssTransform'
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.github/workflows/clojure.yml:
--------------------------------------------------------------------------------
1 | name: Clojure CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: Install dependencies
17 | run: lein deps
18 | - name: Run tests
19 | run: lein test
20 |
--------------------------------------------------------------------------------
/src/components/operations/AccountMerge.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import AccountLink from '../shared/AccountLink'
3 | import { FormattedMessage } from 'react-intl'
4 |
5 | const AccountMerge = ({ into }) => (
6 |
10 | }}
11 | />
12 | )
13 |
14 | export default AccountMerge
15 |
--------------------------------------------------------------------------------
/.github/issue_template.md:
--------------------------------------------------------------------------------
1 | ### Please NOTE the following before creating an issue:
2 |
3 | WE CAN'T HELP WITH FUNDS NOT RECEIVED, DELAYED OR WRONG MEMOS - CONTACT THE EXCHANGE OR THE RECEIPIENT IN THESE CASES - Stellar Explorer IS JUST A READ ONLY VIEW OF THE LEDGER
4 |
5 | If your issue is with steexp.com itself or you have any suggestion or comment please enter the details below. Thank you!
6 |
7 | ## Issue Description
8 |
--------------------------------------------------------------------------------
/src/__tests__/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom'
3 | import App from '../App'
4 |
5 | import '../__mocks__/MockXHR.js'
6 |
7 | // avoid the call out to get the rate
8 | jest.mock('../components/shared/LumensRates', () => 'rates')
9 |
10 | it.skip('renders without crashing', () => {
11 | const div = document.createElement('div')
12 | ReactDOM.render(, div)
13 | })
14 |
--------------------------------------------------------------------------------
/src/components/operations/ChangeTrust.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Trust from './Trust'
3 | import { FormattedMessage } from 'react-intl'
4 |
5 | const ChangeTrust = (props) => (
6 |
7 |
13 |
14 | )
15 |
16 | export default ChangeTrust
17 |
--------------------------------------------------------------------------------
/.github/workflows/docker-image.yml:
--------------------------------------------------------------------------------
1 | name: Docker Image CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 |
11 | build:
12 |
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - uses: actions/checkout@v3
17 | - name: Build the Docker image
18 | run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
19 |
--------------------------------------------------------------------------------
/app/controllers/AccountController.js:
--------------------------------------------------------------------------------
1 | import { getAccount } from '../utils/horizon';
2 | import { getAccountBalance } from '../utils/stellar';
3 |
4 | export async function getAccountData(req, res) {
5 | const accountId = req.params.accountId;
6 | const account = await getAccount(accountId);
7 | const accountBalance = await getAccountBalance(accountId);
8 | res.render('account', { account, accountBalance });
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/shared/JSONButton.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import BackendResourceBadgeButton from './BackendResourceBadgeButton'
3 |
4 | /**
5 | * 'JSON' button that when clicked will show the contents of the backend JSON
6 | * resource at 'url'.
7 | */
8 | const JSONButton = ({ url, filterFn }) => (
9 |
10 | )
11 |
12 | export default JSONButton
13 |
--------------------------------------------------------------------------------
/src/lib/__tests__/csv.test.js:
--------------------------------------------------------------------------------
1 | import { jsonToCSV } from '../csv.js'
2 |
3 | import effectsRecords from './__data__/effects'
4 | import pathPaymentsRecords from './__data__/pathPayments'
5 |
6 | describe('jsonToCSV', () => {
7 | test('effects', () => {
8 | expect(jsonToCSV(effectsRecords)).toMatchSnapshot()
9 | })
10 | test('pathPayments', () => {
11 | expect(jsonToCSV(pathPaymentsRecords)).toMatchSnapshot()
12 | })
13 | })
14 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/__snapshots__/TitleWithJSONButton.test.js.snap:
--------------------------------------------------------------------------------
1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
2 |
3 | exports[`renders button with given url 1`] = `
4 | Array [
5 |
6 |
7 | Ledger
8 |
9 |
12 |
15 |
16 |
,
17 | ]
18 | `;
19 |
--------------------------------------------------------------------------------
/.github/workflows/rust.yml:
--------------------------------------------------------------------------------
1 | name: Rust
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | env:
10 | CARGO_TERM_COLOR: always
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Build
20 | run: cargo build --verbose
21 | - name: Run tests
22 | run: cargo test --verbose
23 |
--------------------------------------------------------------------------------
/public/img/support.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Accounts.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Row from 'react-bootstrap/lib/Row'
4 |
5 | import AccountTable from './AccountTable'
6 |
7 | class Accounts extends React.Component {
8 | render () {
9 | return (
10 |
11 |
12 |
13 |
14 |
15 | )
16 | }
17 | }
18 |
19 | export default Accounts
20 |
--------------------------------------------------------------------------------
/.github/workflows/crystal.yml:
--------------------------------------------------------------------------------
1 | name: Crystal CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | container:
15 | image: crystallang/crystal
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Install dependencies
20 | run: shards install
21 | - name: Run tests
22 | run: crystal spec
23 |
--------------------------------------------------------------------------------
/app/controllers/TransactionController.js:
--------------------------------------------------------------------------------
1 | import { getTransaction } from '../utils/horizon';
2 | import { getTransactionFee } from '../utils/stellar';
3 |
4 | export async function getTransactionData(req, res) {
5 | const transactionHash = req.params.transactionHash;
6 | const transaction = await getTransaction(transactionHash);
7 | const transactionFee = await getTransactionFee(transactionHash);
8 | res.render('transaction', { transaction, transactionFee });
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/operations/Trust.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import AccountLink from '../shared/AccountLink'
3 | import { FormattedMessage } from 'react-intl'
4 |
5 | const Trust = ({ assetCode, children, trustee }) => (
6 |
7 |
12 | }}
13 | />
14 | {children}
15 |
16 | )
17 |
18 | export default Trust
19 |
--------------------------------------------------------------------------------
/.github/workflows/c-cpp.yml:
--------------------------------------------------------------------------------
1 | name: C/C++ CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: configure
17 | run: ./configure
18 | - name: make
19 | run: make
20 | - name: make check
21 | run: make check
22 | - name: make distcheck
23 | run: make distcheck
24 |
--------------------------------------------------------------------------------
/src/components/shared/ExportButton.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 |
4 | /**
5 | * 'Export data to CSV' button that when clicked will generate a CSV file
6 | * with the records and offer it in the browser for download.
7 | */
8 | const ExportButton = ({ onClick, label }) => (
9 |
12 | )
13 |
14 | export default ExportButton
15 |
--------------------------------------------------------------------------------
/.github/workflows/erlang.yml:
--------------------------------------------------------------------------------
1 | name: Erlang CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | permissions:
10 | contents: read
11 |
12 | jobs:
13 |
14 | build:
15 |
16 | runs-on: ubuntu-latest
17 |
18 | container:
19 | image: erlang:22.0.7
20 |
21 | steps:
22 | - uses: actions/checkout@v3
23 | - name: Compile
24 | run: rebar3 compile
25 | - name: Run tests
26 | run: rebar3 do eunit, ct
27 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom'
3 | import './index.css'
4 | import App from './App'
5 |
6 | // TODO: Re-enable service worker after renaming the PWA and updating its icon (see manifest.json)
7 | import registerServiceWorker from './registerServiceWorker'
8 | // import { unregister as unregisterServiceWorker } from './registerServiceWorker';
9 |
10 | ReactDOM.render(, document.getElementById('root'))
11 | registerServiceWorker()
12 |
13 | // unregisterServiceWorker()
14 |
--------------------------------------------------------------------------------
/.github/workflows/greetings.yml:
--------------------------------------------------------------------------------
1 | name: Greetings
2 |
3 | on: [pull_request_target, issues]
4 |
5 | jobs:
6 | greeting:
7 | runs-on: ubuntu-latest
8 | permissions:
9 | issues: write
10 | pull-requests: write
11 | steps:
12 | - uses: actions/first-interaction@v1
13 | with:
14 | repo-token: ${{ secrets.GITHUB_TOKEN }}
15 | issue-message: "Message that will be displayed on users' first issue"
16 | pr-message: "Message that will be displayed on users' first pull request"
17 |
--------------------------------------------------------------------------------
/app/server.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import helmet from 'helmet';
3 | import compression from 'compression';
4 | import cors from 'cors';
5 | import routes from './routes';
6 |
7 | const app = express();
8 |
9 | app.use(helmet());
10 | app.use(compression());
11 | app.use(cors());
12 | app.use(express.json());
13 | app.use(express.urlencoded({ extended: true }));
14 |
15 | app.use('/', routes);
16 |
17 | app.listen(3000, () => {
18 | console.log('Revoluterium Block Explorer listening on port 3000');
19 | });
20 |
--------------------------------------------------------------------------------
/src/lib/stellar/networks.js:
--------------------------------------------------------------------------------
1 | const networks = {
2 | public: 'public',
3 | test: 'testnet',
4 | local: 'local'
5 | }
6 |
7 | const hostnameToNetworkType = (hostname) => {
8 | if (hostname === 'steexp.com' || hostname === 'publicnet.local') {
9 | return networks.public
10 | } else if (
11 | hostname === 'testnet.steexp.com' ||
12 | hostname === 'testnet.local'
13 | ) {
14 | return networks.test
15 | } else return networks.local
16 | }
17 |
18 | export { networks as default, hostnameToNetworkType }
19 |
--------------------------------------------------------------------------------
/views/block.ejs:
--------------------------------------------------------------------------------
1 | Block <%= block.hash %>
2 |
3 |
4 | - Block Number: <%= block.number %>
5 | - Block Hash: <%= block.hash %>
6 | - Previous Block Hash: <%= block.previous_block_hash %>
7 | - Transactions: <%= block.transactions.length %>
8 |
9 |
10 | Transactions
11 |
12 |
13 | <% block.transactions.forEach(transaction => { %>
14 | -
15 | <%= transaction.hash %>
16 | (<%= transaction.type %>)
17 |
18 | <% }); %>
19 |
20 |
--------------------------------------------------------------------------------
/.github/workflows/makefile.yml:
--------------------------------------------------------------------------------
1 | name: Makefile CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 |
17 | - name: configure
18 | run: ./configure
19 |
20 | - name: Install dependencies
21 | run: make
22 |
23 | - name: Run check
24 | run: make check
25 |
26 | - name: Run distcheck
27 | run: make distcheck
28 |
--------------------------------------------------------------------------------
/src/components/operations/AllowTrust.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 | import AccountLink from '../shared/AccountLink'
4 | import Trust from './Trust'
5 |
6 | const AllowTrust = (props) => (
7 |
8 |
13 | }}
14 | />
15 |
16 | )
17 |
18 | export default AllowTrust
19 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/JSONButton.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { configure, shallow } from 'enzyme'
3 | import Adapter from 'enzyme-adapter-react-16'
4 |
5 | import JSONButton from '../JSONButton'
6 |
7 | configure({ adapter: new Adapter() })
8 |
9 | it('renders button with given url', () => {
10 | const url = 'https://somebackend.xyz/resource/12345'
11 |
12 | const btn = shallow()
13 | expect(btn.props().url).toEqual(url)
14 |
15 | expect(btn.getElements()).toMatchSnapshot()
16 | })
17 |
--------------------------------------------------------------------------------
/src/components/shared/StellarTomlBadge.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import BackendResourceBadgeButton from './BackendResourceBadgeButton'
4 |
5 | const Badge = ({ domain }) => {
6 | const tomlUrl = `https://${domain}/.well-known/stellar.toml`
7 | return (
8 |
9 |
10 |
11 | )
12 | }
13 |
14 | Badge.propTypes = {
15 | domain: PropTypes.string.isRequired
16 | }
17 |
18 | export default Badge
19 |
--------------------------------------------------------------------------------
/.github/workflows/swift.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a Swift project
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift
3 |
4 | name: Swift
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: macos-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Build
20 | run: swift build -v
21 | - name: Run tests
22 | run: swift test -v
23 |
--------------------------------------------------------------------------------
/src/components/shared/Spinner.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import MDSpinner from 'react-md-spinner'
3 | import { withEither } from './HOCs'
4 |
5 | const Spinner = () => (
6 |
7 |
14 |
15 | )
16 |
17 | const isLoading = (props) => props.isLoading === true
18 |
19 | const withSpinner = () => withEither(isLoading, Spinner)
20 |
21 | export { Spinner, withSpinner }
22 |
--------------------------------------------------------------------------------
/app/routes.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import { BlockController } from './controllers/BlockController';
3 | import { TransactionController } from './controllers/TransactionController';
4 | import { AccountController } from './controllers/AccountController';
5 |
6 | const router = express.Router();
7 |
8 | router.get('/block/:blockHash', BlockController.getBlockData);
9 | router.get('/transaction/:transactionHash', TransactionController.getTransactionData);
10 | router.get('/account/:accountId', AccountController.getAccountData);
11 |
12 | export default router;
13 |
--------------------------------------------------------------------------------
/src/components/shared/HOCs.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { getContext } from 'recompose'
3 | import PropTypes from 'prop-types'
4 |
5 | const withEither =
6 | (conditionalRenderingFn, EitherComponent) => (Component) => (props) =>
7 | conditionalRenderingFn(props)
8 | ? (
9 |
10 | )
11 | : (
12 |
13 | )
14 |
15 | // @see App.js which puts this stellar server handle on the context
16 | const withServer = getContext({ server: PropTypes.object })
17 |
18 | export { withEither, withServer }
19 |
--------------------------------------------------------------------------------
/.github/workflows/jekyll-docker.yml:
--------------------------------------------------------------------------------
1 | name: Jekyll site CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: Build the site in the jekyll/builder container
17 | run: |
18 | docker run \
19 | -v ${{ github.workspace }}:/srv/jekyll -v ${{ github.workspace }}/_site:/srv/jekyll/_site \
20 | jekyll/builder:latest /bin/bash -c "chmod -R 777 /srv/jekyll && jekyll build --future"
21 |
--------------------------------------------------------------------------------
/app/utils/stellar.js:
--------------------------------------------------------------------------------
1 | import { StellarSDK } from 'tellar-sdk';
2 |
3 | const stellar = new StellarSDK();
4 |
5 | export async function getAccountBalance(accountId) {
6 | const account = await stellar.accounts.getAccount(accountId);
7 | return account.balances;
8 | }
9 |
10 | export async function getTransactionFee(transactionHash) {
11 | const transaction = await stellar.transactions.getTransaction(transactionHash);
12 | return transaction.fee;
13 | }
14 |
15 | export async function getBlockTime(blockHash) {
16 | const block = await stellar.blocks.getBlock(blockHash);
17 | return block.timestamp;
18 | }
19 |
--------------------------------------------------------------------------------
/.github/workflows/android.yml:
--------------------------------------------------------------------------------
1 | name: Android CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: set up JDK 11
17 | uses: actions/setup-java@v3
18 | with:
19 | java-version: '11'
20 | distribution: 'temurin'
21 | cache: gradle
22 |
23 | - name: Grant execute permission for gradlew
24 | run: chmod +x gradlew
25 | - name: Build with Gradle
26 | run: ./gradlew build
27 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/TitleWithJSONButton.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { configure, shallow } from 'enzyme'
3 | import Adapter from 'enzyme-adapter-react-16'
4 |
5 | import { TitleWithJSONButton } from '../TitleWithJSONButton'
6 |
7 | configure({ adapter: new Adapter() })
8 |
9 | it('renders button with given url', () => {
10 | const url = 'https://somebackend.xyz/ledger/12345'
11 | const title = 'Ledger'
12 | const btn = shallow()
13 | expect(btn.find('JSONButton').props().url).toEqual(url)
14 | expect(btn.getElements()).toMatchSnapshot()
15 | })
16 |
--------------------------------------------------------------------------------
/.github/workflows/npm-gulp.yml:
--------------------------------------------------------------------------------
1 | name: NodeJS with Gulp
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 |
13 | strategy:
14 | matrix:
15 | node-version: [14.x, 16.x, 18.x]
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 |
20 | - name: Use Node.js ${{ matrix.node-version }}
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: ${{ matrix.node-version }}
24 |
25 | - name: Build
26 | run: |
27 | npm install
28 | gulp
29 |
--------------------------------------------------------------------------------
/.github/workflows/npm-grunt.yml:
--------------------------------------------------------------------------------
1 | name: NodeJS with Grunt
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 |
13 | strategy:
14 | matrix:
15 | node-version: [14.x, 16.x, 18.x]
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 |
20 | - name: Use Node.js ${{ matrix.node-version }}
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: ${{ matrix.node-version }}
24 |
25 | - name: Build
26 | run: |
27 | npm install
28 | grunt
29 |
--------------------------------------------------------------------------------
/.github/workflows/webpack.yml:
--------------------------------------------------------------------------------
1 | name: NodeJS with Webpack
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 |
13 | strategy:
14 | matrix:
15 | node-version: [14.x, 16.x, 18.x]
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 |
20 | - name: Use Node.js ${{ matrix.node-version }}
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: ${{ matrix.node-version }}
24 |
25 | - name: Build
26 | run: |
27 | npm install
28 | npx webpack
29 |
--------------------------------------------------------------------------------
/.github/workflows/label.yml:
--------------------------------------------------------------------------------
1 | # This workflow will triage pull requests and apply a label based on the
2 | # paths that are modified in the pull request.
3 | #
4 | # To use this workflow, you will need to set up a .github/labeler.yml
5 | # file with configuration. For more information, see:
6 | # https://github.com/actions/labeler
7 |
8 | name: Labeler
9 | on: [pull_request]
10 |
11 | jobs:
12 | label:
13 |
14 | runs-on: ubuntu-latest
15 | permissions:
16 | contents: read
17 | pull-requests: write
18 |
19 | steps:
20 | - uses: actions/labeler@v4
21 | with:
22 | repo-token: "${{ secrets.GITHUB_TOKEN }}"
23 |
--------------------------------------------------------------------------------
/public/search.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Blockexplorer
4 | Blockexplorer for the Pi Network
5 | UTF-8
6 | https://minepi.com/blockexplorer/favicon-32x32.png
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/src/components/shared/PagingControls.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Pager from 'react-bootstrap/lib/Pager'
3 | import { FormattedMessage } from 'react-intl'
4 |
5 | const PagingControls = ({ handleClickNext, handleClickPrev, hidePrev }) => (
6 |
7 | {!hidePrev && (
8 |
9 | ←
10 |
11 | )}
12 |
13 | →
14 |
15 |
16 | )
17 |
18 | export default PagingControls
19 |
--------------------------------------------------------------------------------
/.github/workflows/pylint.yml:
--------------------------------------------------------------------------------
1 | name: Pylint
2 |
3 | on: [push]
4 |
5 | jobs:
6 | build:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | matrix:
10 | python-version: ["3.8", "3.9", "3.10"]
11 | steps:
12 | - uses: actions/checkout@v3
13 | - name: Set up Python ${{ matrix.python-version }}
14 | uses: actions/setup-python@v3
15 | with:
16 | python-version: ${{ matrix.python-version }}
17 | - name: Install dependencies
18 | run: |
19 | python -m pip install --upgrade pip
20 | pip install pylint
21 | - name: Analysing the code with pylint
22 | run: |
23 | pylint $(git ls-files '*.py')
24 |
--------------------------------------------------------------------------------
/src/components/shared/TransactionHash.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import { Link } from 'react-router-dom'
4 | import { shortHash } from '../../lib/utils'
5 |
6 | const TransactionHash = ({ hash, compact = true }) => {
7 | const hashLabel = compact ? shortHash(hash) : hash
8 | const className = !compact ? 'monospace' : ''
9 | return (
10 |
11 | {hashLabel}
12 |
13 | )
14 | }
15 | TransactionHash.propTypes = {
16 | hash: PropTypes.string.isRequired,
17 | compact: PropTypes.bool
18 | }
19 |
20 | export default TransactionHash
21 |
--------------------------------------------------------------------------------
/.github/workflows/go.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a golang project
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
3 |
4 | name: Go
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 |
14 | build:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - uses: actions/checkout@v3
18 |
19 | - name: Set up Go
20 | uses: actions/setup-go@v4
21 | with:
22 | go-version: '1.20'
23 |
24 | - name: Build
25 | run: go build -v ./...
26 |
27 | - name: Test
28 | run: go test -v ./...
29 |
--------------------------------------------------------------------------------
/config/polyfills.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | if (typeof Promise === 'undefined') {
4 | // Rejection tracking prevents a common issue where React gets into an
5 | // inconsistent state due to an error, but it gets swallowed by a Promise,
6 | // and the user has no idea what causes React's erratic future behavior.
7 | require('promise/lib/rejection-tracking').enable()
8 | window.Promise = require('promise/lib/es6-extensions.js')
9 | }
10 |
11 | // fetch() polyfill for making API calls.
12 | require('whatwg-fetch')
13 |
14 | // Object.assign() is commonly used with React.
15 | // It will use the native implementation if it's present and isn't buggy.
16 | Object.assign = require('object-assign')
17 |
--------------------------------------------------------------------------------
/.github/workflows/ant.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a Java project with Ant
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
3 |
4 | name: Java CI
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Set up JDK 11
20 | uses: actions/setup-java@v3
21 | with:
22 | java-version: '11'
23 | distribution: 'temurin'
24 | - name: Build with Ant
25 | run: ant -noinput -buildfile build.xml
26 |
--------------------------------------------------------------------------------
/ai/predictive_analytics/predict.py:
--------------------------------------------------------------------------------
1 | import pandas as pd
2 | import tensorflow as tf
3 |
4 | # Load dataset
5 | df = pd.read_csv('user_data.csv')
6 |
7 | # Define model architecture
8 | model = tf.keras.models.Sequential([
9 | tf.keras.layers.Dense(64, activation='relu', input_shape=(df.shape[1],)),
10 | tf.keras.layers.Dense(32, activation='relu'),
11 | tf.keras.layers.Dense(1, activation='sigmoid')
12 | ])
13 |
14 | # Compile model
15 | model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
16 |
17 | # Train model
18 | model.fit(df.drop('target', axis=1), df['target'], epochs=10)
19 |
20 | # Make predictions
21 | predictions = model.predict(df.drop('target', axis=1))
22 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Blockexplorer",
3 | "name": "Blockexplorer",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "theme_color": "#000000",
7 | "background_color": "#000000",
8 | "icons": [
9 | {
10 | "src": "favicon.ico",
11 | "sizes": "32x32",
12 | "type": "image/x-icon"
13 | },
14 | {
15 | "src": "logo512.png",
16 | "sizes": "512x512",
17 | "type": "image/png"
18 | },
19 | {
20 | "src": "logo128.png",
21 | "sizes": "128x128",
22 | "type": "image/png"
23 | },
24 | {
25 | "src": "logo64.png",
26 | "sizes": "64x64",
27 | "type": "image/png"
28 | }
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/src/components/shared/TitleWithJSONButton.js:
--------------------------------------------------------------------------------
1 | import PropTypes from 'prop-types'
2 | import React from 'react'
3 | import JSONButton from './JSONButton'
4 |
5 | const TitleWithJSONButton = ({ title, url }) => (
6 |
7 | {title}
8 |
9 |
10 |
11 |
12 | )
13 |
14 | TitleWithJSONButton.propTypes = {
15 | title: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,
16 | url: PropTypes.string.isRequired
17 | }
18 |
19 | const titleWithJSONButton = (title, url) => {
20 | return
21 | }
22 |
23 | export { titleWithJSONButton, TitleWithJSONButton }
24 |
--------------------------------------------------------------------------------
/src/components/operations/PathPayment.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Payment from './Payment'
3 | import Asset from '../shared/Asset'
4 | import { FormattedMessage } from 'react-intl'
5 |
6 | const PathPayment = (props) => {
7 | const sourceAsset = (
8 |
13 | )
14 | return (
15 |
16 |
23 |
24 | )
25 | }
26 |
27 | export default PathPayment
28 |
--------------------------------------------------------------------------------
/src/components/operations/CreateAccount.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import { FormattedMessage } from 'react-intl'
4 | import AccountLink from '../shared/AccountLink'
5 | import FormattedAmount from '../shared/FormattedAmount'
6 |
7 | const CreateAccount = ({ account, startingBalance }) => (
8 | ,
12 | balance:
13 | }}
14 | />
15 | )
16 |
17 | CreateAccount.propTypes = {
18 | account: PropTypes.string.isRequired,
19 | startingBalance: PropTypes.string.isRequired
20 | }
21 |
22 | export default CreateAccount
23 |
--------------------------------------------------------------------------------
/public/img/gh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/__snapshots__/LumensRates.test.js.snap:
--------------------------------------------------------------------------------
1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
2 |
3 | exports[`render negative change in rate 1`] = `
4 | Array [
5 |
6 | Test-π/USD:
7 | 0.025
8 |
9 |
16 | -1.52%
17 |
18 | ,
19 | ]
20 | `;
21 |
22 | exports[`render positive change in rate 1`] = `
23 | Array [
24 |
25 | Test-π/USD:
26 | 0.020
27 |
28 |
35 | +2.1%
36 |
37 | ,
38 | ]
39 | `;
40 |
--------------------------------------------------------------------------------
/config/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | // Horizon API endpoint
3 | horizonUrl: 'https://horizon-testnet.stellar.org/',
4 |
5 | // Local development network settings
6 | localNetwork: {
7 | horizonUrl: 'http://localhost:8000/',
8 | testnetUrl: 'http://testnet.local:3000/',
9 | publicnetUrl: 'http://publicnet.local:3000/',
10 | },
11 |
12 | // Language settings
13 | languages: [
14 | { code: 'en', name: 'English' },
15 | { code: 'es', name: 'Spanish' },
16 | { code: 'fr', name: 'French' },
17 | // Add more languages here
18 | ],
19 |
20 | // Blockchain settings
21 | blockchain: {
22 | network: 'testnet', // or 'publicnet'
23 | horizonInstance: 'testnet.local', // or 'publicnet.local'
24 | },
25 | };
26 |
--------------------------------------------------------------------------------
/src/components/Trades.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import TradeTable from './TradeTable'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Trades extends React.Component {
10 | render () {
11 | setTitle('Trades')
12 | const { formatMessage } = this.props.intl
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Trades)
26 |
--------------------------------------------------------------------------------
/src/components/shared/Asset.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import AccountLink from './AccountLink'
4 |
5 | const Asset = ({ code, issuer, type }) => {
6 | const isLumens = type === 'native'
7 | const propCode = isLumens ? 'Test-π' : code
8 | return (
9 |
10 | {propCode}{' '}
11 | {!isLumens && (
12 |
13 | []
14 |
15 | )}
16 |
17 | )
18 | }
19 |
20 | // For Test-π code and issuer aren't set. type will be 'native'
21 | Asset.propTypes = {
22 | code: PropTypes.string,
23 | issuer: PropTypes.string,
24 | type: PropTypes.string.isRequired
25 | }
26 |
27 | export default Asset
28 |
--------------------------------------------------------------------------------
/src/lib/stellar/utils.js:
--------------------------------------------------------------------------------
1 | import { StrKey } from 'stellar-base/lib/strkey'
2 |
3 | const STROOPS_PER_LUMEN = 10000000
4 | const stroopsToLumens = (stroops) => stroops / STROOPS_PER_LUMEN
5 |
6 | // stellar federated address (eg. "stellar*fed.network")
7 | const isFederatedAddress = (addr) => /^[^*,]*\*[a-z0-9-.]*$/i.test(addr)
8 | const isMuxedAddress = (addr) => StrKey.isValidMed25519PublicKey(addr)
9 | const isPublicKey = (keyStr) => StrKey.isValidEd25519PublicKey(keyStr)
10 | const isSecretKey = (keyStr) => StrKey.isValidEd25519SecretSeed(keyStr)
11 | const isTxHash = (hashStr) => /^[0-9a-f]{64}$/i.test(hashStr)
12 |
13 | export {
14 | isFederatedAddress,
15 | isMuxedAddress,
16 | isPublicKey,
17 | isSecretKey,
18 | isTxHash,
19 | stroopsToLumens
20 | }
21 |
--------------------------------------------------------------------------------
/.github/workflows/dotnet.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a .NET project
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
3 |
4 | name: .NET
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Setup .NET
20 | uses: actions/setup-dotnet@v3
21 | with:
22 | dotnet-version: 6.0.x
23 | - name: Restore dependencies
24 | run: dotnet restore
25 | - name: Build
26 | run: dotnet build --no-restore
27 | - name: Test
28 | run: dotnet test --no-build --verbosity normal
29 |
--------------------------------------------------------------------------------
/src/components/Effects.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import EffectTable from './EffectTable'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Effects extends React.Component {
10 | render () {
11 | setTitle('Effects')
12 | const { formatMessage } = this.props.intl
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Effects)
26 |
--------------------------------------------------------------------------------
/.github/workflows/django.yml:
--------------------------------------------------------------------------------
1 | name: Django CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 | strategy:
14 | max-parallel: 4
15 | matrix:
16 | python-version: [3.7, 3.8, 3.9]
17 |
18 | steps:
19 | - uses: actions/checkout@v3
20 | - name: Set up Python ${{ matrix.python-version }}
21 | uses: actions/setup-python@v3
22 | with:
23 | python-version: ${{ matrix.python-version }}
24 | - name: Install Dependencies
25 | run: |
26 | python -m pip install --upgrade pip
27 | pip install -r requirements.txt
28 | - name: Run Tests
29 | run: |
30 | python manage.py test
31 |
--------------------------------------------------------------------------------
/src/components/Payments.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import PaymentTable from './PaymentTable'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Payments extends React.Component {
10 | render () {
11 | const { formatMessage } = this.props.intl
12 | setTitle('Payments')
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Payments)
26 |
--------------------------------------------------------------------------------
/app/utils/horizon.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | const horizonUrl = 'https://horizon-testnet.stellar.org/';
4 |
5 | export async function getBlock(blockHash) {
6 | const response = await axios.get(`${horizonUrl}blocks/${blockHash}`);
7 | return response.data;
8 | }
9 |
10 | export async function getTransaction(transactionHash) {
11 | const response = await axios.get(`${horizonUrl}transactions/${transactionHash}`);
12 | return response.data;
13 | }
14 |
15 | export async function getAccount(accountId) {
16 | const response = await axios.get(`${horizonUrl}accounts/${accountId}`);
17 | return response.data;
18 | }
19 |
20 | export async function getLedger(ledgerSeq) {
21 | const response = await axios.get(`${horizonUrl}ledgers/${ledgerSeq}`);
22 | return response.data;
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/Ledgers.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import LedgerTable from './LedgerTableContainer'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Ledgers extends React.Component {
10 | render () {
11 | setTitle('Ledgers')
12 | const { formatMessage } = this.props.intl
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Ledgers)
26 |
--------------------------------------------------------------------------------
/src/components/shared/Error.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Row from 'react-bootstrap/lib/Row'
4 | import { FormattedMessage } from 'react-intl'
5 |
6 | const knownErrors = ['network']
7 |
8 | class Error extends React.Component {
9 | render () {
10 | const id = this.props.match.params.id
11 | return (
12 |
13 |
14 |
15 | {id && knownErrors.indexOf(id) !== -1
16 | ? (
17 |
18 | )
19 | : (
20 |
21 | )}
22 |
23 |
24 |
25 | )
26 | }
27 | }
28 |
29 | export default Error
30 |
--------------------------------------------------------------------------------
/public/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Operations.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import OperationTable from './OperationTable'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Operations extends React.Component {
10 | render () {
11 | setTitle('Operations')
12 | const { formatMessage } = this.props.intl
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Operations)
26 |
--------------------------------------------------------------------------------
/src/img/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/layout/NetworkSelector.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { networks } from '../../lib/stellar'
3 |
4 | const NetworkButton = ({
5 | networkType,
6 | selectedNetworkType,
7 | switchNetworkType
8 | }) => (
9 |
17 | )
18 |
19 | const NetworkSelector = (props) => (
20 |
21 |
27 |
28 | )
29 |
30 | export default NetworkSelector
31 |
--------------------------------------------------------------------------------
/src/components/shared/TitleWithLink.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router-dom'
3 | import PropTypes from 'prop-types'
4 |
5 | const linkStyle = { color: 'white', textDecoration: 'underline' }
6 |
7 | class TitleWithLink extends React.Component {
8 | render () {
9 | const { title, rightLinkLabel, rightLinkAddr } = this.props
10 | return (
11 |
12 | {title}
13 |
14 | {rightLinkLabel}
15 |
16 |
17 | )
18 | }
19 | }
20 |
21 | TitleWithLink.propTypes = {
22 | title: PropTypes.string.isRequired,
23 | rightLinkLabel: PropTypes.string.isRequired,
24 | rightLinkAddr: PropTypes.string.isRequired
25 | }
26 |
27 | export default TitleWithLink
28 |
--------------------------------------------------------------------------------
/scripts/test.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | // Do this as the first thing so that any code reading it knows the right env.
4 | process.env.BABEL_ENV = 'test'
5 | process.env.NODE_ENV = 'test'
6 | process.env.PUBLIC_URL = ''
7 |
8 | // Makes the script crash on unhandled rejections instead of silently
9 | // ignoring them. In the future, promise rejections that are not handled will
10 | // terminate the Node.js process with a non-zero exit code.
11 | process.on('unhandledRejection', (err) => {
12 | throw err
13 | })
14 |
15 | // Ensure environment variables are read.
16 | require('../config/env')
17 |
18 | const jest = require('jest')
19 | const argv = process.argv.slice(2)
20 |
21 | // Watch unless on CI or in coverage mode
22 | if (!process.env.CI && argv.indexOf('--coverage') < 0) {
23 | argv.push('--watch')
24 | }
25 |
26 | jest.run(argv)
27 |
--------------------------------------------------------------------------------
/src/components/Transactions.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Panel from 'react-bootstrap/lib/Panel'
4 | import Row from 'react-bootstrap/lib/Row'
5 | import { injectIntl } from 'react-intl'
6 | import TransactionTable from './TransactionTableContainer'
7 | import { setTitle } from '../lib/utils'
8 |
9 | class Transactions extends React.Component {
10 | render () {
11 | setTitle('Transactions')
12 | const { formatMessage } = this.props.intl
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default injectIntl(Transactions)
26 |
--------------------------------------------------------------------------------
/.github/workflows/stale.yml:
--------------------------------------------------------------------------------
1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
2 | #
3 | # You can adjust the behavior by modifying this file.
4 | # For more information, see:
5 | # https://github.com/actions/stale
6 | name: Mark stale issues and pull requests
7 |
8 | on:
9 | schedule:
10 | - cron: '23 3 * * *'
11 |
12 | jobs:
13 | stale:
14 |
15 | runs-on: ubuntu-latest
16 | permissions:
17 | issues: write
18 | pull-requests: write
19 |
20 | steps:
21 | - uses: actions/stale@v5
22 | with:
23 | repo-token: ${{ secrets.GITHUB_TOKEN }}
24 | stale-issue-message: 'Stale issue message'
25 | stale-pr-message: 'Stale pull request message'
26 | stale-issue-label: 'no-issue-activity'
27 | stale-pr-label: 'no-pr-activity'
28 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/LumensRates.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { configure, shallow } from 'enzyme'
3 | import Adapter from 'enzyme-adapter-react-16'
4 |
5 | import { LumensRates } from '../LumensRates'
6 |
7 | configure({ adapter: new Adapter() })
8 |
9 | it('render positive change in rate', () => {
10 | const rate = shallow()
11 | const changeEl = rate.find('span[style]')
12 | expect(changeEl.props().style.color).toEqual('#00c292')
13 | expect(rate.getElements()).toMatchSnapshot()
14 | })
15 |
16 | it('render negative change in rate', () => {
17 | const rate = shallow()
18 | const changeEl = rate.find('span[style]')
19 | expect(changeEl.props().style.color).toEqual('#fb9678')
20 | expect(rate.getElements()).toMatchSnapshot()
21 | })
22 |
--------------------------------------------------------------------------------
/docker/nginx-defaults.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | server_name localhost;
4 | root /usr/share/nginx/html;
5 | index index.html index.htm;
6 |
7 | #access_log /var/log/nginx/host.access.log main;
8 |
9 | location /blockexplorer {
10 | alias /usr/share/nginx/html;
11 |
12 | # First attempt to serve the requested file, then fall back to index.html, which loads the React app.
13 | try_files $uri /blockexplorer/index.html;
14 |
15 | location ~ ^.+\.(html?)$ {
16 | add_header Cache-Control "public, max-age=300";
17 | }
18 | }
19 |
20 | # error_page 404 /index.html;
21 |
22 | # redirect server error pages to the static page /50x.html
23 | error_page 500 502 503 504 /50x.html;
24 | location = /50x.html {
25 | root /usr/share/nginx/html;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/components/shared/OperationType.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import { shortHash } from '../../lib/utils'
4 |
5 | const filterFor = (type) => {
6 | window.location.href =
7 | window.location.pathname + '?opTypeFilter=' + type + window.location.hash
8 | }
9 |
10 | const OperationType = ({ type, compact = true }) => {
11 | const hashLabel = compact ? shortHash(type) : type
12 | const className = !compact ? 'monospace' : ''
13 | const fn = (event) => {
14 | event.preventDefault()
15 | filterFor(type)
16 | }
17 | return (
18 |
19 |
20 | {hashLabel}
21 |
22 |
23 | )
24 | }
25 | OperationType.propTypes = {
26 | type: PropTypes.string.isRequired,
27 | compact: PropTypes.bool
28 | }
29 |
30 | export { OperationType as default, filterFor }
31 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | collectCoverageFrom: ['src/**/*.{js,jsx}'],
3 | setupFiles: [
4 | '/config/polyfills.js',
5 | '/config/animationShim.js'
6 | ],
7 | testMatch: [
8 | '/src/**/__tests__/**/*.js?(x)',
9 | '/src/**/?(*.)(spec|test).js?(x)'
10 | ],
11 | testPathIgnorePatterns: ['/__data__/'],
12 | testEnvironment: 'node',
13 | testURL: 'http://localhost',
14 | transform: {
15 | '^.+\\.(js|jsx)$': '/node_modules/babel-jest',
16 | '^.+\\.css$': '/config/jest/cssTransform.js',
17 | '^(?!.*\\.(js|jsx|css|json)$)': '/config/jest/fileTransform.js'
18 | },
19 | transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$'],
20 | moduleNameMapper: {
21 | '^react-native$': 'react-native-web'
22 | },
23 | moduleFileExtensions: ['web.js', 'js', 'json', 'web.jsx', 'jsx', 'node']
24 | }
25 |
--------------------------------------------------------------------------------
/src/components/LedgerTableContainer.js:
--------------------------------------------------------------------------------
1 | import { compose } from 'recompose'
2 | import { withPaging } from './shared/Paging'
3 | import { withDataFetchingContainer } from './shared/DataFetchingContainer'
4 | import LedgerTable from './LedgerTable'
5 |
6 | const rspRecToPropsRec = (rspRec) => {
7 | return {
8 | sequence: rspRec.sequence,
9 | time: rspRec.closed_at,
10 | txCountSuccessful: rspRec.successful_transaction_count,
11 | txCountFailed: rspRec.failed_transaction_count
12 | }
13 | }
14 |
15 | const fetchRecords = (props) => {
16 | const builder = props.server.ledgers()
17 | builder.limit(props.limit)
18 | builder.order('desc')
19 | return builder.call()
20 | }
21 |
22 | const callBuilder = (props) => props.server.ledgers()
23 |
24 | const enhance = compose(
25 | withPaging(),
26 | withDataFetchingContainer(fetchRecords, rspRecToPropsRec, callBuilder)
27 | )
28 | export default enhance(LedgerTable)
29 |
--------------------------------------------------------------------------------
/src/data/inflation_pools.json:
--------------------------------------------------------------------------------
1 | {
2 | "GBL7AE2HGRNQSPWV56ZFLILXNT52QWSMOQGDBBXYOP7XKMQTCKVMX2ZL": {
3 | "name": "futuretense.io",
4 | "website": "https://pool.futuretense.io"
5 | },
6 | "GCCD6AJOYZCUAQLX32ZJF2MKFFAUJ53PVCFQI3RHWKL3V47QYE2BNAUT": {
7 | "name": "Lumenaut",
8 | "website": "https://lumenaut.net"
9 | },
10 | "GB56YLTH5SDOYTUGPWY5MXJ7VQTY7BEM2YVJZTN5O555VA6DJYCTY2MP": {
11 | "name": "MoonPool",
12 | "website": "https://moonpool.space"
13 | },
14 | "GAJOC4WSOL3VUHYTEQPSOY54LP3XDWBS3AEZZ4DH24NEOHBBMEQKK7I7": {
15 | "name": "Stellar Pool",
16 | "website": "https://stellarpool.net"
17 | },
18 | "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW": {
19 | "name": "StellarTerm",
20 | "website": "https://stellarterm.com"
21 | },
22 | "GA3FUYFOPWZ25YXTCA73RK2UGONHCO27OHQRSGV3VCE67UEPEFEDCOPA": {
23 | "name": "XLMPOOL",
24 | "website": "https://xlmpool.com"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/shared/NoMatchError.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Row from 'react-bootstrap/lib/Row'
4 | import { FormattedMessage } from 'react-intl'
5 |
6 | class NoMatchError extends React.Component {
7 | render () {
8 | const id = this.props.match.params.id
9 | return (
10 |
11 |
12 |
13 | {id
14 | ? (
15 |
19 | )
20 | : (
21 |
25 | )}
26 |
27 |
28 |
29 | )
30 | }
31 | }
32 |
33 | export default NoMatchError
34 |
--------------------------------------------------------------------------------
/.github/workflows/npm-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
3 |
4 | name: Node.js Package
5 |
6 | on:
7 | release:
8 | types: [created]
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v3
15 | - uses: actions/setup-node@v3
16 | with:
17 | node-version: 16
18 | - run: npm ci
19 | - run: npm test
20 |
21 | publish-npm:
22 | needs: build
23 | runs-on: ubuntu-latest
24 | steps:
25 | - uses: actions/checkout@v3
26 | - uses: actions/setup-node@v3
27 | with:
28 | node-version: 16
29 | registry-url: https://registry.npmjs.org/
30 | - run: npm ci
31 | - run: npm publish
32 | env:
33 | NODE_AUTH_TOKEN: ${{secrets.npm_token}}
34 |
--------------------------------------------------------------------------------
/.github/workflows/super-linter.yml:
--------------------------------------------------------------------------------
1 | # This workflow executes several linters on changed files based on languages used in your code base whenever
2 | # you push a code or open a pull request.
3 | #
4 | # You can adjust the behavior by modifying this file.
5 | # For more information, see:
6 | # https://github.com/github/super-linter
7 | name: Lint Code Base
8 |
9 | on:
10 | push:
11 | branches: [ "development" ]
12 | pull_request:
13 | branches: [ "development" ]
14 | jobs:
15 | run-lint:
16 | runs-on: ubuntu-latest
17 | steps:
18 | - name: Checkout code
19 | uses: actions/checkout@v3
20 | with:
21 | # Full git history is needed to get a proper list of changed files within `super-linter`
22 | fetch-depth: 0
23 |
24 | - name: Lint Code Base
25 | uses: github/super-linter@v4
26 | env:
27 | VALIDATE_ALL_CODEBASE: false
28 | DEFAULT_BRANCH: "development"
29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30 |
--------------------------------------------------------------------------------
/src/components/operations/ManageData.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 | import PropTypes from 'prop-types'
4 | import truncate from 'lodash/truncate'
5 | import { base64Decode } from '../../lib/utils'
6 |
7 | const MSG_KEY_PREFIX = 'operation.manage.data'
8 |
9 | const ManageData = ({ name, value }) => {
10 | const isRemove = value === ''
11 | return (
12 |
13 |
19 | {!isRemove && (
20 |
26 | )}
27 |
28 | )
29 | }
30 |
31 | ManageData.propTypes = {
32 | name: PropTypes.string.isRequired,
33 | value: PropTypes.string
34 | }
35 |
36 | export default ManageData
37 |
--------------------------------------------------------------------------------
/src/components/shared/InsecureNetworkError.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Row from 'react-bootstrap/lib/Row'
4 | import { FormattedMessage } from 'react-intl'
5 |
6 | class InsecureNetworkError extends React.Component {
7 | render () {
8 | const uri = this.props.location.search.replace('?', '')
9 | return (
10 |
11 |
12 |
13 |
14 | {uri
15 | ? (
16 |
20 | )
21 | : (
22 |
23 | )}
24 |
25 |
26 |
27 |
28 | )
29 | }
30 | }
31 |
32 | export default InsecureNetworkError
33 |
--------------------------------------------------------------------------------
/.github/workflows/node.js.yml:
--------------------------------------------------------------------------------
1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
3 |
4 | name: Node.js CI
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | strategy:
18 | matrix:
19 | node-version: [14.x, 16.x, 18.x]
20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
21 |
22 | steps:
23 | - uses: actions/checkout@v3
24 | - name: Use Node.js ${{ matrix.node-version }}
25 | uses: actions/setup-node@v3
26 | with:
27 | node-version: ${{ matrix.node-version }}
28 | cache: 'npm'
29 | - run: npm ci
30 | - run: npm run build --if-present
31 | - run: npm test
32 |
--------------------------------------------------------------------------------
/.github/workflows/scala.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: Scala CI
7 |
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 |
14 | permissions:
15 | contents: read
16 |
17 | jobs:
18 | build:
19 |
20 | runs-on: ubuntu-latest
21 |
22 | steps:
23 | - uses: actions/checkout@v3
24 | - name: Set up JDK 11
25 | uses: actions/setup-java@v3
26 | with:
27 | java-version: '11'
28 | distribution: 'temurin'
29 | cache: 'sbt'
30 | - name: Run tests
31 | run: sbt test
32 | # Optional: This step uploads information to the GitHub dependency graph and unblocking Dependabot alerts for the repository
33 | - name: Upload dependency graph
34 | uses: scalacenter/sbt-dependency-submission@ab086b50c947c9774b70f39fc7f6e20ca2706c91
35 |
--------------------------------------------------------------------------------
/src/components/shared/Logo.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 |
4 | // 2 supported logo forms
5 | const squareDimensions = { height: 75, width: 75 }
6 | const rectangleDimensions = { height: 40, width: 150 }
7 |
8 | // exchange image from anchor image
9 | const imagesInBoth = ['papayabot', 'papayaswap', 'ripplefox']
10 |
11 | const Logo = ({ name, type = 'anchor' }) => {
12 | const nameLower = name.toLowerCase()
13 | const imgSrc = `${process.env.PUBLIC_URL}/img/${nameLower}.png`
14 | const dimen =
15 | type !== 'exchange' || imagesInBoth.indexOf(nameLower) !== -1
16 | ? squareDimensions
17 | : rectangleDimensions
18 | return (
19 |
20 |
27 |
28 | )
29 | }
30 |
31 | Logo.propTypes = {
32 | name: PropTypes.string.isRequired,
33 | type: PropTypes.string
34 | }
35 |
36 | export default Logo
37 |
--------------------------------------------------------------------------------
/.github/workflows/d.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | name: D
6 |
7 | on:
8 | push:
9 | branches: [ "development" ]
10 | pull_request:
11 | branches: [ "development" ]
12 |
13 | permissions:
14 | contents: read
15 |
16 | jobs:
17 | build:
18 |
19 | runs-on: ubuntu-latest
20 |
21 | steps:
22 | - uses: actions/checkout@v3
23 | - uses: dlang-community/setup-dlang@4c99aa991ce7d19dd3064de0a4f2f6b2f152e2d7
24 |
25 | - name: 'Build & Test'
26 | run: |
27 | # Build the project, with its main file included, without unittests
28 | dub build --compiler=$DC
29 | # Build and run tests, as defined by `unittest` configuration
30 | # In this mode, `mainSourceFile` is excluded and `version (unittest)` are included
31 | # See https://dub.pm/package-format-json.html#configurations
32 | dub test --compiler=$DC
33 |
--------------------------------------------------------------------------------
/.github/workflows/php.yml:
--------------------------------------------------------------------------------
1 | name: PHP Composer
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | permissions:
10 | contents: read
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 |
20 | - name: Validate composer.json and composer.lock
21 | run: composer validate --strict
22 |
23 | - name: Cache Composer packages
24 | id: composer-cache
25 | uses: actions/cache@v3
26 | with:
27 | path: vendor
28 | key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
29 | restore-keys: |
30 | ${{ runner.os }}-php-
31 |
32 | - name: Install dependencies
33 | run: composer install --prefer-dist --no-progress
34 |
35 | # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit"
36 | # Docs: https://getcomposer.org/doc/articles/scripts.md
37 |
38 | # - name: Run test suite
39 | # run: composer run-script test
40 |
--------------------------------------------------------------------------------
/src/components/operations/__tests__/ManageData.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { configure, shallow } from 'enzyme'
3 | import Adapter from 'enzyme-adapter-react-16'
4 |
5 | import ManageData from '../ManageData'
6 |
7 | configure({ adapter: new Adapter() })
8 |
9 | it('decodes ordinary string values', () => {
10 | const link = shallow()
11 | expect(link.getElements()).toMatchSnapshot()
12 | })
13 |
14 | it('decodes utf8 string values', () => {
15 | const link = shallow(
16 |
17 | )
18 | expect(link.getElements()).toMatchSnapshot()
19 | })
20 |
21 | it('truncates a long key and long value', () => {
22 | const aLongPrefix = 'some_really_long_12345678901234567890123456789'
23 | const aLongName = `name_${aLongPrefix}`
24 | const aLongValue = Buffer.from(`value_${aLongPrefix}`).toString('base64')
25 | const link = shallow()
26 | expect(link.getElements()).toMatchSnapshot()
27 | })
28 |
--------------------------------------------------------------------------------
/.github/workflows/npm-publish-github-packages.yml:
--------------------------------------------------------------------------------
1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
3 |
4 | name: Node.js Package
5 |
6 | on:
7 | release:
8 | types: [created]
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v3
15 | - uses: actions/setup-node@v3
16 | with:
17 | node-version: 16
18 | - run: npm ci
19 | - run: npm test
20 |
21 | publish-gpr:
22 | needs: build
23 | runs-on: ubuntu-latest
24 | permissions:
25 | contents: read
26 | packages: write
27 | steps:
28 | - uses: actions/checkout@v3
29 | - uses: actions/setup-node@v3
30 | with:
31 | node-version: 16
32 | registry-url: https://npm.pkg.github.com/
33 | - run: npm ci
34 | - run: npm publish
35 | env:
36 | NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
37 |
--------------------------------------------------------------------------------
/public/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | https://minepi.com/blockexplorer
6 |
7 |
8 |
13 |
14 |
15 | https://minepi.com/blockexplorer/blocks
16 |
17 |
18 |
19 |
20 | https://minepi.com/blockexplorer/txs
21 |
22 |
23 |
38 |
39 |
40 | https://minepi.com/blockexplorer/payments
41 |
42 |
43 |
53 |
54 |
--------------------------------------------------------------------------------
/src/lib/__tests__/__data__/effects.js:
--------------------------------------------------------------------------------
1 | export default [
2 | {
3 | id: '0000774537222303745-0000000002',
4 | account: 'GCOLHJY3DMPDSZW7PNK4RWBQMCYE5Q67W7TT44SD46RKTVDEAUJZTNE6',
5 | type: 'account_debited',
6 | typeI: 3,
7 | createdAt: '2018-10-15T03:06:14Z',
8 | assetType: 'credit_alphanum4',
9 | assetCode: 'HNY',
10 | assetIssuer: 'GCOLHJY3DMPDSZW7PNK4RWBQMCYE5Q67W7TT44SD46RKTVDEAUJZTNE6',
11 | amount: '1000000000.0000000'
12 | },
13 | {
14 | id: '0000773746948313089-0000000003',
15 | account: 'GCOLHJY3DMPDSZW7PNK4RWBQMCYE5Q67W7TT44SD46RKTVDEAUJZTNE6',
16 | type: 'signer_created',
17 | typeI: 10,
18 | createdAt: '2018-10-15T02:50:22Z',
19 | weight: 1,
20 | publicKey: 'GCOLHJY3DMPDSZW7PNK4RWBQMCYE5Q67W7TT44SD46RKTVDEAUJZTNE6',
21 | key: ''
22 | },
23 | {
24 | id: '0000773746948313089-0000000001',
25 | account: 'GCOLHJY3DMPDSZW7PNK4RWBQMCYE5Q67W7TT44SD46RKTVDEAUJZTNE6',
26 | type: 'account_created',
27 | typeI: 0,
28 | createdAt: '2018-10-15T02:50:22Z',
29 | startingBalance: '10000.0000000'
30 | }
31 | ]
32 |
--------------------------------------------------------------------------------
/src/components/operations/Payment.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FormattedMessage } from 'react-intl'
3 | import PropTypes from 'prop-types'
4 | import Asset from '../shared/Asset'
5 | import AccountLink from '../shared/AccountLink'
6 | import FormattedAmount from '../shared/FormattedAmount'
7 |
8 | const Payment = ({
9 | amount,
10 | assetCode,
11 | assetIssuer,
12 | assetType,
13 | children,
14 | to,
15 | toMuxed
16 | }) => (
17 |
18 | ,
22 | asset: ,
23 | recipient:
24 | }}
25 | />
26 | {children}
27 |
28 | )
29 |
30 | Payment.propTypes = {
31 | amount: PropTypes.string.isRequired,
32 | assetCode: PropTypes.string,
33 | assetIssuer: PropTypes.string,
34 | assetType: PropTypes.string.isRequired,
35 | to: PropTypes.string.isRequired,
36 | toMuxed: PropTypes.string
37 | }
38 |
39 | export default Payment
40 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Source: https://typeofnan.dev/how-to-serve-a-react-app-with-nginx-in-docker/
2 | # Multi-stage
3 | # 1) Node image for building app assets
4 | # 2) nginx stage to serve app assets
5 |
6 | FROM node:13-alpine AS base
7 |
8 | # Set working directory
9 | WORKDIR /home/app
10 |
11 | # Copy our node modules specification
12 | COPY ./package.json .
13 | COPY ./package-lock.json .
14 |
15 | # Install node modules and build assets
16 | RUN npm install
17 |
18 | #Copy all files from current directory to working dir in image
19 | COPY . .
20 |
21 | # Create a build of the app
22 | RUN npm run build
23 |
24 | # nginx state for serving content
25 | FROM nginx:alpine
26 |
27 | EXPOSE 80
28 |
29 | # Set working directory to nginx asset directory
30 | WORKDIR /usr/share/nginx/html
31 |
32 | # Remove default nginx static assets
33 | RUN rm -rf ./*
34 |
35 | # Copy static assets from builder stage
36 | COPY --from=base /home/app/build .
37 |
38 | COPY ./docker/nginx-defaults.conf /etc/nginx/conf.d/default.conf
39 |
40 | # Containers run nginx with global directives and daemon off
41 | ENTRYPOINT ["nginx", "-g", "daemon off;"]
--------------------------------------------------------------------------------
/src/lib/stellar/__tests__/networks.test.js:
--------------------------------------------------------------------------------
1 | import networks, { hostnameToNetworkType } from '../networks'
2 |
3 | describe('hostnameToNetwork', () => {
4 | it('detects network type correctly from the hostname', () => {
5 | // public network
6 | expect(hostnameToNetworkType('steexp.com')).toEqual(networks.public)
7 |
8 | // test network
9 | expect(hostnameToNetworkType('testnet.steexp.com')).toEqual(networks.test)
10 |
11 | // localhost for development
12 | expect(hostnameToNetworkType('localnet.local')).toEqual(networks.local)
13 | expect(hostnameToNetworkType('testnet.local')).toEqual(networks.test)
14 | expect(hostnameToNetworkType('publicnet.local')).toEqual(networks.public)
15 |
16 | // unknown hosts default to local
17 | expect(hostnameToNetworkType()).toEqual(networks.local)
18 | expect(hostnameToNetworkType('')).toEqual(networks.local)
19 | expect(hostnameToNetworkType('localhost')).toEqual(networks.local)
20 | expect(hostnameToNetworkType('0.0.0.0')).toEqual(networks.local)
21 | expect(hostnameToNetworkType('not.steexp.com')).toEqual(networks.local)
22 | })
23 | })
24 |
--------------------------------------------------------------------------------
/.github/workflows/gradle.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | # This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
6 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
7 |
8 | name: Java CI with Gradle
9 |
10 | on:
11 | push:
12 | branches: [ "development" ]
13 | pull_request:
14 | branches: [ "development" ]
15 |
16 | permissions:
17 | contents: read
18 |
19 | jobs:
20 | build:
21 |
22 | runs-on: ubuntu-latest
23 |
24 | steps:
25 | - uses: actions/checkout@v3
26 | - name: Set up JDK 11
27 | uses: actions/setup-java@v3
28 | with:
29 | java-version: '11'
30 | distribution: 'temurin'
31 | - name: Build with Gradle
32 | uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
33 | with:
34 | arguments: build
35 |
--------------------------------------------------------------------------------
/.github/workflows/laravel.yml:
--------------------------------------------------------------------------------
1 | name: Laravel
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | laravel-tests:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
16 | with:
17 | php-version: '8.0'
18 | - uses: actions/checkout@v3
19 | - name: Copy .env
20 | run: php -r "file_exists('.env') || copy('.env.example', '.env');"
21 | - name: Install Dependencies
22 | run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
23 | - name: Generate key
24 | run: php artisan key:generate
25 | - name: Directory Permissions
26 | run: chmod -R 777 storage bootstrap/cache
27 | - name: Create Database
28 | run: |
29 | mkdir -p database
30 | touch database/database.sqlite
31 | - name: Execute tests (Unit and Feature tests) via PHPUnit
32 | env:
33 | DB_CONNECTION: sqlite
34 | DB_DATABASE: database/database.sqlite
35 | run: vendor/bin/phpunit
36 |
--------------------------------------------------------------------------------
/.github/workflows/manual.yml:
--------------------------------------------------------------------------------
1 | # This is a basic workflow that is manually triggered
2 |
3 | name: Manual workflow
4 |
5 | # Controls when the action will run. Workflow runs when manually triggered using the UI
6 | # or API.
7 | on:
8 | workflow_dispatch:
9 | # Inputs the workflow accepts.
10 | inputs:
11 | name:
12 | # Friendly description to be shown in the UI instead of 'name'
13 | description: 'Person to greet'
14 | # Default value if no value is explicitly provided
15 | default: 'World'
16 | # Input has to be provided for the workflow to run
17 | required: true
18 |
19 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
20 | jobs:
21 | # This workflow contains a single job called "greet"
22 | greet:
23 | # The type of runner that the job will run on
24 | runs-on: ubuntu-latest
25 |
26 | # Steps represent a sequence of tasks that will be executed as part of the job
27 | steps:
28 | # Runs a single command using the runners shell
29 | - name: Send greeting
30 | run: echo "Hello ${{ github.event.inputs.name }}"
31 |
--------------------------------------------------------------------------------
/.github/workflows/maven-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
2 | # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path
3 |
4 | name: Maven Package
5 |
6 | on:
7 | release:
8 | types: [created]
9 |
10 | jobs:
11 | build:
12 |
13 | runs-on: ubuntu-latest
14 | permissions:
15 | contents: read
16 | packages: write
17 |
18 | steps:
19 | - uses: actions/checkout@v3
20 | - name: Set up JDK 11
21 | uses: actions/setup-java@v3
22 | with:
23 | java-version: '11'
24 | distribution: 'temurin'
25 | server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
26 | settings-path: ${{ github.workspace }} # location for the settings.xml file
27 |
28 | - name: Build with Maven
29 | run: mvn -B package --file pom.xml
30 |
31 | - name: Publish to GitHub Packages Apache Maven
32 | run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml
33 | env:
34 | GITHUB_TOKEN: ${{ github.token }}
35 |
--------------------------------------------------------------------------------
/app/app.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import helmet from 'helmet';
3 | import compression from 'compression';
4 | import cors from 'cors';
5 | import { config } from './config';
6 |
7 | const app = express();
8 |
9 | app.use(helmet());
10 | app.use(compression());
11 | app.use(cors());
12 |
13 | app.get('/', (req, res) => {
14 | res.render('index', { title: 'Revoluterium Block Explorer' });
15 | });
16 |
17 | app.get('/block/:blockHash', (req, res) => {
18 | const blockHash = req.params.blockHash;
19 | // Call Horizon API to get block data
20 | fetch(`${config.horizonUrl}blocks/${blockHash}`)
21 | .then(response => response.json())
22 | .then(data => res.render('block', { block: data }));
23 | });
24 |
25 | app.get('/transaction/:transactionHash', (req, res) => {
26 | const transactionHash = req.params.transactionHash;
27 | // Call Horizon API to get transaction data
28 | fetch(`${config.horizonUrl}transactions/${transactionHash}`)
29 | .then(response => response.json())
30 | .then(data => res.render('transaction', { transaction: data }));
31 | });
32 |
33 | app.listen(3000, () => {
34 | console.log('Revoluterium Block Explorer listening on port 3000');
35 | });
36 |
--------------------------------------------------------------------------------
/.github/workflows/elixir.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: Elixir CI
7 |
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 |
14 | permissions:
15 | contents: read
16 |
17 | jobs:
18 | build:
19 |
20 | name: Build and test
21 | runs-on: ubuntu-latest
22 |
23 | steps:
24 | - uses: actions/checkout@v3
25 | - name: Set up Elixir
26 | uses: erlef/setup-beam@61e01a43a562a89bfc54c7f9a378ff67b03e4a21 # v1.16.0
27 | with:
28 | elixir-version: '1.15.2' # [Required] Define the Elixir version
29 | otp-version: '26.0' # [Required] Define the Erlang/OTP version
30 | - name: Restore dependencies cache
31 | uses: actions/cache@v3
32 | with:
33 | path: deps
34 | key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
35 | restore-keys: ${{ runner.os }}-mix-
36 | - name: Install dependencies
37 | run: mix deps.get
38 | - name: Run tests
39 | run: mix test
40 |
--------------------------------------------------------------------------------
/.github/workflows/haskell.yml:
--------------------------------------------------------------------------------
1 | name: Haskell CI
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | permissions:
10 | contents: read
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - uses: actions/setup-haskell@v1
20 | with:
21 | ghc-version: '8.10.3'
22 | cabal-version: '3.2'
23 |
24 | - name: Cache
25 | uses: actions/cache@v3
26 | env:
27 | cache-name: cache-cabal
28 | with:
29 | path: ~/.cabal
30 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/*.cabal') }}-${{ hashFiles('**/cabal.project') }}
31 | restore-keys: |
32 | ${{ runner.os }}-build-${{ env.cache-name }}-
33 | ${{ runner.os }}-build-
34 | ${{ runner.os }}-
35 |
36 | - name: Install dependencies
37 | run: |
38 | cabal update
39 | cabal build --only-dependencies --enable-tests --enable-benchmarks
40 | - name: Build
41 | run: cabal build --enable-tests --enable-benchmarks all
42 | - name: Run tests
43 | run: cabal test all
44 |
--------------------------------------------------------------------------------
/.github/workflows/python-package-conda.yml:
--------------------------------------------------------------------------------
1 | name: Python Package using Conda
2 |
3 | on: [push]
4 |
5 | jobs:
6 | build-linux:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | max-parallel: 5
10 |
11 | steps:
12 | - uses: actions/checkout@v3
13 | - name: Set up Python 3.10
14 | uses: actions/setup-python@v3
15 | with:
16 | python-version: '3.10'
17 | - name: Add conda to system path
18 | run: |
19 | # $CONDA is an environment variable pointing to the root of the miniconda directory
20 | echo $CONDA/bin >> $GITHUB_PATH
21 | - name: Install dependencies
22 | run: |
23 | conda env update --file environment.yml --name base
24 | - name: Lint with flake8
25 | run: |
26 | conda install flake8
27 | # stop the build if there are Python syntax errors or undefined names
28 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
29 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
30 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
31 | - name: Test with pytest
32 | run: |
33 | conda install pytest
34 | pytest
35 |
--------------------------------------------------------------------------------
/src/data/distributers.js:
--------------------------------------------------------------------------------
1 | import directory from '../data/directory'
2 | const { anchors } = directory
3 |
4 | /**
5 | * Register some known distributer accounts linking to thier issuer accounts.
6 | *
7 | * NOTE: where a single distributer/issuer pair is used for multiple
8 | * asset types an issuer lookup for just one asset is required to
9 | * make the link. (eg. apay.io:ETH)
10 | */
11 |
12 | const issuer = (name, asset) =>
13 | anchors[name].assets[asset].substring(asset.length + 1)
14 |
15 | export default {
16 | GDSNYE6WMDQQW7JNAIIFEIJ562GS76WGSKXG3K6DPXLRN3COA47JRAJH: issuer(
17 | 'smartlands.io',
18 | 'SLT'
19 | ),
20 | GDBWXSZDYO4C3EHYXRLCGU3NP55LUBEQO5K2RWIWWMXWVI57L7VUWSZA: issuer(
21 | 'apay.io',
22 | 'ETH'
23 | ),
24 | GCGJVS7JZ7AP54H5GJIDNKGDDCOQ34H6NZBV7VCBLW4VCD4JOWERABA5: issuer(
25 | 'ripplefox.com',
26 | 'CNY'
27 | ),
28 | GDW3CNKSP5AOTDQ2YCKNGC6L65CE4JDX3JS5BV427OB54HCF2J4PUEVG: issuer(
29 | 'funtracker.site',
30 | 'FUNT'
31 | ),
32 | GBF6JDOF7SKMKMSMXHBHLYBRMLZF5QF6YNGXWM3NMX3H3HDJ7VVPCHQR: issuer(
33 | 'nrvcoin.in',
34 | 'NRV'
35 | ),
36 | GBNDDA3CJ6WDRE36TDGDNTTVV3QET7MRDINP3HUMIKBPQBKQGITZ73T5: issuer(
37 | 'nrvcoin.in',
38 | 'NRV'
39 | )
40 | }
41 |
--------------------------------------------------------------------------------
/.github/workflows/python-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow will upload a Python Package using Twine when a release is created
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries
3 |
4 | # This workflow uses actions that are not certified by GitHub.
5 | # They are provided by a third-party and are governed by
6 | # separate terms of service, privacy policy, and support
7 | # documentation.
8 |
9 | name: Upload Python Package
10 |
11 | on:
12 | release:
13 | types: [published]
14 |
15 | permissions:
16 | contents: read
17 |
18 | jobs:
19 | deploy:
20 |
21 | runs-on: ubuntu-latest
22 |
23 | steps:
24 | - uses: actions/checkout@v3
25 | - name: Set up Python
26 | uses: actions/setup-python@v3
27 | with:
28 | python-version: '3.x'
29 | - name: Install dependencies
30 | run: |
31 | python -m pip install --upgrade pip
32 | pip install build
33 | - name: Build package
34 | run: python -m build
35 | - name: Publish package
36 | uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
37 | with:
38 | user: __token__
39 | password: ${{ secrets.PYPI_API_TOKEN }}
40 |
--------------------------------------------------------------------------------
/.github/workflows/r.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | #
6 | # See https://github.com/r-lib/actions/tree/master/examples#readme for
7 | # additional example workflows available for the R community.
8 |
9 | name: R
10 |
11 | on:
12 | push:
13 | branches: [ "development" ]
14 | pull_request:
15 | branches: [ "development" ]
16 |
17 | permissions:
18 | contents: read
19 |
20 | jobs:
21 | build:
22 | runs-on: macos-latest
23 | strategy:
24 | matrix:
25 | r-version: ['3.6.3', '4.1.1']
26 |
27 | steps:
28 | - uses: actions/checkout@v3
29 | - name: Set up R ${{ matrix.r-version }}
30 | uses: r-lib/actions/setup-r@f57f1301a053485946083d7a45022b278929a78a
31 | with:
32 | r-version: ${{ matrix.r-version }}
33 | - name: Install dependencies
34 | run: |
35 | install.packages(c("remotes", "rcmdcheck"))
36 | remotes::install_deps(dependencies = TRUE)
37 | shell: Rscript {0}
38 | - name: Check
39 | run: rcmdcheck::rcmdcheck(args = "--no-manual", error_on = "error")
40 | shell: Rscript {0}
41 |
--------------------------------------------------------------------------------
/src/components/shared/TimeSynchronizedFormattedRelative.js:
--------------------------------------------------------------------------------
1 | import { FormattedRelative } from 'react-intl'
2 |
3 | /**
4 | * A variation on FormattedRelative that respects updates to the initialNow
5 | * property. see react-intl for the default behaviour.
6 |
7 | * This version allows synchronisation of multiple FormattedRelative time
8 | * components that were created at various times to a single baseline now value.
9 | */
10 | // export default class extends FormattedRelative {
11 | // componentWillReceiveProps({initialNow: nextNow}) {
12 | // this.setState({now: nextNow})
13 | // }
14 | // }
15 | import React from 'react'
16 | import PropTypes from 'prop-types'
17 | import { Link } from 'react-router-dom'
18 |
19 | const TimeSynchronizedFormattedRelative = ({ hash, time }) => {
20 | return (
21 |
22 | {hash
23 | ? (
24 |
25 |
26 |
27 | )
28 | : (
29 |
30 | )}
31 |
32 | )
33 | }
34 |
35 | TimeSynchronizedFormattedRelative.propTypes = {
36 | hash: PropTypes.string,
37 | time: PropTypes.string
38 | }
39 | export default TimeSynchronizedFormattedRelative
40 |
--------------------------------------------------------------------------------
/.github/workflows/maven.yml:
--------------------------------------------------------------------------------
1 | # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven
3 |
4 | # This workflow uses actions that are not certified by GitHub.
5 | # They are provided by a third-party and are governed by
6 | # separate terms of service, privacy policy, and support
7 | # documentation.
8 |
9 | name: Java CI with Maven
10 |
11 | on:
12 | push:
13 | branches: [ "development" ]
14 | pull_request:
15 | branches: [ "development" ]
16 |
17 | jobs:
18 | build:
19 |
20 | runs-on: ubuntu-latest
21 |
22 | steps:
23 | - uses: actions/checkout@v3
24 | - name: Set up JDK 17
25 | uses: actions/setup-java@v3
26 | with:
27 | java-version: '17'
28 | distribution: 'temurin'
29 | cache: maven
30 | - name: Build with Maven
31 | run: mvn -B package --file pom.xml
32 |
33 | # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
34 | - name: Update dependency graph
35 | uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
36 |
--------------------------------------------------------------------------------
/.github/workflows/objective-c-xcode.yml:
--------------------------------------------------------------------------------
1 | name: Xcode - Build and Analyze
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 | name: Build and analyse default scheme using xcodebuild command
12 | runs-on: macos-latest
13 |
14 | steps:
15 | - name: Checkout
16 | uses: actions/checkout@v3
17 | - name: Set Default Scheme
18 | run: |
19 | scheme_list=$(xcodebuild -list -json | tr -d "\n")
20 | default=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['targets'][0]")
21 | echo $default | cat >default
22 | echo Using default scheme: $default
23 | - name: Build
24 | env:
25 | scheme: ${{ 'default' }}
26 | run: |
27 | if [ $scheme = default ]; then scheme=$(cat default); fi
28 | if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi
29 | file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
30 | xcodebuild clean build analyze -scheme "$scheme" -"$filetype_parameter" "$file_to_build" | xcpretty && exit ${PIPESTATUS[0]}
31 |
--------------------------------------------------------------------------------
/.github/workflows/ruby.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6 | # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7 |
8 | name: Ruby
9 |
10 | on:
11 | push:
12 | branches: [ "development" ]
13 | pull_request:
14 | branches: [ "development" ]
15 |
16 | permissions:
17 | contents: read
18 |
19 | jobs:
20 | test:
21 |
22 | runs-on: ubuntu-latest
23 | strategy:
24 | matrix:
25 | ruby-version: ['2.6', '2.7', '3.0']
26 |
27 | steps:
28 | - uses: actions/checkout@v3
29 | - name: Set up Ruby
30 | # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
31 | # change this to (see https://github.com/ruby/setup-ruby#versioning):
32 | # uses: ruby/setup-ruby@v1
33 | uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
34 | with:
35 | ruby-version: ${{ matrix.ruby-version }}
36 | bundler-cache: true # runs 'bundle install' and caches installed gems automatically
37 | - name: Run tests
38 | run: bundle exec rake
39 |
--------------------------------------------------------------------------------
/.github/workflows/python-app.yml:
--------------------------------------------------------------------------------
1 | # This workflow will install Python dependencies, run tests and lint with a single version of Python
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
3 |
4 | name: Python application
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | permissions:
13 | contents: read
14 |
15 | jobs:
16 | build:
17 |
18 | runs-on: ubuntu-latest
19 |
20 | steps:
21 | - uses: actions/checkout@v3
22 | - name: Set up Python 3.10
23 | uses: actions/setup-python@v3
24 | with:
25 | python-version: "3.10"
26 | - name: Install dependencies
27 | run: |
28 | python -m pip install --upgrade pip
29 | pip install flake8 pytest
30 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
31 | - name: Lint with flake8
32 | run: |
33 | # stop the build if there are Python syntax errors or undefined names
34 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
35 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
36 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
37 | - name: Test with pytest
38 | run: |
39 | pytest
40 |
--------------------------------------------------------------------------------
/src/lib/stellar/server.js:
--------------------------------------------------------------------------------
1 | import sdk from './sdk'
2 | import networks from './networks'
3 |
4 | export const defaultNetworkAddresses = {
5 | public: 'https://horizon.stellar.org',
6 | test: 'https://horizon-testnet.stellar.org',
7 | // local: 'http://localhost:8000',
8 | local: 'https://api.testnet.minepi.com'
9 | }
10 |
11 | /**
12 | * Wrap the stellar-sdk Server hiding setup of horizon addresses and adding
13 | * some helper functions. These helpers are more easily mocked for testing then
14 | * direct use of sdk fluent api.
15 | */
16 | class WrappedServer extends sdk.Server {
17 | constructor (networkType, networkAddress, storage) {
18 | try {
19 | // allowHttp: public/test use HTTPS; local can use HTTP
20 | super(networkAddress, { allowHttp: networkType === networks.local })
21 | } catch (err) {
22 | storage.removeItem('networkAddress')
23 | window.location.href = `/error/insecure-horizon-server/?${networkAddress}`
24 | }
25 | }
26 |
27 | //
28 | // Horizon url resolvers
29 | //
30 |
31 | accountURL = (id) => `${this.serverURL}accounts/${id}`
32 | effectURL = (id) => `${this.serverURL}operations/${id}/effects`
33 | ledgerURL = (id) => `${this.serverURL}ledgers/${id}`
34 | opURL = (id) => `${this.serverURL}operations/${id}`
35 | txURL = (id) => `${this.serverURL}transactions/${id}`
36 | }
37 |
38 | const Server = (...args) => new WrappedServer(...args)
39 |
40 | export default Server
41 |
--------------------------------------------------------------------------------
/.github/workflows/jekyll-gh-pages.yml:
--------------------------------------------------------------------------------
1 | # Sample workflow for building and deploying a Jekyll site to GitHub Pages
2 | name: Deploy Jekyll with GitHub Pages dependencies preinstalled
3 |
4 | on:
5 | # Runs on pushes targeting the default branch
6 | push:
7 | branches: ["development"]
8 |
9 | # Allows you to run this workflow manually from the Actions tab
10 | workflow_dispatch:
11 |
12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
13 | permissions:
14 | contents: read
15 | pages: write
16 | id-token: write
17 |
18 | # Allow one concurrent deployment
19 | concurrency:
20 | group: "pages"
21 | cancel-in-progress: true
22 |
23 | jobs:
24 | # Build job
25 | build:
26 | runs-on: ubuntu-latest
27 | steps:
28 | - name: Checkout
29 | uses: actions/checkout@v3
30 | - name: Setup Pages
31 | uses: actions/configure-pages@v3
32 | - name: Build with Jekyll
33 | uses: actions/jekyll-build-pages@v1
34 | with:
35 | source: ./
36 | destination: ./_site
37 | - name: Upload artifact
38 | uses: actions/upload-pages-artifact@v1
39 |
40 | # Deployment job
41 | deploy:
42 | environment:
43 | name: github-pages
44 | url: ${{ steps.deployment.outputs.page_url }}
45 | runs-on: ubuntu-latest
46 | needs: build
47 | steps:
48 | - name: Deploy to GitHub Pages
49 | id: deployment
50 | uses: actions/deploy-pages@v1
51 |
--------------------------------------------------------------------------------
/src/data/__tests__/known_accounts.test.js:
--------------------------------------------------------------------------------
1 | import accounts from '../known_accounts'
2 | import { isPublicKey } from '../../lib/stellar/utils'
3 |
4 | const findByName = (name) => {
5 | const addr = Object.keys(accounts).find((key) => accounts[key].name === name)
6 | return { addr, account: accounts[addr] }
7 | }
8 |
9 | it('anchor account included', () => {
10 | const { addr: tonairaAddr, account: tonaira } = findByName('Tonaira')
11 | expect(isPublicKey(tonairaAddr)).toBe(true)
12 | expect(tonaira.name).toBe('Tonaira')
13 | expect(tonaira.website).toBe('https://tonaira.com/')
14 | expect(tonaira.type).toBe('issuer')
15 |
16 | // check basics of another
17 | const { addr: vcbearAddr, account: vcbear } = findByName('VCBear')
18 | expect(isPublicKey(vcbearAddr)).toBe(true)
19 | expect(vcbear).toBeDefined()
20 | expect(vcbear.name).toBe('VCBear')
21 | expect(vcbear.website).toBe('https://vcbear.net/')
22 | })
23 |
24 | it('standard exchange accounts are included', () => {
25 | const { addr: poloniexAddr, account: poloniex } = findByName('Poloniex')
26 | expect(isPublicKey(poloniexAddr)).toBe(true)
27 | expect(poloniex).toBeDefined()
28 | expect(poloniex.name).toBe('Poloniex')
29 | expect(poloniex.website).toBe('poloniex.com')
30 | expect(poloniex.type).toBe('exchange')
31 | })
32 |
33 | it('exchange accounts with logo override sets logo', () => {
34 | const { addr: papayaAddr } = findByName('PapayaBot')
35 | expect(isPublicKey(papayaAddr)).toBe(true)
36 | })
37 |
--------------------------------------------------------------------------------
/src/components/shared/Paging.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PagingControls from './PagingControls'
3 |
4 | const usePagingCondition = (props) => props.usePaging === true
5 |
6 | const withPaging = () => (Component) => {
7 | return class extends React.Component {
8 | state = {
9 | hide: false,
10 | page: 0
11 | }
12 |
13 | handleClickNext = (e) =>
14 | this.setState({
15 | page: this.state.page + 1
16 | })
17 |
18 | handleClickPrev = (e) =>
19 | this.setState({
20 | page: this.state.page >= 1 ? this.state.page - 1 : 0
21 | })
22 |
23 | // let children dynamically hide the paging controls
24 | // eg. if a result set is 0 or small
25 | handleHide = () => {
26 | this.setState({ hide: true })
27 | }
28 |
29 | render () {
30 | if (usePagingCondition(this.props) === false) {
31 | return
32 | }
33 | return (
34 |
35 | {!this.state.hide && (
36 |
41 | )}
42 |
47 |
48 | )
49 | }
50 | }
51 | }
52 |
53 | export { withPaging }
54 |
--------------------------------------------------------------------------------
/.github/workflows/python-package.yml:
--------------------------------------------------------------------------------
1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions
2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
3 |
4 | name: Python package
5 |
6 | on:
7 | push:
8 | branches: [ "development" ]
9 | pull_request:
10 | branches: [ "development" ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 | strategy:
17 | fail-fast: false
18 | matrix:
19 | python-version: ["3.9", "3.10", "3.11"]
20 |
21 | steps:
22 | - uses: actions/checkout@v3
23 | - name: Set up Python ${{ matrix.python-version }}
24 | uses: actions/setup-python@v3
25 | with:
26 | python-version: ${{ matrix.python-version }}
27 | - name: Install dependencies
28 | run: |
29 | python -m pip install --upgrade pip
30 | python -m pip install flake8 pytest
31 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
32 | - name: Lint with flake8
33 | run: |
34 | # stop the build if there are Python syntax errors or undefined names
35 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
36 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
37 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
38 | - name: Test with pytest
39 | run: |
40 | pytest
41 |
--------------------------------------------------------------------------------
/.github/workflows/dart.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: Dart
7 |
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 |
14 | jobs:
15 | build:
16 | runs-on: ubuntu-latest
17 |
18 | steps:
19 | - uses: actions/checkout@v3
20 |
21 | # Note: This workflow uses the latest stable version of the Dart SDK.
22 | # You can specify other versions if desired, see documentation here:
23 | # https://github.com/dart-lang/setup-dart/blob/main/README.md
24 | # - uses: dart-lang/setup-dart@v1
25 | - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
26 |
27 | - name: Install dependencies
28 | run: dart pub get
29 |
30 | # Uncomment this step to verify the use of 'dart format' on each commit.
31 | # - name: Verify formatting
32 | # run: dart format --output=none --set-exit-if-changed .
33 |
34 | # Consider passing '--fatal-infos' for slightly stricter analysis.
35 | - name: Analyze project source
36 | run: dart analyze
37 |
38 | # Your project will need to have tests in test/ and a dependency on
39 | # package:test for this step to succeed. Note that Flutter projects will
40 | # want to change this to 'flutter test'.
41 | - name: Run tests
42 | run: dart test
43 |
--------------------------------------------------------------------------------
/kubernetes/scripts/deploy_kubernetes_components:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # All the variables ($VARIABLE) are Gitlab pipeline variables
4 | # They are set at different places:
5 | # - $CI and $GITLAB ones are set by Gitlab
6 | # - $IMAGE_TAG is set in the gitlab-ci.yml file
7 |
8 | # Creates a kubernetes secret file
9 | kubectl create secret docker-registry gitlab-registry \
10 | --docker-server="$CI_REGISTRY" \
11 | --docker-username="$CI_DEPLOY_USER" \
12 | --docker-password="$CI_DEPLOY_PASSWORD" \
13 | --docker-email="$GITLAB_USER_EMAIL" \
14 | -o yaml --dry-run=client | kubectl apply -f -
15 |
16 |
17 | # Replaces variables in the configuration file by their actual value
18 | # Details: sed -ri "s|xxx|yyy|g" file
19 | # - 'xxx' is what we want to replace
20 | # - 'yyy' is what we want to put in place of 'xxx'
21 | # - 'file' is the file in which we want to make this replacement
22 | sed -ri \
23 | -e "s|__CI_PROJECT_PATH_SLUG__|$CI_PROJECT_PATH_SLUG|g" \
24 | -e "s|__CI_ENVIRONMENT_SLUG__|$CI_ENVIRONMENT_SLUG|g" \
25 | -e "s|__APP_IMAGE_TAG__|$APP_IMAGE_TAG|g" \
26 | -e "s|__APP_POD_CPU_LIMIT__|$APP_POD_CPU_LIMIT|g" \
27 | -e "s|__APP_POD_EPHEMERAL_STORAGE_LIMIT__|$APP_POD_EPHEMERAL_STORAGE_LIMIT|g" \
28 | -e "s|__APP_POD_MEMORY_LIMIT__|$APP_POD_MEMORY_LIMIT|g" \
29 | -e "s|__APP_MIN_REPLICA__|$APP_MIN_REPLICA|g" \
30 | -e "s|__APP_MAX_REPLICA__|$APP_MAX_REPLICA|g" \
31 | ./kubernetes/config/app.yaml
32 |
33 |
34 | # Applies the configuration file to deploy the app
35 | kubectl apply -f ./kubernetes/config/app.yaml
36 |
--------------------------------------------------------------------------------
/.github/workflows/msbuild.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: MSBuild
7 |
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 |
14 | env:
15 | # Path to the solution file relative to the root of the project.
16 | SOLUTION_FILE_PATH: .
17 |
18 | # Configuration type to build.
19 | # You can convert this to a build matrix if you need coverage of multiple configuration types.
20 | # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
21 | BUILD_CONFIGURATION: Release
22 |
23 | permissions:
24 | contents: read
25 |
26 | jobs:
27 | build:
28 | runs-on: windows-latest
29 |
30 | steps:
31 | - uses: actions/checkout@v3
32 |
33 | - name: Add MSBuild to PATH
34 | uses: microsoft/setup-msbuild@v1.0.2
35 |
36 | - name: Restore NuGet packages
37 | working-directory: ${{env.GITHUB_WORKSPACE}}
38 | run: nuget restore ${{env.SOLUTION_FILE_PATH}}
39 |
40 | - name: Build
41 | working-directory: ${{env.GITHUB_WORKSPACE}}
42 | # Add additional options to the MSBuild command line here (like platform or verbosity level).
43 | # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
44 | run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
45 |
--------------------------------------------------------------------------------
/src/components/operations/__tests__/__snapshots__/ManageData.test.js.snap:
--------------------------------------------------------------------------------
1 | // Jest Snapshot v1, https://goo.gl/fbAQLP
2 |
3 | exports[`decodes ordinary string values 1`] = `
4 | Array [
5 |
6 |
14 |
22 | ,
23 | ]
24 | `;
25 |
26 | exports[`decodes utf8 string values 1`] = `
27 | Array [
28 |
29 |
37 |
45 | ,
46 | ]
47 | `;
48 |
49 | exports[`truncates a long key and long value 1`] = `
50 | Array [
51 |
52 |
60 |
68 | ,
69 | ]
70 | `;
71 |
--------------------------------------------------------------------------------
/src/components/shared/ClipboardCopy.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import Glyphicon from 'react-bootstrap/lib/Glyphicon'
4 | import OverlayTrigger from 'react-bootstrap/lib/OverlayTrigger'
5 | import Tooltip from 'react-bootstrap/lib/Tooltip'
6 | import CopyToClipboard from 'react-copy-to-clipboard'
7 |
8 | const CopyIcon = (
9 |
10 | )
11 | const TooltipCopy = Copy to Clipboard
12 | const TooltipCopied = (
13 |
14 | Copied!
15 |
16 | )
17 |
18 | class ClipboardCopy extends React.Component {
19 | static defaultProps = {
20 | text: ''
21 | }
22 |
23 | state = {
24 | copied: false
25 | }
26 |
27 | constructor (props, context) {
28 | super(props, context)
29 | this.handleCopy = this.handleCopy.bind(this)
30 | }
31 |
32 | handleCopy () {
33 | this.setState({ copied: true })
34 | setTimeout(() => this.setState({ copied: false }), 10000)
35 | }
36 |
37 | render () {
38 | return (
39 |
44 |
45 | {CopyIcon}
46 |
47 |
48 | )
49 | }
50 | }
51 |
52 | ClipboardCopy.propTypes = {
53 | text: PropTypes.string
54 | }
55 |
56 | export default ClipboardCopy
57 |
--------------------------------------------------------------------------------
/.github/workflows/gem-push.yml:
--------------------------------------------------------------------------------
1 | name: Ruby Gem
2 |
3 | on:
4 | push:
5 | branches: [ "development" ]
6 | pull_request:
7 | branches: [ "development" ]
8 |
9 | jobs:
10 | build:
11 | name: Build + Publish
12 | runs-on: ubuntu-latest
13 | permissions:
14 | contents: read
15 | packages: write
16 |
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Set up Ruby 2.6
20 | # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
21 | # change this to (see https://github.com/ruby/setup-ruby#versioning):
22 | # uses: ruby/setup-ruby@v1
23 | uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
24 | with:
25 | ruby-version: 2.6.x
26 |
27 | - name: Publish to GPR
28 | run: |
29 | mkdir -p $HOME/.gem
30 | touch $HOME/.gem/credentials
31 | chmod 0600 $HOME/.gem/credentials
32 | printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
33 | gem build *.gemspec
34 | gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
35 | env:
36 | GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
37 | OWNER: ${{ github.repository_owner }}
38 |
39 | - name: Publish to RubyGems
40 | run: |
41 | mkdir -p $HOME/.gem
42 | touch $HOME/.gem/credentials
43 | chmod 0600 $HOME/.gem/credentials
44 | printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
45 | gem build *.gemspec
46 | gem push *.gem
47 | env:
48 | GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
49 |
--------------------------------------------------------------------------------
/.deepsource.toml:
--------------------------------------------------------------------------------
1 | version = 1
2 |
3 | [[analyzers]]
4 | name = "test-coverage"
5 |
6 | [[analyzers]]
7 | name = "terraform"
8 |
9 | [[analyzers]]
10 | name = "swift"
11 |
12 | [[analyzers]]
13 | name = "sql"
14 |
15 | [[analyzers]]
16 | name = "shell"
17 |
18 | [[analyzers]]
19 | name = "secrets"
20 |
21 | [[analyzers]]
22 | name = "scala"
23 |
24 | [[analyzers]]
25 | name = "rust"
26 |
27 | [analyzers.meta]
28 | msrv = "stable"
29 |
30 | [[analyzers]]
31 | name = "ruby"
32 |
33 | [[analyzers]]
34 | name = "python"
35 |
36 | [analyzers.meta]
37 | runtime_version = "3.x.x"
38 |
39 | [[analyzers]]
40 | name = "php"
41 |
42 | [analyzers.meta]
43 |
44 |
45 | [[analyzers]]
46 | name = "kotlin"
47 |
48 | [analyzers.meta]
49 | runtime_version = "19"
50 | language_version = "1.7"
51 |
52 | [[analyzers]]
53 | name = "javascript"
54 |
55 | [analyzers.meta]
56 | plugins = [
57 | "react",
58 |
59 | "angular"
60 | ]
61 | environment = [
62 | "nodejs",
63 | "browser",
64 |
65 | "vitest"
66 | ]
67 |
68 | [[analyzers]]
69 | name = "java"
70 |
71 | [analyzers.meta]
72 | runtime_version = "19"
73 |
74 | [[analyzers]]
75 | name = "go"
76 |
77 | [analyzers.meta]
78 | import_root = "github.com/KOSASIH/pi-explorer"
79 |
80 | [[analyzers]]
81 | name = "docker"
82 |
83 | [analyzers.meta]
84 |
85 |
86 | [[analyzers]]
87 | name = "cxx"
88 |
89 | [[analyzers]]
90 | name = "csharp"
91 |
92 | [[analyzers]]
93 | name = "ansible"
94 |
95 | [[transformers]]
96 | name = "dotnet-format"
97 |
98 | [[transformers]]
99 | name = "clang-format"
100 |
101 | [[transformers]]
102 |
103 |
104 |
--------------------------------------------------------------------------------
/.github/workflows/gradle-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 | # This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created
6 | # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle
7 |
8 | name: Gradle Package
9 |
10 | on:
11 | release:
12 | types: [created]
13 |
14 | jobs:
15 | build:
16 |
17 | runs-on: ubuntu-latest
18 | permissions:
19 | contents: read
20 | packages: write
21 |
22 | steps:
23 | - uses: actions/checkout@v3
24 | - name: Set up JDK 11
25 | uses: actions/setup-java@v3
26 | with:
27 | java-version: '11'
28 | distribution: 'temurin'
29 | server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
30 | settings-path: ${{ github.workspace }} # location for the settings.xml file
31 |
32 | - name: Build with Gradle
33 | uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
34 | with:
35 | arguments: build
36 |
37 | # The USERNAME and TOKEN need to correspond to the credentials environment variables used in
38 | # the publishing section of your build.gradle
39 | - name: Publish to GitHub Packages
40 | uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
41 | with:
42 | arguments: publish
43 | env:
44 | USERNAME: ${{ github.actor }}
45 | TOKEN: ${{ secrets.GITHUB_TOKEN }}
46 |
--------------------------------------------------------------------------------
/src/lib/csv.js:
--------------------------------------------------------------------------------
1 | import { saveAs } from './filesaver'
2 |
3 | // build and return csv string from array of column values
4 | const toCsvString = (stringArr) =>
5 | stringArr.reduce(
6 | (accumulated, val, idx) =>
7 | (accumulated += `"${
8 | typeof val === 'object' ? JSON.stringify(val).replace(/"/g, '""') : val
9 | }"${idx < stringArr.length - 1 ? ',' : ''}`),
10 | ''
11 | )
12 |
13 | const jsonToCSV = (records) => {
14 | const columns = []
15 | // get list of all columns across all records (as some record lists contain mixed structures)
16 | records.forEach((rec) => {
17 | const newKeys = Object.keys(rec).filter(
18 | (key) => columns.indexOf(key) === -1 && typeof rec[key] !== 'function'
19 | )
20 | if (newKeys.length > 0) {
21 | columns.push(...newKeys)
22 | }
23 | })
24 |
25 | // map col name to col idx
26 | const colToIdx = columns.reduce((accumulated, curCol, curIdx) => {
27 | accumulated[curCol] = curIdx
28 | return accumulated
29 | }, {})
30 |
31 | const numCols = columns.length
32 | const headerCsv = toCsvString(columns)
33 |
34 | return records.reduce((csvStr, curRec) => {
35 | const row = new Array(numCols)
36 | row.fill('')
37 |
38 | Object.keys(curRec).forEach((key) => (row[colToIdx[key]] = curRec[key]))
39 | csvStr = `${csvStr}\n${toCsvString(row)}`
40 |
41 | return csvStr
42 | }, headerCsv)
43 | }
44 |
45 | const exportCSV = (records) => {
46 | const csvData = jsonToCSV(records)
47 | const autoByteOrderMark = true
48 | saveAs(
49 | new Blob(['\ufeff', csvData], { type: 'text/csv;charset=utf-8' }),
50 | 'pi-blockexplorer-export.csv',
51 | autoByteOrderMark
52 | )
53 | }
54 |
55 | export { exportCSV, jsonToCSV }
56 |
--------------------------------------------------------------------------------
/.github/workflows/symfony.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | name: Symfony
7 |
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 |
14 | permissions:
15 | contents: read
16 |
17 | jobs:
18 | symfony-tests:
19 | runs-on: ubuntu-latest
20 | steps:
21 | # To automatically get bug fixes and new Php versions for shivammathur/setup-php,
22 | # change this to (see https://github.com/shivammathur/setup-php#bookmark-versioning):
23 | # uses: shivammathur/setup-php@v2
24 | - uses: shivammathur/setup-php@2cb9b829437ee246e9b3cac53555a39208ca6d28
25 | with:
26 | php-version: '8.0'
27 | - uses: actions/checkout@v3
28 | - name: Copy .env.test.local
29 | run: php -r "file_exists('.env.test.local') || copy('.env.test', '.env.test.local');"
30 | - name: Cache Composer packages
31 | id: composer-cache
32 | uses: actions/cache@v3
33 | with:
34 | path: vendor
35 | key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
36 | restore-keys: |
37 | ${{ runner.os }}-php-
38 | - name: Install Dependencies
39 | run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
40 | - name: Create Database
41 | run: |
42 | mkdir -p data
43 | touch data/database.sqlite
44 | - name: Execute tests (Unit and Feature tests) via PHPUnit
45 | env:
46 | DATABASE_URL: sqlite:///%kernel.project_dir%/data/database.sqlite
47 | run: vendor/bin/phpunit
48 |
--------------------------------------------------------------------------------
/src/components/TransactionTableContainer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { compose } from 'recompose'
3 | import { withPaging } from './shared/Paging'
4 | import { withDataFetchingContainer } from './shared/DataFetchingContainer'
5 | import { withDataFetchingAllContainer } from './shared/DataFetchingAllContainer'
6 | import { isPublicKey } from '../lib/stellar/utils'
7 | import { isDefInt } from '../lib/utils'
8 | import TransactionTable from './TransactionTable'
9 | import CSVExport from './shared/CSVExport'
10 |
11 | const rspRecToPropsRec = (rspRec) => {
12 | return {
13 | hash: rspRec.hash,
14 | ledger: rspRec.ledger_attr,
15 | opCount: rspRec.operation_count,
16 | sourceAccount: rspRec.source_account,
17 | time: rspRec.created_at
18 | }
19 | }
20 |
21 | const fetchRecords = (props) => {
22 | const builder = props.server.transactions()
23 | if (isDefInt(props, 'ledger')) builder.forLedger(props.ledger)
24 | if (isPublicKey(props.account)) builder.forAccount(props.account)
25 | builder.limit(props.limit)
26 | builder.order('desc')
27 | return builder.call()
28 | }
29 |
30 | const callBuilder = (props) => props.server.transactions()
31 |
32 | const enhance = compose(
33 | withPaging(),
34 | withDataFetchingContainer(fetchRecords, rspRecToPropsRec, callBuilder)
35 | )
36 |
37 | const ExportToCSVComponent =
38 | withDataFetchingAllContainer(fetchRecords)(CSVExport)
39 |
40 | const wrapHOC = (Component) => (props) => (
41 |
42 |
43 |
44 |
45 | {!props.noCSVExport && (
46 |
47 |
48 |
49 | )}
50 |
51 | )
52 |
53 | export default enhance(wrapHOC(TransactionTable))
54 |
--------------------------------------------------------------------------------
/src/components/shared/InfoBanner.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Col from 'react-bootstrap/lib/Col'
3 | import Grid from 'react-bootstrap/lib/Grid'
4 | import Row from 'react-bootstrap/lib/Row'
5 |
6 | // import FetchPonyfill from 'fetch-ponyfill'
7 | // import isEmpty from 'lodash/isEmpty'
8 |
9 | // const fetch = FetchPonyfill().fetch
10 |
11 | // const BANNER_JSON =
12 | // 'https://raw.githubusercontent.com/chatch/stellarexplorer/master/banner.json'
13 |
14 | const InfoBanner = ({ message }) => (
15 |
16 |
17 |
18 |
19 | {/*
20 |
21 | */}
22 |
23 | {/* */}
24 |
25 |
26 |
27 | )
28 |
29 | // class InfoBannerContainer extends React.Component {
30 | // state = {}
31 |
32 | // componentDidMount() {
33 | // fetch(BANNER_JSON)
34 | // .then(rsp => rsp.json())
35 | // .then(({message, expiry}) => {
36 | // if (
37 | // !isEmpty(message) &&
38 | // Number.isInteger(Number(expiry)) &&
39 | // expiry > Date.now()
40 | // ) {
41 | // this.setState({message})
42 | // }
43 | // })
44 | // .catch(err => {
45 | // console.error(`Failed to fetch banner.json: [${err}]`)
46 | // console.error(`stack: [${err.stack}]`)
47 | // })
48 | // }
49 |
50 | // render() {
51 | // return
52 | // }
53 | // }
54 |
55 | export default InfoBanner
56 |
--------------------------------------------------------------------------------
/.github/workflows/cmake-single-platform.yml:
--------------------------------------------------------------------------------
1 | # This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage.
2 | # See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml
3 | name: CMake on a single platform
4 |
5 | on:
6 | push:
7 | branches: [ "development" ]
8 | pull_request:
9 | branches: [ "development" ]
10 |
11 | env:
12 | # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
13 | BUILD_TYPE: Release
14 |
15 | jobs:
16 | build:
17 | # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
18 | # You can convert this to a matrix build if you need cross-platform coverage.
19 | # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
20 | runs-on: ubuntu-latest
21 |
22 | steps:
23 | - uses: actions/checkout@v3
24 |
25 | - name: Configure CMake
26 | # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
27 | # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
28 | run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
29 |
30 | - name: Build
31 | # Build your program with the given configuration
32 | run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
33 |
34 | - name: Test
35 | working-directory: ${{github.workspace}}/build
36 | # Execute tests defined by the CMake configuration.
37 | # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
38 | run: ctest -C ${{env.BUILD_TYPE}}
39 |
40 |
--------------------------------------------------------------------------------
/src/components/layout/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Grid from 'react-bootstrap/lib/Grid'
3 | import Row from 'react-bootstrap/lib/Row'
4 | import Col from 'react-bootstrap/lib/Col'
5 | // import LumensRates from '../shared/LumensRates'
6 |
7 | class Footer extends React.PureComponent {
8 | render () {
9 | return (
10 |
56 | )
57 | }
58 | }
59 |
60 | export default Footer
61 |
--------------------------------------------------------------------------------
/kubernetes/config/app.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: apps/v1
2 | kind: Deployment
3 | metadata:
4 | name: blockexplorer-app-deployment
5 | annotations:
6 | app.gitlab.com/app: "__CI_PROJECT_PATH_SLUG__"
7 | app.gitlab.com/env: "__CI_ENVIRONMENT_SLUG__"
8 | labels:
9 | app: blockexplorer-app
10 | spec:
11 | selector:
12 | matchLabels:
13 | app: blockexplorer-app
14 | template:
15 | metadata:
16 | annotations:
17 | app.gitlab.com/app: "__CI_PROJECT_PATH_SLUG__"
18 | app.gitlab.com/env: "__CI_ENVIRONMENT_SLUG__"
19 | labels:
20 | app: blockexplorer-app
21 | spec:
22 | containers:
23 | - name: blockexplorer-app
24 | image: __APP_IMAGE_TAG__
25 | ports:
26 | - containerPort: 80
27 | resources:
28 | requests:
29 | cpu: __APP_POD_CPU_LIMIT__
30 | ephemeral-storage: __APP_POD_EPHEMERAL_STORAGE_LIMIT__
31 | memory: __APP_POD_MEMORY_LIMIT__
32 | imagePullSecrets:
33 | - name: gitlab-registry
34 | ---
35 | apiVersion: v1
36 | kind: Service
37 | metadata:
38 | name: blockexplorer-app-service
39 | spec:
40 | selector:
41 | app: blockexplorer-app
42 | type: LoadBalancer
43 | ports:
44 | - protocol: TCP
45 | port: 80
46 | targetPort: 80
47 | ---
48 | apiVersion: autoscaling/v2beta1
49 | kind: HorizontalPodAutoscaler
50 | metadata:
51 | name: blockexplorer-app-deployment-hpa
52 | spec:
53 | scaleTargetRef:
54 | apiVersion: apps/v1
55 | kind: Deployment
56 | name: blockexplorer-app-deployment
57 | minReplicas: __APP_MIN_REPLICA__
58 | maxReplicas: __APP_MAX_REPLICA__
59 | metrics:
60 | - resource:
61 | name: memory
62 | targetAverageUtilization: 80
63 | type: Resource
64 | - resource:
65 | name: cpu
66 | targetAverageUtilization: 80
67 | type: Resource
68 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
16 |
17 |
23 | Pi Blockexplorer
24 |
25 |
39 |
40 |
41 |
42 |
43 |
55 |
59 |
60 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/.github/workflows/rubyonrails.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub. They are
2 | # provided by a third-party and are governed by separate terms of service,
3 | # privacy policy, and support documentation.
4 | #
5 | # This workflow will install a prebuilt Ruby version, install dependencies, and
6 | # run tests and linters.
7 | name: "Ruby on Rails CI"
8 | on:
9 | push:
10 | branches: [ "development" ]
11 | pull_request:
12 | branches: [ "development" ]
13 | jobs:
14 | test:
15 | runs-on: ubuntu-latest
16 | services:
17 | postgres:
18 | image: postgres:11-alpine
19 | ports:
20 | - "5432:5432"
21 | env:
22 | POSTGRES_DB: rails_test
23 | POSTGRES_USER: rails
24 | POSTGRES_PASSWORD: password
25 | env:
26 | RAILS_ENV: test
27 | DATABASE_URL: "postgres://rails:password@localhost:5432/rails_test"
28 | steps:
29 | - name: Checkout code
30 | uses: actions/checkout@v3
31 | # Add or replace dependency steps here
32 | - name: Install Ruby and gems
33 | uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
34 | with:
35 | bundler-cache: true
36 | # Add or replace database setup steps here
37 | - name: Set up database schema
38 | run: bin/rails db:schema:load
39 | # Add or replace test runners here
40 | - name: Run tests
41 | run: bin/rake
42 |
43 | lint:
44 | runs-on: ubuntu-latest
45 | steps:
46 | - name: Checkout code
47 | uses: actions/checkout@v3
48 | - name: Install Ruby and gems
49 | uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
50 | with:
51 | bundler-cache: true
52 | # Add or replace any other lints here
53 | - name: Security audit dependencies
54 | run: bin/bundler-audit --update
55 | - name: Security audit application code
56 | run: bin/brakeman -q -w2
57 | - name: Lint Ruby files
58 | run: bin/rubocop --parallel
59 |
--------------------------------------------------------------------------------
/src/lib/__tests__/__data__/pathPayments.js:
--------------------------------------------------------------------------------
1 | export default [
2 | {
3 | _links: {
4 | self: {
5 | href: 'https://horizon.stellar.org/operations/92853980303990785'
6 | },
7 | transaction: {
8 | href: 'https://horizon.stellar.org/transactions/35e241e71a4769f94ed51b224c09f2cf9997e48c9b976674e3ccdf756c1a33cd'
9 | },
10 | effects: {
11 | href: 'https://horizon.stellar.org/operations/92853980303990785/effects'
12 | },
13 | succeeds: {
14 | href: 'https://horizon.stellar.org/effects?order=desc\u0026cursor=92853980303990785'
15 | },
16 | precedes: {
17 | href: 'https://horizon.stellar.org/effects?order=asc\u0026cursor=92853980303990785'
18 | }
19 | },
20 | id: '92853980303990785',
21 | paging_token: '92853980303990785',
22 | source_account: 'GALUJVTISLHBRDI3LYYMQFFIAILACUUZKIOLYWNDJEEYWECUQQNYQGOX',
23 | type: 'path_payment',
24 | type_i: 2,
25 | created_at: '2018-12-23T18:34:02Z',
26 | transaction_hash:
27 | '35e241e71a4769f94ed51b224c09f2cf9997e48c9b976674e3ccdf756c1a33cd',
28 | asset_type: 'credit_alphanum4',
29 | asset_code: 'BTC',
30 | asset_issuer: 'GBSTRH4QOTWNSVA6E4HFERETX4ZLSR3CIUBLK7AXYII277PFJC4BBYOG',
31 | from: 'GALUJVTISLHBRDI3LYYMQFFIAILACUUZKIOLYWNDJEEYWECUQQNYQGOX',
32 | to: 'GALUJVTISLHBRDI3LYYMQFFIAILACUUZKIOLYWNDJEEYWECUQQNYQGOX',
33 | amount: '0.0282862',
34 | path: [
35 | {
36 | asset_type: 'credit_alphanum4',
37 | asset_code: 'LTC',
38 | asset_issuer:
39 | 'GCSTRLTC73UVXIYPHYTTQUUSDTQU2KQW5VKCE4YCMEHWF44JKDMQAL23'
40 | },
41 | {
42 | asset_type: 'credit_alphanum4',
43 | asset_code: 'USD',
44 | asset_issuer:
45 | 'GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK'
46 | }
47 | ],
48 | source_amount: '0.0282762',
49 | source_max: '0.0282862',
50 | source_asset_type: 'credit_alphanum4',
51 | source_asset_code: 'BTC',
52 | source_asset_issuer:
53 | 'GBSTRH4QOTWNSVA6E4HFERETX4ZLSR3CIUBLK7AXYII277PFJC4BBYOG'
54 | }
55 | ]
56 |
--------------------------------------------------------------------------------
/src/lib/search.js:
--------------------------------------------------------------------------------
1 | import isNaN from 'lodash/isNaN'
2 | import isEmpty from 'lodash/isEmpty'
3 | import isString from 'lodash/isString'
4 | import toNumber from 'lodash/toNumber'
5 | import { sdk } from './stellar'
6 |
7 | import {
8 | isFederatedAddress,
9 | isMuxedAddress,
10 | isPublicKey,
11 | isSecretKey,
12 | isTxHash
13 | } from './stellar/utils'
14 | import directory from '../data/directory'
15 |
16 | const { anchors, assets } = directory
17 |
18 | const lcEquals = (str1, str2) =>
19 | !isEmpty(str1) && !isEmpty(str2) && str1.toLowerCase() === str2.toLowerCase()
20 |
21 | const lcIncludes = (str1, str2) =>
22 | !isEmpty(str1) &&
23 | !isEmpty(str2) &&
24 | str1.toLowerCase().includes(str2.toLowerCase())
25 |
26 | const searchAssetCode = (code) =>
27 | Object.keys(assets)
28 | .filter((key) => lcEquals(assets[key].code, code.toUpperCase()))
29 | .map((key) => assets[key])
30 |
31 | const searchAnchorName = (name) =>
32 | Object.keys(anchors).filter(
33 | (key) =>
34 | lcIncludes(anchors[key].name, name) ||
35 | lcIncludes(anchors[key].displayName, name)
36 | )
37 |
38 | const searchStrToPath = (searchStr) => {
39 | if (!isString(searchStr) || searchStr.trim() === '') return null
40 |
41 | const str = searchStr.trim()
42 |
43 | if (isPublicKey(str) || isFederatedAddress(str) || isMuxedAddress(str)) {
44 | return `/account/${str}`
45 | } else if (isTxHash(str)) {
46 | return `/tx/${str}`
47 | } else if (!isNaN(toNumber(str))) {
48 | return `/block/${toNumber(str)}`
49 | } else if (isSecretKey(str)) {
50 | const kp = sdk.Keypair.fromSecret(str)
51 | return `/account/${kp.publicKey()}`
52 | }
53 |
54 | // search by asset code
55 | const codeMatch = searchAssetCode(str)
56 | if (codeMatch.length > 0) {
57 | return `/asset/${str.toUpperCase()}`
58 | }
59 |
60 | // search by anchor name (exact or substring)
61 | const nameMatch = searchAnchorName(str)
62 | if (nameMatch.length > 0) {
63 | return `/anchor/${nameMatch[0]}`
64 | }
65 |
66 | return `/error/not-found/${searchStr}`
67 | }
68 |
69 | export { searchStrToPath }
70 |
--------------------------------------------------------------------------------
/src/components/shared/__tests__/AccountLink.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { configure, shallow } from 'enzyme'
3 | import Adapter from 'enzyme-adapter-react-16'
4 |
5 | import knownAccounts from '../../../data/known_accounts'
6 | import AccountLink, { BaseAccountLink } from '../AccountLink'
7 |
8 | configure({ adapter: new Adapter() })
9 |
10 | const ACC_KNOWN = Object.keys(knownAccounts).find(
11 | (key) => knownAccounts[key].displayName === 'NaoBTC'
12 | )
13 | const ACC_UNKNOWN = 'GCGG3CIRBG2TTBR4HYZJ7JLDRFKZIYOAHFXRWLU62CA2QN52P2SUQNPJ'
14 | const LABEL = 'Anchor'
15 |
16 | describe('AccountLink', () => {
17 | it('renders with label', () => {
18 | const link = shallow()
19 | expect(link.getElements()).toMatchInlineSnapshot(`
20 | Array [
21 | ,
26 | ]
27 | `)
28 | })
29 |
30 | it('renders short account for label when no label property', () => {
31 | const link = shallow()
32 | expect(link.getElements()).toMatchInlineSnapshot(`
33 | Array [
34 | ,
38 | ]
39 | `)
40 | })
41 |
42 | it('renders anchor name in italics if account a known anchor', () => {
43 | const link = shallow()
44 | expect(link.getElements()).toMatchInlineSnapshot(`
45 | Array [
46 |
55 | NaoBTC
56 |
57 | }
58 | subPath="GATEMHCCKCY67ZUCKTROYN24ZYT5GK4EQZ65JJLDHKHRUZI3EUEKMTCH"
59 | title="Base Address: GATEMHCCKCY67ZUCKTROYN24ZYT5GK4EQZ65JJLDHKHRUZI3EUEKMTCH"
60 | />,
61 | ]
62 | `)
63 | })
64 | })
65 |
66 | describe('MuxedAccount', () => {
67 | it.todo('muxed account renders muxed and base')
68 | })
69 |
--------------------------------------------------------------------------------
/.github/workflows/go-ossf-slsa3-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow uses actions that are not certified by GitHub.
2 | # They are provided by a third-party and are governed by
3 | # separate terms of service, privacy policy, and support
4 | # documentation.
5 |
6 | # This workflow lets you compile your Go project using a SLSA3 compliant builder.
7 | # This workflow will generate a so-called "provenance" file describing the steps
8 | # that were performed to generate the final binary.
9 | # The project is an initiative of the OpenSSF (openssf.org) and is developed at
10 | # https://github.com/slsa-framework/slsa-github-generator.
11 | # The provenance file can be verified using https://github.com/slsa-framework/slsa-verifier.
12 | # For more information about SLSA and how it improves the supply-chain, visit slsa.dev.
13 |
14 | name: SLSA Go releaser
15 | on:
16 | workflow_dispatch:
17 | release:
18 | types: [created]
19 |
20 | permissions: read-all
21 |
22 | jobs:
23 | # ========================================================================================================================================
24 | # Prerequesite: Create a .slsa-goreleaser.yml in the root directory of your project.
25 | # See format in https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/go/README.md#configuration-file
26 | #=========================================================================================================================================
27 | build:
28 | permissions:
29 | id-token: write # To sign.
30 | contents: write # To upload release assets.
31 | actions: read # To read workflow path.
32 | uses: slsa-framework/slsa-github-generator/.github/workflows/builder_go_slsa3.yml@v1.4.0
33 | with:
34 | go-version: 1.17
35 | # =============================================================================================================
36 | # Optional: For more options, see https://github.com/slsa-framework/slsa-github-generator#golang-projects
37 | # =============================================================================================================
38 |
39 |
--------------------------------------------------------------------------------
/src/components/shared/LumensRates.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import PropTypes from 'prop-types'
3 | import FetchPonyfill from 'fetch-ponyfill'
4 | const fetch = FetchPonyfill().fetch
5 |
6 | const FEED_URL = 'https://api.coinmarketcap.com/v1/ticker/stellar/'
7 | const UPDATE_INTERVAL = 5 * 60 * 1000
8 |
9 | class LumensRatesContainer extends React.PureComponent {
10 | componentDidMount () {
11 | this.updatePrice()
12 | this.intervalId = setInterval(
13 | () => this.updatePrice.bind(this),
14 | UPDATE_INTERVAL
15 | )
16 | }
17 |
18 | componentWillUnmount () {
19 | clearInterval(this.intervalId)
20 | }
21 |
22 | updatePrice () {
23 | fetch(FEED_URL)
24 | .then((rsp) => rsp.json())
25 | .then((rspJson) => {
26 | const lumens = rspJson[0]
27 | const newState = {
28 | change: lumens.percent_change_24h,
29 | usd: lumens.price_usd
30 | }
31 | this.setState(newState)
32 | })
33 | .catch((err) => {
34 | console.error(`Failed to fetch price: [${err}]`)
35 | console.error(`stack: [${err.stack}]`)
36 | })
37 | }
38 |
39 | render () {
40 | if (!this.state) return null
41 | return
42 | }
43 | }
44 |
45 | class LumensRates extends React.PureComponent {
46 | isPositive (changeNumStr) {
47 | const asFloat = Number.parseFloat(changeNumStr)
48 | return Number.isNaN(asFloat) === false && Number(asFloat) >= 0
49 | }
50 |
51 | renderChange (change) {
52 | const positive = this.isPositive(change)
53 | const valueStr = `${positive ? '+' : ''}${this.props.change}%`
54 | const style = {
55 | color: positive ? '#00c292' : '#fb9678'
56 | }
57 | return {valueStr}
58 | }
59 |
60 | render () {
61 | return (
62 |
63 | Test-π/USD: {this.props.usd} {this.renderChange(this.props.change)}
64 |
65 | )
66 | }
67 | }
68 |
69 | LumensRates.propTypes = {
70 | change: PropTypes.string.isRequired,
71 | usd: PropTypes.string.isRequired
72 | }
73 |
74 | export { LumensRatesContainer as default, LumensRates }
75 |
--------------------------------------------------------------------------------
/config/paths.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const path = require('path')
4 | const fs = require('fs')
5 | const url = require('url')
6 |
7 | // Make sure any symlinks in the project folder are resolved:
8 | // https://github.com/facebookincubator/create-react-app/issues/637
9 | const appDirectory = fs.realpathSync(process.cwd())
10 | const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath)
11 |
12 | const envPublicUrl = process.env.PUBLIC_URL
13 |
14 | function ensureSlash (path, needsSlash) {
15 | const hasSlash = path.endsWith('/')
16 | if (hasSlash && !needsSlash) {
17 | return path.substr(path, path.length - 1)
18 | } else if (!hasSlash && needsSlash) {
19 | return `${path}/`
20 | } else {
21 | return path
22 | }
23 | }
24 |
25 | const getPublicUrl = (appPackageJson) =>
26 | envPublicUrl || require(appPackageJson).homepage
27 |
28 | // We use `PUBLIC_URL` environment variable or "homepage" field to infer
29 | // "public path" at which the app is served.
30 | // Webpack needs to know it to put the right