├── 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 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /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 | {name} 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 | {/* 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