{"id":15061500,"url":"https://github.com/hubbleprotocol/solana-shadow","last_synced_at":"2025-04-10T08:58:55.899Z","repository":{"id":42935387,"uuid":"412180908","full_name":"hubbleprotocol/solana-shadow","owner":"hubbleprotocol","description":"Synchronized shadow state of Solana programs available for off-chain processing.","archived":false,"fork":false,"pushed_at":"2022-03-26T02:31:56.000Z","size":195,"stargazers_count":44,"open_issues_count":1,"forks_count":4,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-03-24T08:12:10.597Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hubbleprotocol.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-30T18:33:55.000Z","updated_at":"2025-02-11T22:07:10.000Z","dependencies_parsed_at":"2022-09-07T17:34:26.614Z","dependency_job_id":null,"html_url":"https://github.com/hubbleprotocol/solana-shadow","commit_stats":null,"previous_names":["hubble-markets/solana-shadow"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hubbleprotocol%2Fsolana-shadow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hubbleprotocol%2Fsolana-shadow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hubbleprotocol%2Fsolana-shadow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hubbleprotocol%2Fsolana-shadow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hubbleprotocol","download_url":"https://codeload.github.com/hubbleprotocol/solana-shadow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248190487,"owners_count":21062280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T23:20:19.369Z","updated_at":"2025-04-10T08:58:55.875Z","avatar_url":"https://github.com/hubbleprotocol.png","language":"Rust","funding_links":[],"categories":["Solana Development Tools"],"sub_categories":["Notes"],"readme":"# Solana Shadow\n\nThe Solana Shadow crate adds shadows to solana on-chain accounts for off-chain processing. This create synchronises all accounts and their data related to a program in real time and allows off-chain bots to act upon changes to those accounts.\n\n[![Apache 2.0 licensed](https://img.shields.io/badge/license-Apache--2.0-blue)](./LICENSE)\n\n## Usage\n\nAdd this in your `Cargo.toml`:\n\n```toml\n[dependencies]\nsolana-shadow = \"*\"\n```\n\nTake a look at the `examples/` directory for usage examples.\n\n# Mirroring a program id and all its owned accounts:\n\n```rust\n// this is the prog id that owns all pyth oracles on mainnet\nlet prog = \"FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH\".parse()?;\nlet network = Network::Mainnet;\nlet local = BlockchainShadow::new_for_program(\u0026prog, network).await?;\n\nloop {\n  local.for_each_account(|pubkey, account| {\n    println!(\" - [{}]: {:?}\", pubkey, account);\n  });\n\n  sleep(Duration::from_secs(3)).await;\n}\n\nlocal.worker().await?;\n```\n\n# Mirroring few random accounts\n\n```rust\n  // https://pyth.network/developers/accounts/\n  let ethusd = \"JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB\".parse()?;\n  let btcusd = \"GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU\".parse()?;\n\n  let local = BlockchainShadow::new_for_accounts(\u0026vec![ethusd, btcusd], Network::Mainnet).await?;\n\n  loop {\n    let ethacc = shadow.get_account(\u0026ethusd).unwrap();\n    let ethprice = cast::\u003cPrice\u003e(\u0026ethacc.data).agg.price;\n\n    let btcacc = shadow.get_account(\u0026btcusd).unwrap();\n    let btcprice = cast::\u003cPrice\u003e(\u0026btcacc.data).agg.price;\n\n    println!(\"ETH/USD: {}\", ethprice);\n    println!(\"BTC/USD: {}\", btcprice);\n\n    sleep(Duration::from_secs(3)).await;\n  }\n\n  local.worker().await?;\n```\n\n\n# Listening on changes to accounts: \n\n```rust\n\n  // https://pyth.network/developers/accounts/\n  let ethusd = \"JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB\".parse()?;\n  let btcusd = \"GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU\".parse()?;\n  let solusd = \"H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG\".parse()?;\n\n  // create an offline shadow of the on-chain data.\n  // whenever the data change on-chain those changes\n  // will be reflected immediately in this type.\n  let shadow = BlockchainShadow::new_for_accounts(\n    \u0026vec![ethusd, btcusd, solusd],\n    Network::Mainnet,\n  )\n  .await?;\n\n  tokio::spawn(async move {\n    // start printing updates only after 5 seconds\n    tokio::time::sleep(Duration::from_secs(5)).await;\n\n    // now everytime an account changes, its pubkey will be\n    // broadcasted to all receivers that are waiting on updates.\n    while let Ok((pubkey, account)) = updates_channel.recv().await {\n      let price = cast::\u003cPrice\u003e(\u0026account.data).agg.price;\n      println!(\"account updated: {}: {}\", \u0026pubkey, price);\n    }\n  });\n\n  shadow.worker().await?;\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhubbleprotocol%2Fsolana-shadow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhubbleprotocol%2Fsolana-shadow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhubbleprotocol%2Fsolana-shadow/lists"}