Client
The Sunrise client libraries let you query the chain, submit blobs and sign / broadcast transactions from your application without having to run custom protobuf tooling or hand‑craft Tendermint JSON‑RPC calls.
Available SDKs
Section titled “Available SDKs”- JavaScript / TypeScript - Primary SDK available on npm
- Rust - gRPC + protobuf type generation with Buf/Prost
- Go and Python bindings - Coming soon (contributions welcome)
JavaScript / TypeScript SDK
Section titled “JavaScript / TypeScript SDK”Installation
Section titled “Installation”npm install @sunriselayer/client @cosmjs/proto-signing @cosmjs/stargate# orpnpm add @sunriselayer/client @cosmjs/proto-signing @cosmjs/stargate# oryarn add @sunriselayer/client @cosmjs/proto-signing @cosmjs/stargateBasic Usage
Section titled “Basic Usage”The client is designed to be used with CosmJS, the standard library for interacting with Cosmos SDK chains.
Here’s an example of how to create a concentrated liquidity position:
import { createEncodeObject, sunriseTypesRegistry,} from "@sunriselayer/client";// The schemas and types for all modules are exported from the client.// Here, we import the schema for the `MsgCreatePosition` message.import { MsgCreatePositionSchema } from "@sunriselayer/client/types/liquiditypool";import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";import { SigningStargateClient, coin } from "@cosmjs/stargate";
const RPC = "https://goldberg-rpc.sunrise.node"; // Replace with your nodeconst SENDER_MNEMONIC = process.env.MNEMONIC!; // Never commit private keys
// This is a simplified example. In a real application, you would fetch pool details// from a query client and calculate ticks from user-provided prices.const MOCK_POOL_ID = 1n; // NOTE: Use BigInt for uint64 fieldsconst MOCK_LOWER_TICK = -20000n;const MOCK_UPPER_TICK = 20000n;
async function main() { // 1. Create a wallet and a signer from a mnemonic const signer = await DirectSecp256k1HdWallet.fromMnemonic(SENDER_MNEMONIC, { prefix: "sunrise", // The Bech32 address prefix for Sunrise }); const [account] = await signer.getAccounts(); const senderAddress = account.address; console.log("Sender address:", senderAddress);
// 2. Create a signing client with the signer and type registry const client = await SigningStargateClient.connectWithSigner(RPC, signer, { registry: sunriseTypesRegistry, // The custom type registry for Sunrise messages }); console.log("Successfully connected to", RPC);
// 3. Prepare a 'Create Position' transaction message // All message fields are fully typed and validated. const msg = createEncodeObject(MsgCreatePositionSchema, { sender: senderAddress, poolId: MOCK_POOL_ID, lowerTick: MOCK_LOWER_TICK, upperTick: MOCK_UPPER_TICK, // Use the `coin` helper from @cosmjs/stargate to create Coin objects tokenBase: coin("1000000", "urise"), // 1 RISE tokenQuote: coin("5000000", "uusdc"), // 5 USDC (example) minAmountBase: "0", // Slippage protection minAmountQuote: "0", // Slippage protection });
// 4. Define the fee and sign and broadcast the transaction const fee = { amount: [coin("10000", "uusdrise")], gas: "400000", // Gas limit }; const memo = "Created position via @sunriselayer/client";
console.log("Broadcasting transaction..."); const { transactionHash } = await client.signAndBroadcast( senderAddress, [msg], fee, memo );
console.log("Successfully created position!"); console.log("Transaction hash:", transactionHash);}
main().catch(console.error);All methods are fully typed when using TypeScript.
Rust SDK (Coming Soon)
Section titled “Rust SDK (Coming Soon)”The Rust SDK is currently implemented through protobuf generation. Here’s how to set it up:
Project Structure
Section titled “Project Structure”my-sunrise-client/├── src/│ └── main.rs├── buf.yaml└── buf.gen.yamlConfiguration Files
Section titled “Configuration Files”buf.yaml:
version: v2deps: - buf.build/cosmos/cosmos-sdk - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto - buf.build/protocolbuffers/wellknowntypesbuf.gen.yaml:
version: v2managed: enabled: true
plugins: - remote: buf.build/community/neoeinstein-prost:v0.4.0 out: src opt: - compile_well_known_types - extern_path=.google.protobuf=::pbjson_types - remote: buf.build/community/neoeinstein-prost-serde:v0.3.1 out: src - remote: buf.build/community/neoeinstein-tonic:v0.4.1 out: src opt: - compile_well_known_types - extern_path=.google.protobuf=::pbjson_types
inputs: - git_repo: https://github.com/sunriselayer/sunrise.git branch: main subdir: protoSetup and Generation
Section titled “Setup and Generation”# Add required dependenciescargo add tonic tonic-build pbjson-types
# Update dependencies and generate codebuf dep updatebuf generateExample Usage
Section titled “Example Usage”use tonic::transport::Channel;use sunriselayer::sunrise::da::v1::query_client::QueryClient;use sunriselayer::sunrise::da::v1::ParamsRequest;
#[tokio::main]async fn main() -> anyhow::Result<()> { let mut client = QueryClient::connect("http://localhost:9090").await?; let resp = client.params(ParamsRequest {}).await?; println!("DA params: {:?}", resp.into_inner()); Ok(())}Additional Resources
Section titled “Additional Resources”Troubleshooting
Section titled “Troubleshooting”| Problem | Solution |
|---|---|
| Connection refused | Verify RPC URL and ensure DA node is running |
| Authentication error | Ensure account has sufficient funds |
| Rust build failure | Update to Rust 1.74+ and run cargo clean && buf generate |