{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Account Discovery","siteUrl":"https://opensource.ripple.com/","meta":[{"name":"google-site-verification","content":"bLwyBi1imklcIuQxZ7JeI_kRF5Mg7yfr6arpEQV2nsE"}],"llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]},"description":"You can get a list of accounts per-connector or across the whole client."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"account-discovery","__idx":0},"children":["Account Discovery"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can get a list of accounts per-connector or across the whole client."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"/**\n * Account discovery.\n *\n * Custodians discover their accounts at construction; `init` merges them into a\n * single index keyed by r-address. You can list them per-connector or across\n * the whole client, resolve a specific account, and re-discover at runtime.\n */\nimport { LocalSigner, SimpleXRPL } from 'simplexrpl'\n\nconst client = await SimpleXRPL.init({\n  xrpldUrl: 'wss://s.altnet.rippletest.net:51233',\n  signers: [LocalSigner.fromEnv()],\n})\n\n// 1. Every account the client knows, across all connectors (r-address → account).\nfor (const [address, account] of client.accounts) {\n  console.log(address, '→', account.signer.kind)\n}\n\n// 2. Per-connector discovery: ask a single custodian what it owns.\nfor (const signer of client.signers) {\n  const owned = await signer.listAccounts()\n  console.log(signer.kind, 'owns', owned.length, 'account(s)')\n}\n\n// 3. Resolve the account an operation would act on. With no argument, the primary\n//    signer's primary account; or pass an r-address / a { signer } selector.\nconst primary = client.resolveAccount()\nconsole.log('primary:', primary.address)\nconst specific = client.resolveAccount('rSomeKnownAddress0000000000000000000')\nconsole.log('resolved:', specific.address)\n\n// 4. Re-discover after upstream changes (e.g. a new custodian wallet).\nawait client.refreshAccounts()\n\n// 5. Read an account's on-chain state (no signer required). With no argument it\n//    reads the primary signer's account; pass an r-address to read any account.\nconst state = await client.account.retrieve()\nconsole.log('primary balance (XRP):', state.data.xrpBalance)\nconsole.log(\n  'sequence:',\n  state.data.sequence,\n  'owner objects:',\n  state.data.ownerCount,\n)\n\nawait client.disconnect()\n","lang":"ts"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":1},"children":["See Also"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/client#resolveaccount"},"children":["client.resolveAccount()"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/client#refreshaccounts"},"children":["client.refreshAccounts()"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/client#properties"},"children":["Client properties (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accounts"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["signers"]},")"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/connectors#listaccounts"},"children":["connector.listAccounts()"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/verticals/account/retrieve"},"children":["account.retrieve()"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/simplexrpl/references/types#account"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Account"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccountSelector"]}," types"]}]}]}]},"headings":[{"value":"Account Discovery","id":"account-discovery","depth":1},{"value":"See Also","id":"see-also","depth":2}],"frontmatter":{"seo":{"description":"You can get a list of accounts per-connector or across the whole client.","title":"Account Discovery"},"labels":["simpleXRPL","SDK"]},"editPage":{"to":"https://github.com/ripple/opensource.ripple.com/tree/main/docs/simpleXRPL/tutorials/account-discovery.md"},"lastModified":"2026-08-26T05:15:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/simplexrpl/tutorials/account-discovery","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}