BAGHOLDER Version 1.0 — Last updated: October 6, 2026
BAGHOLDER LLC, an Ohio limited liability company ("BAGHOLDER," "we," "us," or "our"), offers BAGHOLDER, a non-custodial cryptocurrency software tool. This Privacy Policy explains how we collect, use, disclose and protect information when you use our mobile application ("App"), the BAGHOLDER server the App talks to, and the private-key export page the App opens (Section 6.2). It does not cover the services of third parties, such as payment and payout providers, which have their own privacy policies (Section 6).
The App helps you buy, swap, send and sell tokens using your own non-custodial embedded wallet on supported blockchain networks (currently: Base, Optimism, Arbitrum, Avalanche, BNB Smart Chain, Polygon, and Solana). Buys, sells and swaps are carried out as decentralized exchange (DEX) swaps, which your wallet signs. We do not hold or take custody of your funds, and our server cannot sign transactions from your wallet.
Transactions on a public blockchain, including your wallet address and the amounts you move, are public and permanent. They are recorded by the network, not by us, and neither we nor anyone else can delete or change them.
The following data is stored on your device. Secrets (sign-in tokens, and the account protection data below) are kept in your phone's secure storage (iOS Keychain / Android Keystore). Everything else is kept in the App's local database. That database is not separately encrypted by the App: it is protected by your phone's own storage encryption (when your phone has a lock screen), and your phone's operating system keeps it private to the App.
Apart from the encrypted cloud backup described below, the account protection data above, issue reports you choose to email us, and the information each feature sends to our server as described in Section 3 (for example, your wallet address and state code when you buy, sell, swap or send), this data remains on your device.
The App keeps an encrypted cloud backup of most of the above — Section 6.4 lists exactly what. Issue reports are not included. The backup is automatic rather than something you switch on: your local data is encrypted on your device with a key derived from your wallet signature, and the resulting opaque ciphertext is uploaded shortly after your records change. Our server does not hold the decryption key and cannot read the contents.
Our server stores the following data in an access-controlled database:
We use these records for payment processing, service improvement, security, legal and regulatory compliance, and feature functionality. Apart from the IP address on the state-of-residence onboarding records (Section 3.1), and anything a payout provider puts in a notification it sends us (see "Payout provider webhook records" above), these records do not include your name, email, phone number, mailing address, date of birth, government ID, biometric data, IP address, or user-agent string. We treat wallet addresses as pseudonymous identifiers that are personal information for the purposes of this policy and of U.S. state privacy laws such as the California CCPA/CPRA. Wallet addresses are public on the blockchain, but they can be linked to other information about you.
For some record types, after a fixed period, wallet addresses are automatically replaced with a keyed one-way hash (see Section 7 for the per-table schedule). Other record types keep the address until you delete your account. Hashing keeps the underlying financial records intact for accounting and audit while removing the direct link to your wallet identifier.
Your email address on a buy. The App sends our server the email address of your sign-in account, over an encrypted connection, only when the payment provider chosen for that buy requires it in its payment API, and our server then forwards it to that provider. Neither our current payment provider, Coindisco, nor the Coinbase Onramp fallback described in Section 6.1 requires it, so on a buy today your email address is not sent to our server at all. Only an older Coinbase checkout, which our server uses only if none of those providers is set up, requires it. No table in our database stores your email address.
During signup, before you have a wallet, the App sends events to our server to record outcomes at each gate (age verification, state selection, and legal-document review). These records exist so that we can show, to a regulator or as otherwise required by law, how we screened our users. The events we record:
Each event is keyed by a per-device fingerprint — a random UUID issued by our server on first launch, stored in your device's secure storage. We do not link the fingerprint to your wallet, name, email, or any identity on our side; it exists only so we can recognize repeat attempts from the same install. The fingerprint resets if you reinstall the App on Android (iOS Keychain persists across reinstalls).
We also store the request IP address, but only with the state-of-residence events — your attestation at signup (pass or fail) and any later change of state in Settings — not with the other onboarding events. It is the address our hosting provider's network reports for the request, not one the App supplies. We use it only as a passive cross-reference for the audit trail (and could disclose it as described in Section 5.1). It is kept for one year, we do not link it to your wallet or payment records, and we do not display it back to you anywhere in the App.
Sanctioned-region check. To comply with U.S. sanctions law, when you sign up, sign in, buy, sell, cash out, swap or send, and on certain other account requests, our server looks up the network location of the request in a location database and refuses it if it comes from Cuba, Iran, North Korea, Syria, or the Crimea, Kherson, Zaporizhzhia, Sevastopol, Donetsk or Luhansk regions of Ukraine. The lookup happens in memory; the IP address is not stored by this check (the separate state-of-residence record above is the only place an IP address is kept). When a request is refused we record, in our operational logs (Section 3), only the region, the kind of request, the time, and a keyed one-way scrambled code derived from your wallet address (or, before sign-in, the IP address) — not the address itself. The location database is an approximate signal (a VPN, for example, can hide a location) and is one check among several, not a guarantee. IP geolocation by DB-IP (https://db-ip.com), licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/).
We treat the captured IP address as a signal, not a proof. Many factors — VPNs, mobile carrier NAT (millions of mobile users share egress IPs through the same carrier), corporate networks, school networks, IPv6 transition, Tor — make the IP address of a request an unreliable indicator of the user's actual physical location. We do not treat the IP address as proof of where you live or where you were when you attested. Your self-attested state of residence is the primary record; the IP address is one secondary cross-reference for the audit trail. If you later update your state of residence (see Settings → State of Residence), we record a separate state_changed event with the prior and new state codes — this preserves the full history of every state you have attested, which is the durable record we rely on.
Soft-block. If the same device records three rejected attempts at the age or state gate within 24 hours, the App will display a "we can't verify your eligibility right now, please try again later" message and disable further attempts until 24 hours after the first of those attempts. This check runs in the App, on your device. It is a friction control to prevent rapid retry-with-different-input attacks.
These records are retained for one year (see Section 7). We do not link them to your wallet, payment, or order records, even after you have a wallet, and deleting your account does not reach them because they are not keyed to your wallet.
We do not store on any BAGHOLDER server:
When you fund a purchase, our payment provider, Coindisco (an aggregator that routes each purchase to an underlying licensed provider), runs the fiat-to-stablecoin step on its own hosted checkout page, opened in an in-app browser tab.
payment_charges and related tables have no column for either.Where selling is available, your cash-out is handled by a third-party payout provider reached through the Coindisco aggregator. Today that provider is Transak, reached through Coindisco. The provider performs identity verification on its own hosted page, under its own privacy policy.
We do not sell your personal information, and we do not share it for cross-context behavioral (targeted) advertising. The App contains no advertising or marketing-analytics software; the only third-party analytics-type services it uses are Firebase Crashlytics and Firebase Remote Config (Sections 6.3 and 6.3.1). We disclose information only:
BAGHOLDER integrates with third-party services that process your data under their own privacy policies:
Our payment provider, Coindisco (an aggregator that routes each purchase to an underlying licensed provider), processes the USD-to-stablecoin conversion via a hosted onramp and delivers the stablecoin directly to your wallet. The provider (and the underlying business) may collect payment information and identity data under their own privacy policies. What we send it is listed in Section 4.1. We receive back the provider's session or order identifiers, its checkout link, its fee, the order status and confirmation of delivery; we do not receive any of the KYC information the provider may collect.
Tax reporting: BAGHOLDER does not prepare or file tax forms on your behalf and does not issue tax forms. We provide information to a tax authority only where the law requires it (Section 5.1). Any tax form relating to your crypto activity would come from a third party, such as the payout provider you cash out through. Activity in the App shows your history, read from the blockchain for your address. Our Terms of Service describe the tax consequences you are responsible for; we do not give tax advice.
The provider's own privacy policy is presented on its checkout page before you pay. If Coindisco cannot route a purchase, it may instead be handled by Coinbase Onramp, under Coinbase's own terms and privacy policy. We do not send your email address to Coinbase on such a purchase; Coinbase collects whatever it needs on its own page. Section 3 describes the one older Coinbase checkout that would need it.
Privy creates and manages your non-custodial embedded wallet using advanced cryptographic techniques. Privy may collect your email address or social login credentials for authentication. We do not receive or store your login credentials. The App reads the email address of your sign-in account from Privy and includes it with a buy only when that buy's payment provider requires it (Section 3), and our server stores the account identifier Privy issues to you (Section 3, wallet-to-account bindings). See: privy.io/privacy
Private-key export page. The export page the App opens is a BAGHOLDER web page that runs Privy's sign-in and Privy's own key-reveal window. The page itself sends nothing to our server; the key is shown to you by Privy, and we do not receive it.
Operator: Google LLC. Purpose: collecting crash and stability diagnostics so we can identify and fix bugs.
When the App crashes or encounters an uncaught framework error, Crashlytics uploads:
Before a crash report leaves your device, our error sanitizer removes the following from the error message:
We do not attach your name, email address, wallet address or transaction history to crash reports, and we do not set a user identifier in Crashlytics. Crashlytics also receives your IP address at upload time, which Google states it uses for geographic distribution analysis and discards afterward.
Retention: Google states that Crashlytics retains crash reports for up to 90 days. We use crash data only to find and fix problems, not for advertising, and we do not disclose it to anyone other than Google except as described in Section 5.1.
See: firebase.google.com/support/privacy
We also use Firebase Remote Config, operated by Google, to control feature flags and the minimum supported app version. The App sends no wallet address or account data to Remote Config. As with other Firebase services, a request carries the App's identifier and version, a Firebase installation identifier, and reaches Google from your IP address.
The App keeps an encrypted cloud backup of your local data. It is automatic: an upload follows shortly after your records change, so a lost or replaced device does not mean lost records. It covers your bags, your buys, your sells and cash-outs, your token swaps, your sends (including the addresses you sent to), stablecoin conversions, our platform fees, gas purchases, your settings (which include your wallet address, your state of residence and when you passed the age check) and your portfolio snapshots — everything the App records locally except issue reports, caches and in-flight queues, which are rebuilt rather than carried.
Two of those are carried but do not each trigger an upload of their own: a change to your settings alone, or to your portfolio snapshots alone, is included in the next upload any other record triggers, or in the backup the App makes when it starts (at most once a day). Everything financial triggers an upload shortly after it is recorded.
Your data is encrypted on your device with a key derived from your wallet signature before being uploaded. The server stores the opaque ciphertext, your wallet address (as the lookup key), how many records and bags it contains, a version counter, and a timestamp. It also keeps a short history of your previous encrypted backups — the most recent few, one per day for the last week, and the largest from the last 30 days — so that a bad or truncated upload can be recovered from rather than being the end of your records. Every one of those is the same opaque ciphertext: the server does not hold the decryption key and cannot read the contents of any of them. On a reinstall or a new device, signing in with the same wallet lets the App decrypt and restore your data.
There is no setting to disable the backup, and the reason is not convenience: it is the only way your records survive a lost phone. The App has no feature that rebuilds them by reading the blockchain — your coins stay on-chain, but what you paid for them is not written there — so an off switch would quietly cost you that.
Your control is to delete the backup at any time through Settings > Delete Account.
We cannot read the contents of your backup. We can see that one was uploaded and roughly how many records it holds, and because uploads follow your activity closely, those timestamps and counts do say something about when you used the App and how often. We do not use them for anything beyond storing and restoring your backup.
We fetch public cryptocurrency price, chart, and market data via CoinGecko. We do not send CoinGecko your wallet address. The App loads token images directly from CoinGecko's image servers and, if our server cannot be reached, may request prices from CoinGecko directly; those requests come from your device, so CoinGecko receives your IP address and the tokens requested.
Our server fetches public near-live token prices from DefiLlama, keyed only by the token identifier. No user data is shared with DefiLlama.
Where selling is available, your cash-out is handled by a third-party payout provider reached through the Coindisco aggregator — today, Transak, reached through Coindisco (Section 4.2). We send the provider the chain, the asset, the amount, the payout method, the currency, your state, and your forwarded IP address, so that it can quote and create the order. The provider performs identity verification, compliance checks, and the payout itself, under its own terms and privacy policy — see Section 4.2. We receive back the order status, the fiat payout amount and its currency, the provider's fee, the settled crypto amount, the deposit transaction hash, and the notifications described in Section 3.
BAGHOLDER is not the buyer or the seller, does not receive the crypto you sell or the cash you are paid (apart from any BAGHOLDER sell fee, which your wallet sends by a separate transfer), and cannot reverse a transfer. See Terms of Service §7.1.
Third-party providers relay blockchain data between your wallet and the network: they answer balance and history lookups and broadcast the transactions your wallet signs. The App normally reaches them through our server, so they see your wallet address and your signed transactions, but not your IP address. On Solana, our server uses Helius for this, including balance reads, transaction broadcasts and your transaction history. If our server cannot be reached, the App may contact a public RPC provider directly, which then sees your IP address together with your wallet address. No personal data is shared beyond your wallet address, on-chain data and, on that direct fallback, your IP address.
For buys, sells and swaps on Solana, the App sends your swap parameters (input token, output token, amount, your wallet address) through our server to Jupiter's aggregator API so it can return a routed swap transaction your wallet then signs. Jupiter sees the wallet address and swap parameters, not your IP address. See: jup.ag/legal/terms-of-use
Each server-side record type has a defined retention window, after which either the entire record is deleted OR the wallet address is replaced with a keyed one-way hash (HMAC), or the record is kept as stated below. Replacing the address removes it from the record, but it is not full anonymization: the amounts, dates, chain and state code that remain could in principle be matched against the public blockchain.
| Record type | Retention | Wallet address handling |
|---|---|---|
| Payment charge records | Retained indefinitely as the financial and audit record | Retained raw — required for tax and payment-provider dispute windows; replaced with a keyed hash on account deletion |
| Treasury ledger / fee records | Retained indefinitely as the financial and audit record | Wallet address replaced with a keyed hash after 90 days |
| Gas funding records | Retained indefinitely as the financial and audit record | Wallet address replaced with a keyed hash after 1 year |
| Swap fee and swap check records | Retained indefinitely as the financial and audit record | Retained raw; replaced with a keyed hash on account deletion, when the fee transaction hash and any spending address are also cleared |
| Send check records | Retained indefinitely as the financial and audit record | Retained raw; replaced with a keyed hash on account deletion, when any spending address is also cleared. The recipient address is not stored |
| Swap event logs | Up to 1 year, then deleted | Deleted on account deletion |
| Server error records | Deleted 90 days after the error last occurred | Deleted on account deletion |
| Usage events | 1 year, then deleted | Wallet address replaced with a keyed hash after 90 days, or on account deletion if sooner |
| Onboarding attestation records (Section 3.1) | 1 year, then deleted | Keyed by device fingerprint (the state-of-residence events also carry the request IP), not linked by us to a wallet or payment record; not reached by account deletion |
| Shared bag configurations | A shared bag created more than 1 year ago that has been opened at most once and never copied is deleted; other shared bags are kept until account deletion | Deleted with the bag |
| Encrypted backups and their history | While account is active (history thinned as described in Section 6.4) | Deleted on account deletion |
| Wallet address bindings and wallet-to-account bindings | While account is active | Deleted on account deletion |
| Gas seed record (a keyed one-way hash of your Privy account identifier, and each network on which you received a gas seed — no wallet address, transaction or amount) | Indefinitely | Kept after account deletion, so the one-time gas seed is not claimed again by deleting and recreating an account |
| Account protection records (scrambled PIN, and the records of the phones your account is signed in on) | While account is active; some phone records are deleted earlier (Section 3) | Deleted on account deletion |
| Balance caches | Served for up to 60 seconds; deleted after 7 days | Deleted on account deletion |
| Swap quote records | Deleted when the quote expires | Deleted with the record |
| Other balance-lookup caches | Up to 30 days | Deleted with the record |
| Added-token list (which tokens users add, as a count per token) | Dropped 30 days after a token was last asked for | No wallet or account attached, so nothing to delete per account |
| Solana token-account (ATA) records | While account is active | Deleted on account deletion |
| Suspended-wallet list | Kept while the suspension stands | Not removed on account deletion, so that deleting an account cannot undo a suspension |
| Sell (cash-out) session records — order created | Retained indefinitely as the financial and audit record, on the same basis as payment charge records | Retained raw; replaced with a keyed hash on account deletion |
| Sell session records — creation failed before the order reached the provider | Deleted after 90 days | Deleted with the record |
| Sell fee records | Retained indefinitely as the financial and audit record, on the same basis as sell session records | Retained raw; replaced with a keyed hash on account deletion, when the fee and refund transaction hashes are also cleared |
| Payout provider webhook records | Raw body blanked 30 days after the notification is processed; the record itself deleted after 180 days | No wallet column; the body, which may name your wallet, is blanked |
| Payment provider notification records | Deleted after 180 days | No wallet column |
| Server operational logs (Section 3) | Up to 30 days, kept by our hosting provider | Contain no IP addresses |
| Hosting provider request logs (Section 3) | Up to 30 days, kept by our hosting provider (Railway) | Include your IP address; not copied into our records |
Local on-device data is stored until you delete your account or uninstall the App. Local portfolio snapshots older than 365 days are pruned.
Two caveats about sell records. First, a sell whose outcome we could not confirm — for example, where we could not tell whether the order reached the provider — is kept, not deleted at 90 days, because deleting a record of a transfer that may have happened would destroy the audit trail. Second, unlike some other record types, a sell record's wallet address is not replaced with a hash automatically after a fixed period; it is hashed when you delete your account (Section 7.2).
The periods above are what our systems do in the ordinary course. We may keep a specific record longer, and suspend a scheduled deletion or hashing, where the law requires it, to comply with a subpoena, court order or other legal process or a legal hold, to resolve a dispute, or to investigate fraud, a sanctions matter or a security incident. Records held by third parties (Section 6) are kept under their own policies.
When you delete your account from Settings → Delete Account, the App first asks our server to:
To stop the one-time gas seed being claimed again by deleting and recreating an account, we keep a keyed one-way hash of your Privy account identifier together with each network on which you received a seed. It holds no wallet address, transaction or amount. We use it only to check whether a seed was already sent, and we keep it indefinitely.
We additionally clear the transaction hashes and provider transaction identifiers on payment charge, gas funding and treasury ledger records, and any spending address on swap and send check records, because these can identify your wallet on-chain.
For sell fee records we additionally clear the fee transaction hash and any refund transaction hash, because either one identifies your wallet on-chain.
For sell records we additionally clear the provider redirect link, the provider's transaction identifier, any error text, and the deposit transaction hash. We also blank the stored payout-provider webhook bodies that referenced you or your orders, leaving an empty stub so that a repeat notification from the provider stays a no-op.
Records that account deletion does not reach are listed in the table in Section 7.1: onboarding attestation records, which are not keyed to your wallet; the suspended-wallet list, which we keep so that deleting an account cannot undo a suspension; and short-lived caches, which expire on their own schedule. Account deletion also does not reach logs kept by our hosting provider (up to 30 days), crash reports held by Google (Section 6.3), records kept longer for a reason listed at the end of Section 7.1, information held by third parties such as Privy and the payment and payout providers (contact them directly), or anything recorded on a public blockchain, which no one can delete.
If our server cannot be reached or any server step fails, the App does not erase anything on your phone and asks you to try again. Server steps that had already completed stay completed; trying again finishes the rest.
Once the server steps succeed, the App:
We use reasonable administrative, technical and physical measures designed to protect the information we hold, appropriate to its nature. They include:
No method of storing or transmitting information is completely secure, and we cannot guarantee the security of your information. You are responsible for securing access to your device, your sign-in account and your wallet. If we learn of a security incident affecting your personal information, we will notify you and others as required by applicable law.
How we handle requests. Because our server records are keyed by wallet address rather than by name or email, we will ask you to show that you control the wallet the request concerns (for example, by signing a message with it) before we act on it, and we may decline a request we cannot verify. You may use an authorized agent where the law allows; we may ask the agent for proof of your authorization and ask you to verify your identity directly. We may decline or limit a request where an exception in applicable law applies, for example records we must keep under Section 7.1. We respond within the time required by applicable law, and if we decline a request we will tell you why and how to ask us to reconsider. We do not charge for requests and do not treat you differently for making them.
When you tap Settings > Contact Support, BAGHOLDER opens your device's email app with a message addressed to [email protected] (or, if no email app is set up, your device's share sheet with that address at the top of the message). The email body is pre-filled with a short summary: a random support code for your copy of the App (it is not derived from your wallet), your EVM and Solana wallet addresses, the app version, your device's operating system and its version, a count of anything unfinished, and up to three recent payment session IDs. For faster triage we also pre-attach a CSV file (bagholder_diagnostics.csv) containing:
The file never contains your private key, your sign-in tokens, your PIN, the address a send went to, or a payout provider's deposit address (the transaction hash identifies them on the blockchain).
You can preview and remove the attachment before sending, edit the email body, or close the composer entirely without sending anything. Nothing leaves your device unless you tap Send. The email goes to BAGHOLDER support through your email provider and ours; we use it only to answer you and do not otherwise disclose it except as described in Section 5.1.
Messages you send us. Any email or letter you send us — to support, or to our notices address ([email protected], or our mailing address in Section 14), for example a Notice of Dispute, an arbitration opt-out or a copyright complaint under our Terms of Service, or a privacy request under Section 9 — reaches us with your email address, your name if you include it, and its contents. We keep these messages in our email system for as long as we need them to answer you and as a record of the request, including any period the law requires; they are not added to the records in Section 3.
Several U.S. states, including California, give their residents rights over personal information. Some of these laws apply only to businesses above certain size or activity thresholds, and describing them here is not a statement that any particular law applies to BAGHOLDER. Whatever your state, we offer every user the rights in Section 9: to know and get a copy of the personal information we hold, to have it deleted (subject to the exceptions in Section 7), to correct it, and not to be treated differently for asking.
address, name and message (Section 9.1). We collect them from you, from your device, from public blockchains, and from the providers you use (Section 6). Purposes are in Section 5, recipients in Sections 5.1 and 6, and retention in Section 7.
To make a request, contact us at [email protected] (Section 9, "How we handle requests").
Opt-out preference signals. Because we do not sell or share personal information or use it for targeted advertising, there is nothing for a Global Privacy Control or similar signal to opt you out of; we treat every user as opted out.
Do Not Track. The App does not track you across other companies' apps or websites and does not serve advertising, so it has no behaviour that changes in response to a browser "Do Not Track" signal.
BAGHOLDER is available in 41 U.S. states — see Terms of Service §5 for the full enumerated list.
BAGHOLDER is not available in New York, Connecticut, Louisiana, Vermont, New Mexico, the District of Columbia, Pennsylvania, Oregon, Arkansas, or West Virginia.
The App is offered only to residents of the United States and is not directed to anyone outside it. Information you provide is processed in the United States and, by our service providers (Section 6), wherever they operate. If you use the App from outside the United States, you do so on your own initiative and understand that U.S. law applies to the information we hold.
BAGHOLDER is not intended for, and may not be used by, anyone under the age of 18. The App asks for your age before signup and does not let anyone who enters an age under 18 continue. We do not knowingly collect personal information from anyone under 18, apart from the age-check record described in Section 3.1: if someone enters an age under 18, we record only the age band and attempt number, with the random install identifier, as an audit record of the check, and no date of birth. If we learn that someone under 18 has given us other personal information, we will take steps to delete it. To tell us, contact [email protected].
We may update this Privacy Policy from time to time. The current version is available in the App under Settings, with its effective date. If we make material changes, we will tell you in the App before they apply to you, normally by asking you to review and accept the updated policy. Where the law requires your consent to a change, we will ask for it and will not apply the change to you without it.
If you have questions about this Privacy Policy, or want to make a request under Section 9 or 10, contact BAGHOLDER LLC at:
BAGHOLDER LLC, 162 1/2 E Central Ave, Delaware, Ohio 43015-1873
https://getbagholder.com