{"id":22017318,"url":"https://github.com/prophet-solutions/jito-sdk","last_synced_at":"2025-10-11T05:31:09.861Z","repository":{"id":265333602,"uuid":"894396524","full_name":"Prophet-Solutions/jito-sdk","owner":"Prophet-Solutions","description":"🏃‍♂️ (Unofficial) Jito Go SDK with protobufs auto-update \u0026 API support","archived":false,"fork":false,"pushed_at":"2025-01-26T15:00:59.000Z","size":71,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-04T09:36:12.212Z","etag":null,"topics":["docker","golang","grpc","jito","solana"],"latest_commit_sha":null,"homepage":"https://www.jito.wtf","language":"Go","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/Prophet-Solutions.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}},"created_at":"2024-11-26T09:34:15.000Z","updated_at":"2025-03-31T01:57:16.000Z","dependencies_parsed_at":"2024-11-29T00:36:48.014Z","dependency_job_id":null,"html_url":"https://github.com/Prophet-Solutions/jito-sdk","commit_stats":null,"previous_names":["prophet-solutions/jito-sdk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Prophet-Solutions/jito-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Prophet-Solutions%2Fjito-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Prophet-Solutions%2Fjito-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Prophet-Solutions%2Fjito-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Prophet-Solutions%2Fjito-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Prophet-Solutions","download_url":"https://codeload.github.com/Prophet-Solutions/jito-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Prophet-Solutions%2Fjito-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279006320,"owners_count":26084085,"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","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["docker","golang","grpc","jito","solana"],"created_at":"2024-11-30T05:05:54.839Z","updated_at":"2025-10-11T05:31:09.550Z","avatar_url":"https://github.com/Prophet-Solutions.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jito Go SDK\n\n![Jito](https://jito-labs.gitbook.io/~gitbook/image?url=https%3A%2F%2F3427002662-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FHrQ5xfEkhvrbX39awm20%252Fuploads%252FDqQ3x4u1Pe1QPqQ0g9UD%252Fjlabscover.png%3Falt%3Dmedia%26token%3D218ee3d8-f5b2-4692-9146-cbcf1e8af359\u0026width=1248\u0026dpr=2\u0026quality=100\u0026sign=8ccedc4a\u0026sv=1)\n\n[![Go](https://img.shields.io/badge/Go-1.22.5-blue.svg)](https://golang.org/)\n[![Go Report Card](https://goreportcard.com/badge/github.com/Prophet-Solutions/jito-sdk)](https://goreportcard.com/report/github.com/Prophet-Solutions/jito-sdk)\n[![gRPC](https://img.shields.io/badge/gRPC-1.65.0-blue.svg)](https://grpc.io/)\n[![Solana](https://img.shields.io/badge/Solana-Blockchain-green.svg)](https://github.com/gagliardetto/solana-go)\n\n## Overview\n\nThe `jito-sdk` package, provides a comprehensive interface for interacting with the Jito Block Engine. This package facilitates the operations of validators, relayers, and searchers, providing essential functionalities to work with transactions, bundles, and packet streams on the Solana blockchain.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Relayer](#relayer)\n  - [Validator](#validator)\n  - [Searcher Client](#searcher-client)\n  - [Conversion Functions](#conversion-functions)\n  - [Signature Handling](#signature-handling)\n  - [Utility Functions](#utility-functions)\n  - [Example: Creating and Sending a Bundle](#example-creating-and-sending-a-bundle)\n- [Resources](#resources)\n- [To-Do](#to-do)\n- [Dependencies](#dependencies)\n\n## Installation\n\nTo install the package, run:\n\n```bash\ngo get github.com/Prophet-Solutions/jito-sdk\n```\n\n# Guide to Updating PB Files from Proto Files\n\nThis guide outlines the steps to update `.pb` files generated from `.proto` files stored in various repository submodules. Follow these instructions to ensure a smooth update process.\n\n## Update Process\n\n### Generate PB Files\n\nRun the following `.sh` scripts to generate the `.pb` files from the `.proto` files:\n\n```bash\ndocker build -t jito-sdk-protoc .\ndocker run --rm -v $(pwd)/pb:/app/pb jito-sdk-protoc\n```\n\n### Commit and Push Changes\n\n1. Stage the changes:\n    ```bash\n    git add .\n    ```\n2. Commit the changes with a message, including the new version number:\n    ```bash\n    git commit -m \"Updated PB files to match proto version \u003cversionNumber\u003e\"\n    ```\n3. Push the changes to the repository:\n    ```bash\n    git push\n    ```\n\n### Open a Pull Request\n\n1. Open a new pull request (PR) to merge the changes into the main branch if the latest version isn't already pushed.\n\n### Publish a New Release\n\nCreate a new release to use the latest version in `jito-sdk`.\n\n## Usage\n\n### Relayer\n\nProvides functionalities for subscribing to accounts of interest, programs of interest, and expiring packet streams.\n\n```go\nrelayer, err := pkg.NewRelayer(ctx, \"grpc-address\", keyPair)\nif err != nil {\n    // handle error\n}\n\n// Subscribe to accounts of interest\naccounts, errs, err := relayer.OnSubscribeAccountsOfInterest(ctx)\nif err != nil {\n    // handle error\n}\n```\n\n### Validator\n\nProvides functionalities for subscribing to packet and bundle updates and retrieving block builder fee information.\n\n```go\nvalidator, err := pkg.NewValidator(ctx, \"grpc-address\", keyPair)\nif err != nil {\n    // handle error\n}\n\n// Subscribe to packet updates\npackets, errs, err := validator.OnPacketSubscription(ctx)\nif err != nil {\n    // handle error\n}\n```\n\n### Searcher Client\n\nProvides functionalities for sending bundles with confirmation, retrieving regions and connected leaders, and obtaining random tip accounts.\n\n```go\nsearcher, err := pkg.NewSearcherClient(ctx, \"grpc-address\", jitoRPCClient, rpcClient, keyPair)\nif err != nil {\n    // handle error\n}\n\n// Get connected leaders\nleaders, err := searcher.GetConnectedLeaders()\nif err != nil {\n    // handle error\n}\n```\n\n### Conversion Functions\n\nHelper functions for converting Solana transactions to protobuf packets and vice versa.\n\n```go\npacket, err := pkg.ConvertTransactionToProtobufPacket(transaction)\nif err != nil {\n    // handle error\n}\n\ntransactions, err := pkg.ConvertBatchProtobufPacketToTransaction(packets)\nif err != nil {\n    // handle error\n}\n```\n\n### Signature Handling\n\nHelper functions for extracting and validating transaction signatures.\n\n```go\nsignature := pkg.ExtractSigFromTx(transaction)\nsignatures := pkg.BatchExtractSigFromTx(transactions)\n\nif !pkg.CheckSignatureStatuses(statuses) {\n    // handle invalid statuses\n}\n\nif err := pkg.ValidateSignatureStatuses(statuses); err != nil {\n    // handle error\n}\n```\n\n### Utility Functions\n\nAdditional utility functions for working with lamports and endpoints.\n\n```go\nsol := pkg.LamportsToSol(big.NewFloat(1000000))\n\nendpoint := pkg.GetEndpoint(\"AMS\")\n```\n\n### Example: Creating and Sending a Bundle\n\nBelow is an example demonstrating how to create and send a bundle using the `jito-go` package.\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"flag\"\n    \"fmt\"\n    \"log\"\n    \"math/rand\"\n    \"time\"\n\n    block_engine \"github.com/Prophet-Solutions/jito-sdk/block-engine\"\n    \"github.com/Prophet-Solutions/jito-sdk/pkg\"\n    block_engine_pkg \"github.com/Prophet-Solutions/jito-sdk/pkg/block-engine\"\n    \"github.com/gagliardetto/solana-go\"\n    \"github.com/gagliardetto/solana-go/programs/system\"\n    \"github.com/gagliardetto/solana-go/rpc\"\n)\n\nvar (\n    NumTxs      = flag.Int(\"numTxs\", 3, \"Total transactions amount to send in the bundle\")\n    RpcAddress  = flag.String(\"rpcAddress\", \"https://api.mainnet-beta.solana.com/\", \"RPC Address that will be used for GetRecentBlockhash and GetBalance methods\")\n    TxLamports  = flag.Uint64(\"txLamports\", 20000, \"Total amount in Lamports to send in one single transaction\")\n    TipLamports = flag.Uint64(\"tipLamports\", 10000, \"Total amount in Lamports to send to Jito as tip\")\n)\n\nvar (\n    SenderPrivateKey  = solana.MustPrivateKeyFromBase58(\"your-private-key\")\n    ReceiverPublicKey = solana.MustPublicKeyFromBase58(\"your-receiver-public-key\")\n)\n\nfunc main() {\n    flag.Parse()\n    bundleResult, err := SubmitBundle()\n    if err != nil {\n        log.Fatalf(\"Failed to submit bundle: %v\", err)\n    }\n    log.Printf(\"Bundle submitted successfully: %s\\n\", bundleResult.BundleResponse.GetUuid())\n    log.Printf(\"Bundle txs: %s\", bundleResult.Signatures)\n}\n\nfunc SubmitBundle() (*block_engine.BundleResponse, error) {\n    ctx := context.Background()\n    searcherClient, err := createSearcherClient(ctx)\n    if err != nil {\n        return nil, err\n    }\n\n    blockHash, err := getRecentBlockhash(ctx, searcherClient)\n    if err != nil {\n        return nil, err\n    }\n\n    tipAccount, err := searcherClient.GetRandomTipAccount()\n    if err != nil {\n        return nil, fmt.Errorf(\"could not get random tip account: %w\", err)\n    }\n\n    txs, err := buildTransactions(blockHash.Value.Blockhash, tipAccount)\n    if err != nil {\n        return nil, err\n    }\n\n    log.Println(\"Sending bundle.\")\n    bundleResult, err := searcherClient.SendBundleWithConfirmation(ctx, txs)\n    if err != nil {\n        return nil, fmt.Errorf(\"could not send bundle: %w\", err)\n    }\n\n    return bundleResult, nil\n}\n\nfunc createSearcherClient(ctx context.Context) (*block_engine.SearcherClient, error) {\n    searcherClient, err := block_engine.NewSearcherClient(\n        ctx,\n        block_engine_pkg.GetEndpoint(\"FRA\"),\n        nil,\n        rpc.New(*RpcAddress),\n        \u0026SenderPrivateKey,\n    )\n    if err != nil {\n        return nil, fmt.Errorf(\"could not create searcher client: %w\", err)\n    }\n    return searcherClient, nil\n}\n\nfunc getRecentBlockhash(ctx context.Context, client *block_engine.SearcherClient) (*rpc.GetRecentBlockhashResult, error) {\n    blockHash, err := client.RPCConn.GetRecentBlockhash(ctx, rpc.CommitmentFinalized)\n    if err != nil {\n        return nil, fmt.Errorf(\"could not get recent blockhash: %w\", err)\n    }\n    return blockHash, nil\n}\n\nfunc buildTransactions(blockhash solana.Hash, tipAccount string) ([]*solana.Transaction, error) {\n    var txs []*solana.Transaction\n\n    for i := 0; i \u003c *NumTxs; i++ {\n        tx, err := createTransaction(blockhash, ReceiverPublicKey, *TxLamports)\n        if err != nil {\n            return nil, err\n        }\n        txs = append(txs, tx)\n    }\n\n    tipTx, err := createTransaction(blockhash, solana.MustPublicKeyFromBase58(tipAccount), *TipLamports)\n    if err != nil {\n        return nil, err\n    }\n    txs = append(txs, tipTx)\n\n    return txs, nil\n}\n\nfunc createTransaction(blockhash solana.Hash, recipient solana.PublicKey, lamports uint64) (*solana.Transaction, error) {\n    rand.Seed(time.Now().UnixNano())\n    tx, err := solana.NewTransaction(\n        []solana.Instruction{\n            system.NewTransferInstruction(\n                lam\n\nports,\n                SenderPrivateKey.PublicKey(),\n                recipient,\n            ).Build(),\n            solana.NewInstruction(\n                pkg.MemoPublicKey,\n                solana.AccountMetaSlice{\n                    \u0026solana.AccountMeta{\n                        PublicKey:  SenderPrivateKey.PublicKey(),\n                        IsWritable: true,\n                        IsSigner:   true,\n                    },\n                },\n                []byte(fmt.Sprintf(\"jito bundle %d\", rand.Intn(1000000)+1)),\n            ),\n        },\n        blockhash,\n        solana.TransactionPayer(SenderPrivateKey.PublicKey()),\n    )\n    if err != nil {\n        return nil, fmt.Errorf(\"could not build transaction: %w\", err)\n    }\n\n    _, err = tx.Sign(func(pubKey solana.PublicKey) *solana.PrivateKey {\n        if pubKey.Equals(SenderPrivateKey.PublicKey()) {\n            return \u0026SenderPrivateKey\n        }\n        return nil\n    })\n    if err != nil {\n        return nil, fmt.Errorf(\"failed to sign transaction: %w\", err)\n    }\n\n    return tx, nil\n}\n```\n\n## Disclaimer\n\nThis library is not affiliated with Jito Labs.\nThis library is not supported by Jito Labs but by the community and repo owners.\n\n## Resources\n\n- [Jito Gitbook](https://jito-labs.gitbook.io)\n- [Credits for help](https://github.com/weeaa/jito-go)\n- [Jito Discord](https://discord.com/invite/jito)\n- [Solana library used](https://github.com/gagliardetto/solana-go)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprophet-solutions%2Fjito-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprophet-solutions%2Fjito-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprophet-solutions%2Fjito-sdk/lists"}