{"id":18542720,"url":"https://github.com/coinbase/staking-client-library-go","last_synced_at":"2025-10-26T18:41:07.998Z","repository":{"id":203369767,"uuid":"666625455","full_name":"coinbase/staking-client-library-go","owner":"coinbase","description":"Programmatic access to Coinbase's best-in-class staking infrastructure and services. 🔵","archived":false,"fork":false,"pushed_at":"2025-04-01T15:22:59.000Z","size":537,"stargazers_count":22,"open_issues_count":4,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-09T20:07:36.636Z","etag":null,"topics":["rewards","staking"],"latest_commit_sha":null,"homepage":"https://github.com/coinbase/staking-client-library-go","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/coinbase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2023-07-15T03:24:47.000Z","updated_at":"2025-04-01T15:23:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"c8e931f6-39a0-41bb-ba3f-b761f4ae9929","html_url":"https://github.com/coinbase/staking-client-library-go","commit_stats":null,"previous_names":["coinbase/staking-client-library-go"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/coinbase/staking-client-library-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coinbase%2Fstaking-client-library-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coinbase%2Fstaking-client-library-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coinbase%2Fstaking-client-library-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coinbase%2Fstaking-client-library-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coinbase","download_url":"https://codeload.github.com/coinbase/staking-client-library-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coinbase%2Fstaking-client-library-go/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260124096,"owners_count":22962206,"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":["rewards","staking"],"created_at":"2024-11-06T20:09:54.700Z","updated_at":"2025-10-26T18:41:07.904Z","avatar_url":"https://github.com/coinbase.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src='docs/images/banner.svg' width='1100' alt='Coinbase Staking API'\u003e\n\n# [Coinbase Staking API](https://github.com/coinbase/staking-client-library-go)\n\n\u003e Programmatic access to Coinbase's best-in-class staking infrastructure and services. :large_blue_circle:\n\n[![Current version](https://img.shields.io/github/tag/coinbase/staking-client-library-go?color=3498DB\u0026label=version)](https://github.com/coinbase/staking-client-library-go/releases) [![GitHub contributors](https://img.shields.io/github/contributors/coinbase/staking-client-library-go?color=3498DB)](https://github.com/coinbase/staking-client-library-go/graphs/contributors) [![GitHub Stars](https://img.shields.io/github/stars/coinbase/staking-client-library-go.svg?color=3498DB)](https://github.com/coinbase/staking-client-library-go/stargazers) [![GitHub](https://img.shields.io/github/license/coinbase/staking-client-library-go?color=3498DB)](https://github.com/coinbase/staking-client-library-go/blob/main/LICENSE)\n\n## Overview\n\n`staking-client-library-go` is the Go SDK for the **Coinbase Staking API** :large_blue_circle:.\n\nThe Coinbase Staking API empowers developers to deliver a fully-featured staking experience in their Web2 apps, wallets, or dApps using *one common interface* across protocols.\n\nA traditional infrastructure-heavy staking integration can take months. Coinbase's Staking API enables onboarding within hours :sparkles:.\n\n## Quick Start\n\nPrerequisite: [Go 1.21+](https://go.dev/doc/install)\n\n1. In a fresh directory, copy and paste one of the code samples below or any of our [provided examples](./examples) into an `example.go` file.\n\n2. Create a new API Key in the [portal](https://portal.cdp.coinbase.com/access/api) and paste the `apiKeyName` and `apiPrivateKey` into the `example.go` file.\n\n3. Setup a Go project and run the example :rocket:\n\n   ```shell\n   go mod init example\n   go mod tidy\n   go run example.go\n   ```\n\n### Stake Partial ETH :diamond_shape_with_a_dot_inside:\n\nThis code sample helps stake ETH via partial staking. View the full source [here](examples/ethereum/create-workflow/main.go)\n\n\u003cdetails open\u003e\n\n```golang\n// examples/ethereum/create-workflow/main.go\npackage main\n\nimport (\n   \"context\"\n   \"fmt\"\n   \"log\"\n\n   \"google.golang.org/protobuf/encoding/protojson\"\n\n   \"github.com/coinbase/staking-client-library-go/auth\"\n   \"github.com/coinbase/staking-client-library-go/client\"\n   \"github.com/coinbase/staking-client-library-go/client/options\"\n   api \"github.com/coinbase/staking-client-library-go/gen/go/coinbase/staking/orchestration/v1\"\n)\n\nvar (\n   apiKeyName    = \"your-api-key-name\"\n   apiPrivateKey = \"your-api-private-key\"\n)\n\nfunc main() {\n   ctx := context.Background()\n\n   // Loads the API key.\n   apiKey, err := auth.NewAPIKey(auth.WithAPIKeyName(apiKeyName, apiPrivateKey))\n   if err != nil {\n      log.Fatalf(\"error loading API key: %s\", err.Error())\n   }\n\n   // Creates the Coinbase Staking API client.\n   stakingClient, err := client.New(ctx, options.WithAPIKey(apiKey))\n   if err != nil {\n      log.Fatalf(\"error instantiating staking client: %s\", err.Error())\n   }\n\n   req := \u0026api.CreateWorkflowRequest{\n      Workflow: \u0026api.Workflow{\n         Action: \"protocols/ethereum_kiln/networks/holesky/actions/stake\",\n         StakingParameters: \u0026api.Workflow_EthereumKilnStakingParameters{\n            EthereumKilnStakingParameters: \u0026api.EthereumKilnStakingParameters{\n               Parameters: \u0026api.EthereumKilnStakingParameters_StakeParameters{\n                  StakeParameters: \u0026api.EthereumKilnStakeParameters{\n                     StakerAddress: \"0xdb816889F2a7362EF242E5a717dfD5B38Ae849FE\",\n                     Amount: \u0026api.Amount{\n                        Value:    \"20\",\n                        Currency: \"ETH\",\n                     },\n                  },\n               },\n            },\n         },\n      },\n   }\n\n   workflow, err := stakingClient.Orchestration.CreateWorkflow(ctx, req)\n   if err != nil {\n      log.Fatalf(\"couldn't create workflow: %s\", err.Error())\n   }\n\n   marshaled, err := protojson.MarshalOptions{Indent: \"  \", Multiline: true}.Marshal(workflow)\n   if err != nil {\n      log.Fatalf(\"error marshaling reward: %s\", err.Error())\n   }\n\n   fmt.Println(string(marshaled))\n}\n```\n\n\u003c/details\u003e\n\n   \u003cdetails\u003e\n     \u003csummary\u003eOutput\u003c/summary\u003e\n\n   ```text\n   {\n     \"name\":  \"workflows/357673b5-c3b7-4149-a887-a6119d32fbdd\",\n     \"action\":  \"protocols/ethereum_kiln/networks/holesky/actions/stake\",\n     \"ethereumKilnStakingParameters\":  {\n       \"stakeParameters\":  {\n         \"stakerAddress\":  \"0xdb816889F2a7362EF242E5a717dfD5B38Ae849FE\",\n         \"integratorContractAddress\":  \"0xA55416de5DE61A0AC1aa8970a280E04388B1dE4b\",\n         \"amount\":  {\n           \"value\":  \"20\",\n           \"currency\":  \"ETH\"\n         }\n       }\n     },\n     \"state\":  \"STATE_WAITING_FOR_EXT_BROADCAST\",\n     \"steps\":  [\n       {\n         \"name\":  \"stake tx\",\n         \"txStepOutput\":  {\n           \"unsignedTx\":  \"02f3824268068502540be4008503743b80ba83061a8094a55416de5de61a0ac1aa8970a280e04388b1de4b14843a4b66f1c0808080\",\n           \"state\":  \"STATE_PENDING_EXT_BROADCAST\"\n         }\n       }\n     ],\n     \"createTime\":  \"2024-05-08T17:30:56.633391257Z\",\n     \"updateTime\":  \"2024-05-08T17:30:56.633391257Z\"\n   }\n   ```\n\n   \u003c/details\u003e\n\n### Stake SOL :diamond_shape_with_a_dot_inside:\n\nThis code sample helps stake SOL from a given user wallet. View the full source [here](examples/solana/create-workflow/main.go)\n\n\u003cdetails open\u003e\n\n```golang\n// examples/solana/create-workflow/main.go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    \"google.golang.org/protobuf/encoding/protojson\"\n\n    \"github.com/coinbase/staking-client-library-go/auth\"\n    \"github.com/coinbase/staking-client-library-go/client\"\n    \"github.com/coinbase/staking-client-library-go/client/options\"\n    api \"github.com/coinbase/staking-client-library-go/gen/go/coinbase/staking/orchestration/v1\"\n)\n\nvar (\n   apiKeyName    = \"your-api-key-name\"\n   apiPrivateKey = \"your-api-private-key\"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    // Loads the API key.\n    apiKey, err := auth.NewAPIKey(auth.WithAPIKeyName(apiKeyName, apiPrivateKey))\n    if err != nil {\n       log.Fatalf(\"error loading API key: %s\", err.Error())\n    }\n\n    // Creates the Coinbase Staking API client.\n    stakingClient, err := client.New(ctx, options.WithAPIKey(apiKey))\n    if err != nil {\n        log.Fatalf(\"error instantiating staking client: %s\", err.Error())\n    }\n\n    req := \u0026api.CreateWorkflowRequest{\n        Workflow: \u0026api.Workflow{\n            Action: \"protocols/solana/networks/devnet/actions/stake\",\n            StakingParameters: \u0026api.Workflow_SolanaStakingParameters{\n                SolanaStakingParameters: \u0026api.SolanaStakingParameters{\n                    Parameters: \u0026api.SolanaStakingParameters_StakeParameters{\n                        StakeParameters: \u0026api.SolanaStakeParameters{\n                            WalletAddress: \"8rMGARtkJY5QygP1mgvBFLsE9JrvXByARJiyNfcSE5Z\",\n                            Amount: \u0026api.Amount{\n                                Value:    \"100000000\",\n                                Currency: \"SOL\",\n                            },\n                        },\n                    },\n                },\n            },\n        },\n    }\n\n    workflow, err := stakingClient.Orchestration.CreateWorkflow(ctx, req)\n    if err != nil {\n       log.Fatalf(\"couldn't create workflow: %s\", err.Error())\n    }\n\n    marshaled, err := protojson.MarshalOptions{Indent: \"  \", Multiline: true}.Marshal(workflow)\n    if err != nil {\n       log.Fatalf(\"error marshaling reward: %s\", err.Error())\n    }\n\n    fmt.Println(string(marshaled))\n}\n```\n\n\u003c/details\u003e\n\n   \u003cdetails\u003e\n     \u003csummary\u003eOutput\u003c/summary\u003e\n\n   ```text\n   {\n     \"name\":  \"workflows/f68fc083-18bd-48a0-a10a-7c673e9ec5b7\",\n     \"action\":  \"protocols/solana/networks/devnet/actions/stake\",\n     \"solanaStakingParameters\":  {\n       \"stakeParameters\":  {\n         \"walletAddress\":  \"8rMGARtkJY5QygP1mgvBFLsE9JrvXByARJiyNfcSE5Z\",\n         \"validatorAddress\":  \"GkqYQysEGmuL6V2AJoNnWZUz2ZBGWhzQXsJiXm2CLKAN\",\n         \"amount\":  {\n           \"value\":  \"100000000\",\n           \"currency\":  \"SOL\"\n         },\n         \"priorityFee\":  {}\n       }\n     },\n     \"state\":  \"STATE_WAITING_FOR_EXT_BROADCAST\",\n     \"steps\":  [\n       {\n         \"name\":  \"stake tx\",\n         \"txStepOutput\":  {\n           \"unsignedTx\":  \"66hEYYWnwGWkGpMKF2H2sCzxnmoAfY8LPnYMgWdY6rC7hX2H6DEE2YdPxECFx8FeeNmea8N87L4KuZ6dirYXZi9XNr5uPJdf8W1jdShcSwzSmmqz4SA7dmFjdTM19hNEu7hMMF7C2RtjZj4qCRvArcnyjj76r5hJrm1o1RozjjZCyvgNqDGHYoeej9MPwoMUEaY6h2iKBh1hnkYFCA1tyXEP8xX3f1jbnae8jzW2Zkc62GDw2gKWusQ3KtRz3wRLdqWT9tbhEk6Hekqbw4sPXSPevsiYHPVX9mQJRdNkoYovBRXv3KQaQ7dv6isgyax7S53yoMRgCvfuhYxk9WhzR4fkAxYB26qeqpdUJrgvSpaw4T3iNBYsG7KZzvGUg4NWG1BaBDuvnG1x7YL3gyJd5QMWQ6jq6yuGgupjNn7zP7EcxtbvpP2EVfrFnzmX4LEgQh4MxshMFpNas2tQXQd12Vv9vq4nZt2BEr2Jh67Q9vnKF22td1XaAL1MvsTmvWWSKviyZkZQzTXsqUGFtox1f8Unwj75sNCQWYUh4PHmiUjWGmQVhyQKbEqG6PeqDyy9YTopamSD2ajDrhak5fsnczdXo166cjnzQAJZW7tN2T6jHJy2KNmDdL16qPR4HqKKXpWquf1NuTPuJ7ikfmJxWBp7gHrMF3z5P84hp4xT4V2D4eHGLMTWDhs4cQghVXRvynPUeUDSf3TWzHfYwVEDFNpFNhX62FP7aJBVp28R8nHTt7riymgkw9LdjhPMxQPoRW3hCG4UcQ9kJ7Aywcij9SVcbfaESoEz7anV1j6HFrXiQsgiSbeCj4iiXtYy9aDbVjiuv2v31kvoE6kb1s7osVoeK1mn7AxkPozMxTVhwca9BTMuHTYpFP1QTVAwsYSCXa6KuoXEgLKZn1c63ijQXXGENLjd17JqV3FK8x2Vurkunws8pAb\",\n           \"state\":  \"STATE_PENDING_EXT_BROADCAST\"\n         }\n       }\n     ],\n     \"createTime\":  \"2024-05-08T17:33:40.843044346Z\",\n     \"updateTime\":  \"2024-05-08T17:33:40.843044346Z\"\n   }\n   ```\n\n   \u003c/details\u003e\n\n### View Partial ETH Rewards :moneybag:\n\nThis code sample helps view rewards for an Ethereum wallet address. View the full source [here](examples/ethereum/list-rewards/partial-eth/main.go).\n\n\u003cdetails open\u003e\n\n```golang\n// examples/ethereum/list-rewards/partial-eth/main.go\npackage main\n\nimport (\n    \"context\"\n    \"errors\"\n    \"fmt\"\n    \"log\"\n    \"time\"\n\n    \"google.golang.org/api/iterator\"\n    \"google.golang.org/protobuf/encoding/protojson\"\n\n    \"github.com/coinbase/staking-client-library-go/auth\"\n    \"github.com/coinbase/staking-client-library-go/client\"\n    \"github.com/coinbase/staking-client-library-go/client/options\"\n    \"github.com/coinbase/staking-client-library-go/client/rewards\"\n    filter \"github.com/coinbase/staking-client-library-go/client/rewards/rewardsfilter\"\n    api \"github.com/coinbase/staking-client-library-go/gen/go/coinbase/staking/rewards/v1\"\n)\n\nconst (\n    apiKeyName    = \"your-api-key-name\"\n    apiPrivateKey = \"your-api-private-key\"\n\n    address = \"0x60c7e246344ae3856cf9abe3a2e258d495fc39e0\"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    // Loads the API key.\n    apiKey, err := auth.NewAPIKey(auth.WithAPIKeyName(apiKeyName, apiPrivateKey))\n    if err != nil {\n       log.Fatalf(\"error loading API key: %s\", err.Error())\n    }\n\n    // Creates the Coinbase Staking API client\n    stakingClient, err := client.New(ctx, options.WithAPIKey(apiKey))\n    if err != nil {\n        log.Fatalf(\"error instantiating staking client: %s\", err.Error())\n    }\n\n     // Lists the rewards for the given address for May 1st, 2024 aggregated by day.\n    rewardsIter := stakingClient.Rewards.ListRewards(ctx, \u0026api.ListRewardsRequest{\n        Parent:   rewards.Ethereum,\n        PageSize: 200,\n        Filter: filter.WithAddress().Eq(address).\n            And(filter.WithPeriodEndTime().Gte(time.Date(2024, 5, 1, 0, 0, 0, 0, time.Local))).\n            And(filter.WithPeriodEndTime().Lt(time.Date(2024, 5, 2, 0, 0, 0, 0, time.Local))).String(),\n    })\n\n    // Iterates through the rewards and pretty print them.\n    for {\n        reward, err := rewardsIter.Next()\n        if errors.Is(err, iterator.Done) {\n            break\n        }\n\n        if err != nil {\n            log.Fatalf(\"error listing rewards: %s\", err.Error())\n        }\n\n        marshaled, err := protojson.MarshalOptions{Indent: \"  \", Multiline: true}.Marshal(reward)\n        if err != nil {\n            log.Fatalf(\"error marshaling reward: %s\", err.Error())\n        }\n\n        fmt.Println(string(marshaled))\n    }\n}\n```\n\n\u003c/details\u003e\n\n   \u003cdetails\u003e\n     \u003csummary\u003eOutput\u003c/summary\u003e\n\n   ```json\n  \n  {\n    \"address\": \"0x60c7e246344ae3856cf9abe3a2e258d495fc39e0\",\n    \"date\": \"2024-05-01\",\n    \"aggregationUnit\": \"DAY\",\n    \"periodStartTime\": \"2024-05-01T00:00:00Z\",\n    \"periodEndTime\": \"2024-05-01T23:59:59Z\",\n    \"totalEarnedNativeUnit\": {\n      \"amount\": \"0.001212525541415161\",\n      \"exp\": \"18\",\n      \"ticker\": \"ETH\",\n      \"rawNumeric\": \"1212525541415161\"\n    },\n    \"totalEarnedUsd\": [\n      {\n        \"source\": \"COINBASE_EXCHANGE\",\n        \"conversionTime\": \"2024-05-02T00:09:00Z\",\n        \"amount\": {\n          \"amount\": \"3.61\",\n          \"exp\": \"2\",\n          \"ticker\": \"USD\",\n          \"rawNumeric\": \"361\"\n        },\n        \"conversionPrice\": \"2971.419922\"\n      }\n    ],\n    \"endingBalance\": null,\n    \"protocol\": \"ethereum\",\n    \"rewardState\": \"PENDING_CLAIMABLE\"\n  }\n   ```\n\n   \u003c/details\u003e\n\n## Documentation\n\nThere are numerous examples in the [`examples directory`](./examples) to help get you started. For even more, refer to our [documentation website](https://docs.cdp.coinbase.com/staking/docs/welcome) for detailed definitions, [API specification](https://docs.cdp.coinbase.com/staking/reference), integration guides, and more!\n\n## Contributing\n\nThanks for considering contributing to the project! Please refer to [our contribution guide](./CONTRIBUTING.md).\n\n## Contact Us\n\nIf you have any questions, please reach out to us in the #staking channel on our [Discord](https://discord.com/invite/cdp) server.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoinbase%2Fstaking-client-library-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoinbase%2Fstaking-client-library-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoinbase%2Fstaking-client-library-go/lists"}