Brane SDK Research
Purpose
When implementing Brane features, reference how mature EVM SDKs solve the same problems:
- viem (TypeScript) - Modern, type-safe, excellent documentation
- alloy (Rust) - Performance-focused, similar design philosophy to Brane
These SDKs have solved many of the same problems. Learn from their API design, naming conventions, and implementation patterns.
Reference Sources
viem (TypeScript)
- Documentation: https://viem.sh
- GitHub: https://github.com/wevm/viem
- Key strengths: Excellent docs, modern API, comprehensive examples
alloy (Rust)
- Documentation: https://alloy.rs
- GitHub: https://github.com/alloy-rs/alloy
- Key strengths: Type safety, performance, similar goals to Brane
When to Research
Use this skill when:
- Designing new APIs - How do viem/alloy name this? What parameters do they use?
- Implementing features - What edge cases did they handle?
- Solving problems - Has this been solved before? How?
- Naming things - What's the conventional name for this concept?
Research Workflow
Step 1: Identify the Feature Area
Map your Brane feature to the equivalent concept:
| Brane Area | viem Equivalent | alloy Equivalent |
|---|---|---|
Brane.Reader |
publicClient / PublicActions |
Provider |
Brane.Signer |
walletClient / WalletActions |
Signer + Provider |
BraneContract.bind() |
getContract() |
ContractInstance |
TransactionRequest |
TransactionRequest |
TransactionRequest |
Address, Hash, HexData |
Branded types | Address, B256, Bytes |
| ABI encoding | encodeFunctionData |
SolCall::abi_encode |
| ABI decoding | decodeFunctionResult |
SolCall::abi_decode |
| Gas estimation | estimateGas |
estimate_gas |
| Transaction receipt | waitForTransactionReceipt |
get_transaction_receipt |
Step 2: Fetch Documentation
Use WebFetch to read the relevant documentation:
# viem examples
https://viem.sh/docs/actions/public/getBalance
https://viem.sh/docs/contract/readContract
https://viem.sh/docs/actions/wallet/sendTransaction
# alloy examples
https://alloy.rs/examples/providers/builder.html
https://alloy.rs/examples/contracts/deploy.html
Step 3: Compare and Adapt
When adapting patterns to Java/Brane:
| viem/alloy Pattern | Brane Adaptation |
|---|---|
| Async/await | Blocking calls (Java's virtual threads handle concurrency) |
| Generic type parameters | Java generics or method overloads |
| Builder pattern | Same (Java builders work well) |
| Result/Option types | Exceptions + Optional |
| Branded types | Record types with validation |
Common Research Scenarios
Scenario: Implementing a new RPC method
- Check viem docs for the action:
https://viem.sh/docs/actions/public/{methodName} - Note the parameters, return type, and edge cases
- Check if alloy has additional insights in their examples
Scenario: Designing a new type
- Look at viem's type definitions in their TypeScript source
- Look at alloy's type definitions (usually in
alloy-primitivesoralloy-rpc-types) - Adapt to Java records with validation
Scenario: Handling errors
- Check viem's error types: https://viem.sh/docs/glossary/errors
- See how they categorize and present errors
- Map to Brane's exception hierarchy
Scenario: Gas estimation strategy
- viem: https://viem.sh/docs/actions/public/estimateGas
- alloy: Check their provider examples
- Note buffer strategies, EIP-1559 handling
API Naming Conventions
Learn from viem/alloy naming patterns:
| Concept | viem | alloy | Brane (adopt) |
|---|---|---|---|
| Read contract | readContract |
call |
call or read |
| Write contract | writeContract |
send_transaction |
sendTransaction |
| Get balance | getBalance |
get_balance |
getBalance |
| Get block | getBlock |
get_block |
getBlock |
| Wait for receipt | waitForTransactionReceipt |
watch_pending_transaction |
sendTransactionAndWait |
Key Documentation Pages
viem - Bookmark These
- Public Actions: https://viem.sh/docs/actions/public/introduction
- Wallet Actions: https://viem.sh/docs/actions/wallet/introduction
- Contract: https://viem.sh/docs/contract/introduction
- ABI: https://viem.sh/docs/abi/introduction
- Utilities: https://viem.sh/docs/utilities/introduction
- Errors: https://viem.sh/docs/glossary/errors
alloy - Bookmark These
- Book/Guide: https://alloy.rs
- Examples: https://alloy.rs/examples/
- API Docs: https://docs.rs/alloy/latest/alloy/
Example Research Session
Task: Implement eth_getLogs with filter support
Research steps:
viem docs: Fetch https://viem.sh/docs/actions/public/getLogs
- Note: filter parameters, block range handling, topics array format
- Note: How they handle "block range too large" errors
alloy examples: Check their filtering examples
- Note: Type definitions for LogFilter
Adapt to Brane:
- Create
LogFilterrecord with builder - Return
List<LogEntry> - Handle block range errors with
RpcException.isBlockRangeTooLarge()
- Create
Things viem/alloy Do Well (Learn From)
- Type safety - Both have strong typing; Brane should too
- Ergonomic APIs - Easy common cases, flexible advanced cases
- Good defaults - Sensible defaults, explicit overrides
- Error messages - Clear, actionable error messages
- Documentation - Examples for every feature
Things to Adapt (Not Copy Directly)
| Pattern | Why Adapt |
|---|---|
| Async everywhere | Java uses blocking + virtual threads |
| Function overloading via types | Java uses method overloading |
| Optional chaining | Java uses Optional or null checks |
| Destructuring | Java uses record accessors |
Converted and distributed by TomeVault — claim your Tome and manage your conversions.