{"id":29228185,"url":"https://github.com/carteramesh/fireblocks-solana-signer","last_synced_at":"2025-07-03T10:03:45.665Z","repository":{"id":302308585,"uuid":"1007103354","full_name":"CarteraMesh/fireblocks-solana-signer","owner":"CarteraMesh","description":"Implementation of Solana Signer using Fireblocks' MPC","archived":false,"fork":false,"pushed_at":"2025-07-01T16:43:00.000Z","size":85,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-01T17:36:20.107Z","etag":null,"topics":["blockchain","fireblocks","rust","solana"],"latest_commit_sha":null,"homepage":"https://cartera-mesh.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CarteraMesh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-23T13:18:49.000Z","updated_at":"2025-07-01T16:43:02.000Z","dependencies_parsed_at":"2025-07-01T17:38:30.421Z","dependency_job_id":"d65dd4b6-1d0e-4fc3-a904-64395d6e9e8f","html_url":"https://github.com/CarteraMesh/fireblocks-solana-signer","commit_stats":null,"previous_names":["carteramesh/fireblocks-solana-signer"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/CarteraMesh/fireblocks-solana-signer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarteraMesh%2Ffireblocks-solana-signer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarteraMesh%2Ffireblocks-solana-signer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarteraMesh%2Ffireblocks-solana-signer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarteraMesh%2Ffireblocks-solana-signer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CarteraMesh","download_url":"https://codeload.github.com/CarteraMesh/fireblocks-solana-signer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarteraMesh%2Ffireblocks-solana-signer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263305224,"owners_count":23445855,"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":["blockchain","fireblocks","rust","solana"],"created_at":"2025-07-03T10:02:04.146Z","updated_at":"2025-07-03T10:03:45.651Z","avatar_url":"https://github.com/CarteraMesh.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e\u003ccode\u003efireblocks-solana-signer\u003c/code\u003e\u003c/h1\u003e\n  \u003ca href=\"https://docs.rs/fireblocks-solana-signer/\"\u003e\n    \u003cimg src=\"https://docs.rs/fireblocks-solana-signer/badge.svg\" alt=\"docs\" height=\"25\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/CarteraMesh/fireblocks-solana-signer/actions\"\u003e\n    \u003cimg src=\"https://github.com/CarteraMesh/fireblocks-solana-signer/actions/workflows/test.yml/badge.svg\" alt=\"build\" height=\"25\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://deps.rs/repo/github/CarteraMesh/fireblocks-solana-signer\"\u003e\n    \u003cimg src=\"https://deps.rs/repo/github/CarteraMesh/fireblocks-solana-signer/status.svg\" alt=\"deps\" height=\"25\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://codecov.io/github/CarteraMesh/fireblocks-solana-signer\" \u003e\n   \u003cimg src=\"https://codecov.io/github/CarteraMesh/fireblocks-solana-signer/graph/badge.svg?token=dILa1k9tlW\" alt=\"codecov\" height=\"25\"/\u003e\n \u003c/a\u003e\n  \u003ca href=\"https://crates.io/crates/fireblocks-solana-signer\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/fireblocks-solana-signer.svg\" height=\"25\" alt=\"crate\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n# Overview\n\nImplementation of a Solana [Signer](https://docs.rs/solana-signer/2.2.1/solana_signer/trait.Signer.html) using Fireblocks as backend signer\n\n## Prerequisites\n\nA fireblocks account with API key.\nSee developer [portal](https://developers.fireblocks.com/docs/introduction) and sign up for a [sandbox](https://developers.fireblocks.com/docs/sandbox-quickstart) account\n\n## Installation\n\nAdd this to your `Cargo.toml`:\n\n```toml\n[dependencies]\nfireblocks-solana-signer = \"1.0.3\"\n```\n\nOr install via cargo:\n\n```bash\ncargo add fireblocks-solana-signer@1.0.3\n```\n\n## ⚠️ IMPORTANT: Automatic Transaction Broadcasting\n\n**This signer automatically broadcasts transactions to the Solana network.** When you call any signing method (like `try_sign`), Fireblocks will:\n\n1. Sign the transaction with your private key\n2. **Automatically broadcast the signed transaction to the network**\n3. Return the signature to your application\n\nThis is a **purposeful security design decision** by Fireblocks to ensure transaction integrity. **You do not need to (and should not) broadcast the transaction yourself** after signing.\n\nThe transaction is already on-chain when the signing method returns successfully!\n\n## TLDR\n\n\n```rust,no_run\nuse {\n    fireblocks_solana_signer::FireblocksSigner,\n    solana_message::Message,\n    solana_rpc_client::rpc_client::{RpcClient, SerializableTransaction},\n    solana_sdk::instruction::Instruction,\n    solana_transaction::Transaction,\n};\n\nfn memo(message: \u0026str) -\u003e Instruction {\n    Instruction {\n        program_id: spl_memo::id(),\n        accounts: vec![],\n        data: message.as_bytes().to_vec(),\n    }\n}\n\nfn main() -\u003e anyhow::Result\u003c()\u003e {\n    let signer: FireblocksSigner = FireblocksSigner::from_env(None)?;\n    let rpc = RpcClient::new(\n        std::env::var(\"RPC_URL\")\n            .ok()\n            .unwrap_or(\"https://rpc.ankr.com/solana_devnet\".to_string()),\n    );\n    let hash = rpc.get_latest_blockhash()?;\n    let message = Message::new(\u0026[memo(\"fireblocks signer\")], Some(\u0026signer.pk));\n    let mut tx = Transaction::new_unsigned(message);\n    \n    // ⚠️ This signs AND broadcasts the transaction automatically!\n    tx.try_sign(\u0026[\u0026signer], hash)?;\n    \n    // ✅ Transaction is already on-chain, just get the signature\n    println!(\"Transaction broadcasted with signature: {}\", tx.get_signature());\n    \n    // ❌ DO NOT do this - transaction is already broadcasted!\n    // rpc.send_transaction(\u0026tx)?; // This will likely fail\n    \n    Ok(())\n}\n```\n\nSee [example](./examples/memo.rs) \n\n## Environment Variables\n\n| Var                      | Example                                               |\n|--------------------------|-------------------------------------------------------|\n| FIREBLOCKS_SECRET        | RSA private key of your API user                      |\n| FIREBLOCKS_API_KEY       | uuid of api user                                      |\n| FIREBLOCKS_ENDPOINT      | https://sandbox-api.fireblocks.io                     |\n| FIREBLOCKS_DEVNET        | set to any value if you are on devnet                 |\n| FIREBLOCKS_VAULT         | your vault id                                         |\n| FIREBLOCKS_POLL_TIMEOUT  | in seconds, total time to check status of transaction |\n| FIREBLOCKS_POLL_INTERVAL | in seconds                                            |\n\n## Development\n\n### Prerequisites\n\n- **Rust Nightly**: Required for code formatting with advanced features\n  ```bash\n  rustup install nightly\n  ```\n\n- **Environment Setup**: Create a `.env` file with your Fireblocks credentials\n  ```bash\n  cp env-sample .env\n  # Edit .env with your actual Fireblocks API credentials\n  ```\n\n### Getting Started\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/CarteraMesh/fireblocks-solana-signer.git\n   cd fireblocks-solana-signer\n   ```\n\n2. **Set up environment**\n   ```bash\n   # Copy and configure environment variables\n   cp env-sample .env\n   \n   # Install Rust nightly for formatting\n   rustup install nightly\n   ```\n\n3. **Build and test**\n   ```bash\n   # Build the project\n   cargo build\n   \n   # Run tests (requires valid Fireblocks credentials in .env)\n   cargo test\n   \n   # Format code (requires nightly)\n   cargo +nightly fmt --all\n   ```\n\n### Code Formatting\n\nThis project uses advanced Rust formatting features that require nightly:\n\n```bash\n# Format all code\ncargo +nightly fmt --all\n\n# Check formatting\ncargo +nightly fmt --all -- --check\n```\n\n### Running Examples\n\n```bash\n# Make sure your .env file is configured first\ncargo run --example memo\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarteramesh%2Ffireblocks-solana-signer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarteramesh%2Ffireblocks-solana-signer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarteramesh%2Ffireblocks-solana-signer/lists"}