npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

stellagate-core

v0.1.1

Published

Check a Stellar destination before you send: memo requirements, trustlines, Stellar Asset Contract holdability and contract-account compatibility.

Readme

Stellagate

Check a Stellar destination before you send, not after.

Stellagate tells a wallet, before anything is signed, whether a destination needs a memo, whether it can hold the asset, and whether the sending account can reach it at all. It is built for the payments that go missing today: exchange deposits without a memo, withdrawals to wallets without a trustline, and passkey smart wallets (C-addresses) paying exchanges that only understand memos.

Watch the Stellagate demo

The problem

A Stellar address does not say what the receiver needs.

  • Exchanges pool deposits in one account and credit them by memo. Without it, the funds arrive and are never credited. The SDK team's own description: "a deposit credited to a pooled exchange account with no memo, which means lost funds and a support ticket" (js-stellar-sdk#1607).
  • Memos are still required by many services. Stellar's docs, September 2026: memos "remain the required path for many exchanges, anchors, and wallets" (stellar-docs#2769).
  • Smart wallets cannot attach a memo, because Soroban transactions do not carry one. The muxed-ID transfer that replaces it (CAP-67) "is not yet widely supported in exchanges for deposit" (freighter-mobile#492).
  • Receiving a classic asset needs a trustline and 0.5 XLM of reserve. Withdrawals to a wallet without one fail.

There are now four address forms (G, M, C, and name*domain federation) and a memo field that works for some of them. SEP-29 lets an account flag "memo required", but only helps if the account sets it and the sending wallet checks it. Most exchanges never set it: of the 107 accounts StellarExpert's directory tags memo-required, only 14 carry the SEP-29 flag on chain. Binance, Kraken, Bitstamp, Coinbase Deposits and Crypto.com are among the 93 that do not (survey of 2026-10-02, reproducible with node scripts/survey-memo-required.mjs). A wallet that relies on SEP-29 alone misses 87% of them.

What Stellagate checks

npm install github:StellaGate/stellagate
import { check } from '@stellagate/core'

const verdict = await check({
  to: 'GABFQIK63R2NETJM7T673EAMZN4RJLLGP3OFUEJU5SZVTGWUKULZJNL6', // what the user pasted
  from: 'CB...',      // optional: the sending account, G or C
  memo: undefined,    // optional: a memo the user already entered
  asset: 'native',    // optional: 'native' or CODE:ISSUER, for the holdability check
  amount: '250',      // optional: checked against the receiver's trustline limit
  network: 'public',
})

verdict.status   // 'block'
verdict.entry    // { name: 'Binance Deposits', domain: 'binance.com', tags: ['exchange', 'memo-required'] }
verdict.reasons  // [{ code: 'contract_sender_cannot_memo', severity: 'block',
                 //    message: 'Binance Deposits requires a memo (public directory), and a
                 //              contract account cannot attach one.',
                 //    fix: 'Send from a classic (G...) account with the memo, ...' }]
  1. Parse G, M, C and federation addresses into an account plus memo or muxed ID, and refuse a pasted secret key.
  2. Memo required? From the account's SEP-29 data entry and the StellarExpert directory, later also Stellagate's own exchange records.
  3. Flagged? Blocks accounts the directory marks malicious or unsafe.
  4. Can this sender reach it? Flags a contract account paying a memo-required account, or trying to attach a memo at all, and gives the route that works.
  5. Can it hold the asset? A classic account needs a trustline the issuer has authorised, with room under its limit for the amount. A contract address holds classic assets through the asset's Stellar Asset Contract, so that contract must be deployed, the destination contract must exist, and an issuer that requires approval must have approved it. Contract checks read Stellar RPC: testnet's public endpoint by default, and on mainnet whatever endpoint you pass with contracts: rpcContractSource(url).

Stellagate never signs, submits or holds funds.

Try it without installing anything at stellagate.namite.xyz. The check runs in your browser.

Status

| Part | Status | |---|---| | Problem research and evidence | Done, see docs/PRD.md | | Address parsing (G, M, C, federation, secret-key refusal) | Done, tested | | Memo-required check: SEP-29 and public directory | Done, tested, verified against mainnet | | Malicious and unsafe account flags | Done, tested | | Contract-account sender compatibility | Done, tested | | Trustline and SAC holdability check | Done, tested, exercised on testnet | | Public check page, with terms, privacy and cookie pages | Live at stellagate.namite.xyz and stellagate.github.io/stellagate | | Exchange records with deposit evidence | Planned | | npm release | Planned, not yet published | | Upstream proposal to js-stellar-sdk | Planned |

Evidence

  • scripts/survey-memo-required.mjs checks every account the StellarExpert directory tags memo-required against Horizon. On 2026-10-02: 107 accounts, 14 with SEP-29 set.
  • scripts/testnet-evidence.mjs creates fresh testnet accounts, runs each check, then makes the real payment anyway. Every block below matches a payment the network refused, and every ok matches one it accepted, with two exceptions. The two memo block rows were not sent, because the network accepts a payment with no memo and the exchange never credits it. And in the last row, a token transfer to a contract address with nothing deployed succeeds, and the tokens sit at that address until someone deploys a contract there. The network will not stop that payment, so Stellagate does.
  • The contract destination is a deployed contract (the KYC asset's own Stellar Asset Contract) standing in for a smart wallet.
  • Testnet is reset from time to time, which breaks these links. The script reproduces the whole run in about a minute.

Run on testnet, 2026-10-03.

Setup:

| Step | Transaction | |---|---| | Exchange sets SEP-29 memo_required | acccf23a | | Approval-required issuer sets AUTH_REQUIRED and AUTH_REVOCABLE | 8b27a270 | | Receiver adds STG trustline | a427a390 | | Receiver adds STG trustline with limit 100 | 492c08d1 | | Receiver adds KYC trustline (not yet approved) | 48b900d0 | | Sender adds STG trustline | 9bc4c934 | | Issuer pays sender 1000 STG | e6df3799 | | Deploy the STG Stellar Asset Contract | f3b99f4b | | Deploy the KYC Stellar Asset Contract | bacb5a3b | | Issuer authorises the KYC trustline | 3dbb801d | | Deploy the NEW Stellar Asset Contract | 1d728180 |

Checks, then the real payment:

| Scenario | Destination | Verdict | Reasons | Payment attempted | Network result | |---|---|---|---|---|---| | SEP-29 account, no memo | GBJ2...TMIE | block | memo_required | none | | | SEP-29 account, memo given | GBJ2...TMIE | ok | none | 0413d601 | success | | SEP-29 account, contract sender | GBJ2...TMIE | block | contract_sender_cannot_memo | none | | | No trustline | GDEY...4ZTU | block | no_trustline | d7f807ca | tx_failed, op_no_trust | | Trustline present | GALN...M45E | ok | none | 03c26f4e | success | | Over the trustline limit | GD7W...EK4D | block | trustline_limit_exceeded | b88d4025 | tx_failed, op_line_full | | Within the trustline limit | GD7W...EK4D | ok | none | ddfb5be3 | success | | Trustline not authorised by issuer | GDLA...CXBX | block | trustline_not_authorized | 21a37b87 | tx_failed, op_not_authorized | | Trustline authorised by issuer | GDLA...CXBX | ok | none | f4852528 | success | | Account does not exist, STG | GDHF...JR3E | block | destination_unfunded | e7ab5249 | tx_failed, op_no_destination | | Contract, asset contract not deployed | CC2B...SN4C | block | sac_not_deployed | not submitted | rejected in simulation: HostError: Error(Storage, MissingValue) | | Contract, asset contract deployed | CC2B...SN4C | ok | none | 49922faf | success | | Contract, STG via its asset contract | CC2B...SN4C | ok | none | 3c4a6f90 | success | | Contract, approval-required asset, not approved | CC2B...SN4C | block | sac_balance_not_authorized | not submitted | rejected in simulation: HostError: Error(Contract, #11) | | Contract address with nothing deployed | CDSC...HENS | block | destination_contract_missing | 301a734c | success |

Development

npm install
npm test          # unit tests, offline
npm run build
node scripts/testnet-evidence.mjs   # rerun the testnet evidence, about a minute

The check page lives in site/. It imports the library source directly and runs every check in the visitor's browser, so there is no server.

cd site && npm install
npm run dev                          # http://localhost:5173
[email protected] npm run build

The build refuses to run without a contact address, because the privacy policy names one. Set contactEmail in site/site.config.json or the CONTACT_EMAIL variable. BASE_PATH sets the path the site is served under (/stellagate/ on GitHub Pages, / elsewhere).

Data sources

Horizon and Stellar RPC, SEP-1 stellar.toml files, SEP-2 federation servers, and the StellarExpert directory API. All public. Exchange behaviour is established by small test deposits from the maintainer's own accounts and recorded with the transaction hash.

Maintainer

@jadonamite, an open-source contributor to Stellar projects since January 2026, working on payment infrastructure, Soroban contracts and SDKs.

Contributing

Issues are scoped so each one can be picked up independently. See CONTRIBUTING.md.

License

Apache-2.0. See LICENSE.