Release Rebase
jito-foundation/geyser-grpc-plugin
A skill your agent uses when updating this repo to match a new jito-solana release line such as v4.0.
Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpc --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/yellowstone-grpc .claude/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .claude/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpcType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpc --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/yellowstone-grpc .agents/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .agents/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpc --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/yellowstone-grpc .cursor/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .cursor/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/agiprolabs/claude-trading-skills.git --path skills/yellowstone-grpc--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpc --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/yellowstone-grpc .gemini/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .gemini/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpcInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/yellowstone-grpc .github/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .github/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install agiprolabs/claude-trading-skills yellowstone-grpc --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agiprolabs/claude-trading-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/yellowstone-grpc .opencode/skills/yellowstone-grpc && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "yellowstone-grpc" agent skill from https://github.com/agiprolabs/claude-trading-skills/tree/main/skills/yellowstone-grpc into .opencode/skills/yellowstone-grpc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "yellowstone-grpc", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
yellowstone-grpcReal-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)
Yellowstone Grpc is an agent skill from agiprolabs/claude-trading-skills. Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `references/performance.md`, `references/proto_reference.md` and `references/providers.md`).
It sits in Backend & APIs, covering gRPC and Protobuf. It works with gRPC and Solana. The repository describes itself as: 68 trading, DeFi, and quantitative finance Agent Skills. Works with Claude Code, Cursor, Codex, Gemini CLI, and 30+ other tools. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 981e1d7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
uvgitpythonnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comgrpc.ny.shyft.toFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GRPC_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Yellowstone Grpc loads about 2.4k tokens when it runs, and up to ~8.8k if it reads all its reference files. Until then it costs about 26 tokens; SKILL.md has 528 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from agiprolabs/claude-trading-skills at commit 981e1d7, republished under its MIT licence (© agiprolabs). 528 words, ~2,356 tokens.
.claude/skills/yellowstone-grpc/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Stream every transaction, account update, slot, and block on Solana in real-time using Yellowstone gRPC. This is the foundation for any latency-sensitive Solana trading system — replacing REST polling with push-based streaming at ~5ms slot latency.
| Method | Slot Latency (p90) | Use Case |
|---|---|---|
REST polling (getTransaction) | ~150ms+ | Historical lookups |
WebSocket (onLogs) | ~10ms | Simple notifications |
| Yellowstone gRPC | ~5ms | Production trading systems |
Yellowstone is a Geyser plugin that exposes Solana validator data over gRPC. Every major RPC provider runs it. You subscribe to filtered streams of transactions, account changes, slots, blocks, and entries — and the data pushes to you.
You need a gRPC-enabled RPC provider. See references/providers.md for full comparison.
| Provider | gRPC Entry Price | Notes |
|---|---|---|
| Shyft | $199/mo | Best value, 7 regions, unlimited bandwidth |
| Helius | $999/mo | LaserStream, DAS APIs included |
| Triton One | ~$2,900/mo | Created Yellowstone, lowest latency |
| QuickNode | Plan-dependent | Marketplace add-on |
| Chainstack | $49/mo (1 stream) | Budget option, limited filters |
| Alchemy | Free tier available | Compute-unit metered |
# Python
uv pip install grpcio grpcio-tools protobuf base58 solders python-dotenv
# Generate Python stubs from proto files
git clone https://github.com/rpcpool/yellowstone-grpc.git
python -m grpc_tools.protoc \
-I./yellowstone-grpc/yellowstone-grpc-proto/proto/ \
--python_out=./generated \
--pyi_out=./generated \
--grpc_python_out=./generated \
./yellowstone-grpc/yellowstone-grpc-proto/proto/*.proto# Rust — Cargo.toml
[dependencies]
yellowstone-grpc-client = "6.0.0"
yellowstone-grpc-proto = "6.0.0"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
futures = "0.3"
bs58 = "0.5"# TypeScript
npm install @triton-one/yellowstone-grpc @solana/web3.jsexport GRPC_ENDPOINT="https://grpc.ny.shyft.to" # your provider endpoint
export GRPC_TOKEN="your-x-token-here" # from provider dashboardimport grpc
import os
from generated import geyser_pb2, geyser_pb2_grpc
endpoint = os.environ["GRPC_ENDPOINT"].replace("https://", "")
token = os.environ["GRPC_TOKEN"]
# Authenticated TLS channel
auth_creds = grpc.metadata_call_credentials(
lambda ctx, cb: cb((("x-token", token),), None)
)
channel = grpc.secure_channel(
endpoint,
grpc.composite_channel_credentials(
grpc.ssl_channel_credentials(), auth_creds
),
options=[("grpc.max_receive_message_length", 64 * 1024 * 1024)],
)
stub = geyser_pb2_grpc.GeyserStub(channel)| Type | What You Get | Use Case |
|---|---|---|
transactions | Full transaction with metadata | DEX swap monitoring, copy trading |
accounts | Account data on change | Pool reserve tracking, token supply |
slots | Slot progression events | Block timing, confirmation tracking |
blocks | Full block contents | Block-level analysis |
blocks_meta | Block metadata only | Lightweight block tracking |
entry | Block entries (shred groups) | Low-level validator data |
transactions_status | Tx status without full data | Lightweight confirmation |
account_include) = ORSubscribeRequest replaces all previous filters| Level | Speed | Safety | Use For |
|---|---|---|---|
PROCESSED | Fastest | May be rolled back | Time-critical signals |
CONFIRMED | ~400ms slower | Supermajority voted | Most trading use cases |
FINALIZED | ~6-12s slower | Irreversible | Settlement verification |
# Filter: all non-vote, non-failed transactions involving PumpFun
request = geyser_pb2.SubscribeRequest(
transactions={
"pumpfun": geyser_pb2.SubscribeRequestFilterTransactions(
account_include=["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
vote=False,
failed=False,
)
},
commitment=geyser_pb2.CommitmentLevel.PROCESSED,
)request = geyser_pb2.SubscribeRequest(
transactions={
"whales": geyser_pb2.SubscribeRequestFilterTransactions(
account_include=[
"WalletAddress1...",
"WalletAddress2...",
],
vote=False,
failed=False,
)
},
commitment=geyser_pb2.CommitmentLevel.CONFIRMED,
)request = geyser_pb2.SubscribeRequest(
accounts={
"raydium_pools": geyser_pb2.SubscribeRequestFilterAccounts(
account=["PoolAddress1...", "PoolAddress2..."],
)
},
commitment=geyser_pb2.CommitmentLevel.PROCESSED,
)# Only get the first 40 bytes of account data (e.g., just the discriminator + key fields)
request = geyser_pb2.SubscribeRequest(
accounts={
"token_accounts": geyser_pb2.SubscribeRequestFilterAccounts(
owner=["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
filters=[
geyser_pb2.SubscribeRequestFilterAccountsFilter(
token_account_state=True
)
],
)
},
accounts_data_slice=[
geyser_pb2.SubscribeRequestAccountsDataSlice(offset=0, length=40)
],
)When you receive a SubscribeUpdateTransaction, extract:
for update in stream:
if update.HasField("transaction"):
tx = update.transaction
info = tx.transaction
sig = base58.b58encode(info.signature).decode()
slot = tx.slot
msg = info.transaction.message
account_keys = [base58.b58encode(k).decode() for k in msg.account_keys]
# Instructions
for ix in msg.instructions:
program = account_keys[ix.program_id_index]
accounts = [account_keys[i] for i in ix.accounts]
data = ix.data # bytes — decode per program IDL
# Token balance changes (post-execution)
meta = info.meta
for tb in meta.post_token_balances:
mint = tb.mint
owner = tb.owner
amount = tb.ui_token_amount.ui_amountSee references/proto_reference.md for complete field documentation.
[gRPC Stream] → [Bounded Channel] → [Processing Workers]
(1K-100K cap) ├─ Parse instructions
├─ Update state / DB
└─ Trigger actionsCritical patterns:
from_slot to resume after disconnection (subtract ~32 slots for reorg safety)vote: false always — vote transactions are ~70% of all trafficmax_receive_message_length to 64MB+ (default 4MB is too small)See references/performance.md for full production checklist.
| Program | Address | What It Does |
|---|---|---|
| PumpFun | 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P | Token launches, bonding curve trades |
| PumpSwap | PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP | PumpFun graduated token swaps |
| Raydium AMM | 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 | Legacy AMM swaps |
| Raydium CLMM | CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK | Concentrated liquidity |
| Raydium CPMM | CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C | Constant product MM |
| Orca Whirlpool | whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc | Concentrated liquidity |
| Meteora DLMM | LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo | Dynamic liquidity MM |
| Jupiter V6 | JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 | Swap aggregator |
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | SPL token operations |
references/providers.md — Provider comparison: endpoints, pricing, auth, featuresreferences/subscription_filters.md — Complete filter reference with examples for every filter typereferences/proto_reference.md — Key protobuf message definitions and field documentationreferences/performance.md — Connection management, reconnection, backpressure, production checklistscripts/subscribe_transactions.py — Stream and parse transactions filtered by program IDscripts/monitor_wallets.py — Watch specific wallets for on-chain activity© agiprolabs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (scripts, references) in skills/yellowstone-grpc of agiprolabs/claude-trading-skills.
Open the folder on GitHubat commit 981e1d7
Yellowstone Grpc next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Yellowstone Grpc this skillagiprolabs/claude-trading-skills | 410 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Release Rebasejito-foundation/geyser-grpc-plugin | 145 | — | ~836 | Automated safety check: Pass | Custom licence | |
| Quicknode Skillinternet-court/internet-court-skill | 6.6k | — | ~11k | Automated safety check: Pass | MIT | |
| Quicknodesendaifun/skills | 130 | 1 repos | ~5.5k | Automated safety check: Notes | Apache-2.0 | |
| Use Yaakmountain-loop/yaak | 19k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Golang Proantoniopaya22/go-rest-template | 172 | 3 repos | ~1.2k | Automated safety check: Pass | MIT |
jito-foundation/geyser-grpc-plugin
A skill your agent uses when updating this repo to match a new jito-solana release line such as v4.0.
internet-court/internet-court-skill
Quicknode blockchain infrastructure for 80+ chains: Core RPC API, Streams, Webhooks, Blazar WSS, Solana gRPC, HyperCore gRPC, SQL Explorer, Metaplex DAS API, Blockbook, Ordinals & Runes API, Swap…
sendaifun/skills
Quicknode blockchain infrastructure for Solana — RPC endpoints, DAS API (Digital Asset Standard) for NFTs and compressed assets, Yellowstone gRPC streaming, Priority Fee API, Streams (real-time data…
mountain-loop/yaak
A skill your agent uses when the user mentions Yaak, a Yaak workspace, or the yaak command, or asks to call, hit, or smoke test HTTP/REST endpoints, save or organize API requests for reuse or manual…
antoniopaya22/go-rest-template
Implements concurrent Go patterns using goroutines and channels, designs and builds microservices with gRPC or REST, optimizes Go application performance with pprof, and enforces idiomatic Go with…
GetBindu/Bindu
Diagnose gRPC connection issues between the Bindu core and a language SDK.
agiprolabs/claude-trading-skills
Event-driven backtesting with bar-by-bar execution, complex order types, multiple analyzers, and custom indicators
agiprolabs/claude-trading-skills
Solana token market data via Birdeye — prices, OHLCV, trades, token metadata, security checks, and trader activity
agiprolabs/claude-trading-skills
Broad crypto market data from CoinGecko covering 13,000+ tokens.
agiprolabs/claude-trading-skills
Cointegration testing for pairs trading using Engle-Granger, Johansen, and rolling stability analysis
agiprolabs/claude-trading-skills
Wallet evaluation, monitoring, and copy-trade strategy design for Solana DEX trading
agiprolabs/claude-trading-skills
Cross-asset correlation analysis including rolling correlation, hierarchical clustering, tail dependence, and regime-dependent correlation
Categories
Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin). Yellowstone Grpc is an agent skill from agiprolabs/claude-trading-skills.
Yellowstone Grpc fits situations like: tasks that involve gRPC and Protobuf.
Run `npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a claude-code`. Or copy the skill folder (skills/yellowstone-grpc in agiprolabs/claude-trading-skills) into .claude/skills/yellowstone-grpc in your project. Claude Code loads it when a task matches its description.
Run `npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a codex`. Or copy the skill folder (skills/yellowstone-grpc in agiprolabs/claude-trading-skills) into .agents/skills/yellowstone-grpc in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add agiprolabs/claude-trading-skills --skill yellowstone-grpc -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/yellowstone-grpc, .gemini/skills/yellowstone-grpc, .github/skills/yellowstone-grpc and .opencode/skills/yellowstone-grpc in your project.
Going by SKILL.md and its folder, Yellowstone Grpc needs Python for the scripts in its folder, the command-line tools its instructions call (uv, git, python and npm) and credentials named GRPC_TOKEN. Our summary lists: Python 3; Node.js; A credential in GRPC_TOKEN.
SKILL.md names 2 domains. In commands or code: github.com and grpc.ny.shyft.to; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Yellowstone Grpc is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Yellowstone Grpc: Release Rebase (jito-foundation/geyser-grpc-plugin, 145 stars), Quicknode Skill (internet-court/internet-court-skill, 6.6k stars), Quicknode (sendaifun/skills, 130 stars) and Use Yaak (mountain-loop/yaak, 19k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
agiprolabs (a GitHub user) maintains it in agiprolabs/claude-trading-skills, which has 410 GitHub stars. The repository holds 68 skills in this directory. The repository was last updated on September 3, 2026.
Source: agiprolabs/claude-trading-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.