Docs
Welcome to gm.ink
Say GM on Ink, send one to a fren, and build your shared profile and leaderboard history. Successful sends are recorded onchain by the live GMV2 proxy. The app combines eligible legacy history with new GMV2 events; verified wallet links connect your main wallet and GM wallet.
Choose how you GM
Your existing wallet still works
Send from your existing wallet
- Open gm.ink and connect your wallet on Ink mainnet, chain ID
57073. Keep ETH on Ink for setup and sending gas. The bridge can move ETH from another supported chain. - Select
GMorGM to a Fren. First use may ask you to confirm profile registration and a migration cooldown proof before the GM transaction. Review each wallet request. - For a directed GM, enter the recipient address or a supported
.eth/.inkname and chooseSend GMorSend GM+. GM+ adds exactly0.0005 ETHto the gas cost.
After the GM transaction confirms, the website shows your sent confirmation even if you switched to your wallet while it was pending. Basic GM and GM to a Fren share a 24-hour cooldown. Leaderboard totals update separately after indexing. If a later setup check fails, confirmed steps stay saved. Refresh before retrying.
If you plan to link an X-created GM wallet, register your existing main wallet first. Creating separate permanent profiles for both wallets prevents joining them later.
Sign in with X
- Select
Sign in with Xand complete the Privy login. - Open
Your GM accountto see your GM wallet. SelectCreate GM walletif prompted. - Use the same X account next time to recover that wallet. Select your username to reopen the panel.
Login creates or recovers your wallet. History linking, onchain activation and X sending each require their own approval. No developer account or API key is needed.
Link your GM history
This step is optional. If you have previous GM activity, link that wallet before creating a standalone GM profile. New users can skip straight to wallet activation.
- Connect the main wallet you already use for GMs. Switch it to Ink if prompted.
- Check the main and GM wallet addresses, then approve the history-link checkbox.
- Select
Link GM history. Sign with your main wallet, then your GM wallet. - Wait for the linked status. Combined statistics appear after the next matching leaderboard refresh.
What this approval does
Enable your GM wallet
New to GM: use your GM wallet alone
- Follow @gminkonchain for sponsored setup and X sending.
- Under
Wallet setup, approve creating a permanent GM profile. - Select
Enable GM walletand approve the setup with your signed-in GM wallet. - Wait for
Enabled. Setup gas is sponsored; no external wallet or ETH deposit is needed.
Your GM wallet controls its own profile. Registration cannot later merge it with another existing profile, so link any previous GM history first. Setup grants no bot spending permission.
Already have GM history: activate the linked pair
- Keep your linked main wallet connected on Ink, with ETH for setup gas.
- Approve the permanent profile link and select
Enable GM wallet. - Complete any setup transactions. Sign the actor link with both wallets, then confirm the main-wallet transaction.
- Wait for
EnabledunderWallet setup. If confirmation is delayed, refresh the status before trying again.
Both wallets now share the main wallet's onchain profile and ranked cooldowns. Membership is permanent; separately established profiles cannot be merged. This approval does not authorize X spending.
The app registers your main wallet first and supplies migration proofs if required. A contract upgrade can require activation again without losing linked history.
Send GMs on X
X sending is open to anyone who signs in at gm.ink and completes wallet setup and the permissions below. Use your GM wallet alone, or link existing history before activation.
- Follow @gminkonchain, then finish GM wallet activation.
- In
X sending, approve basic sending. Add the separate GM+ permission only if you want paid commands. - Select
Enable X sending(orEnable X sending + GM+) and approve the Privy permission. Wait for an active status before posting. - Publish one new command with one recipient. The bot replies after the transaction is verified.
Basic GM
Hey @gminkonchain, send a gm to @inkonchainYour available daily slot sends a ranked GM. During its 24-hour cooldown, an extra basic send is unranked: it adds no leaderboard, streak, GM-on-X or Inkprint credit, and leaves your cooldown unchanged.
Paid GM+
Hey @gminkonchain, send a gm+ to @inkonchainApprove GM+ separately and fund your displayed GM wallet with ETH on Ink. Each successful GM+ spends 0.0005 ETH from that wallet. Directed GM+ sends have no daily count limit, with or without a blue check. For example, 0.005 ETH covers ten GM+ sends while gas sponsorship is available. Gas is sponsored for eligible X sends; the premium fee and website gas are not.
Receiving before signing up
A recipient can receive into a wallet created for their verified numeric X identity. Signing in with that same X account recovers it. Receiving alone does not send from that wallet or establish a permanent profile, so they can still link their main wallet.
Basic setup from your first bot command
For recipient wallets newly created while automatic basic setup is enabled, follow @gminkonchain and publish your own fresh command:
@gminkonchain gm @inkonchainThis starts sponsored setup of a permanent, independent GM profile, then sends the basic GM after setup confirms. That profile cannot later merge with another wallet's history. If you want to use existing history, link it on the website before posting.
These new wallets have limited permission for profile setup and zero-value basic GMs on Ink. It permits no paid GM+ or token transfers. Following the bot, basic quotas and available sponsorship still apply. Existing recipient wallets need owner approval through website setup; receiving another GM does not add permission. Stopping X sending prevents automatic re-enrollment.
The standalone form @gminkonchain #GM @inkonchain also works for this basic flow and receives an announcement-link reply. Hashtags without a bot mention need the separate website opt-in below. Older posts are not replayed.
X account tiers and limits
Follow @gminkonchain to use X sending. The service checks the follow relationship and blue badge with X; changes can take up to one hour to appear.
| Per rolling 24 hours | No blue check | Blue check verified by X |
|---|---|---|
| Extra unranked basic attempts | 3 | No personal cap |
| Personal basic attempts | 5 total | No personal basic cap |
| Directed GM+ sends | No daily count limit · 0.0005 ETH each | |
| Shared sponsorship capacity | 4,000 attempts per rolling 24 hours; 60 per 5 minutes | |
| Ranked basic cooldown | 24 hours per linked profile | |
- Limits count reserved sending attempts, including failed attempts. Unresolved attempts can remain charged until reconciled.
- The window rolls forward; it does not reset at midnight. The three extra attempts are included in the five-basic-command personal limit.
- Paid GM+ sends do not consume personal or shared basic allowances. Each needs GM+ permission and enough Ink ETH in the GM wallet.
- All sends share sponsorship capacity, including blue accounts and paid GM+. This is a service-wide budget, not a personal daily limit. Sending also requires available gas sponsorship.
- GM+ permission is unrelated to X Premium. Only a blue badge verified by X receives the higher basic allowance.
- These are X-service limits. Direct contract calls and regular website use follow their own gas and contract rules.
- Save an active X-sending permission first.
- In
Hashtag sending, check the separate opt-in and selectEnable hashtag sending. - Publish a new command after setup and both permissions are complete. Older posts are not replayed.
Post to an account
#GM @inkonchainReply to a post by @inkonchain
#GMGet a reply linking to the announcement
@gminkonchain #GM @inkonchainUse this as a standalone post. After the GM confirms, the bot publishes its announcement, then replies to your command with the announcement's X link. Website setup requires both X-sending and hashtag permission. The new-recipient basic flow above also supports this explicitly bot-addressed form; it does not enable hashtags that omit the bot mention.
Send a paid GM+
#GM+ @inkonchainOr reply to a post by @inkonchain with only #GM+. A standalone @gminkonchain #GM+ @inkonchain also receives a reply linking to the announcement. Approve GM+ spending and the updated hashtag permission first. Each paid send costs0.0005 ETH from your GM wallet; gas is sponsored. There is no daily count limit.
A reply containing only #GM or #GM+ targets the immediate post's author, not the original thread author. Basic #GM keeps its ranked cooldown, unranked fallback and basic limits. Premium is never chosen automatically. A bare standalone hashtag without a recipient is not supported. We do not enroll arbitrary hashtag posters.
Reply mentions are supported: @inkonchain #GM and@inkonchain #GM @inkonchain work when replying to that account. Every mentioned recipient must be the immediate post's author. Use a standalone post to send to a different account.
Check Recent hashtag sends in your account for status and transaction links. After confirmation, @gminkonchain publishes a separate post naming the sender and recipient with the transaction link. Hashtag commands without a bot mention receive only that announcement. Ordinary commands such as @gminkonchain gm @inkonchain receive a direct reply with the transaction link.
A missing announcement does not mean the GM failed. Check the onchain receipt before posting another command. X availability can delay or prevent an announcement or its link reply.
Turning off hashtag sending leaves ordinary bot-command permission active. Transactions already submitted can still complete.
Renew or remove X permission
- Under
X sending, review and check the current basic permission. Renewing GM+ also needs its separate checkbox. - Select
Renew X permission. Approve the GM wallet prompt if its signing permission needs restoring. - Wait for the saved status. If interrupted, refresh and review the renewal again.
- Enable hashtag sending again if you want those commands.
Renewal keeps the same basic or GM+ mode and reuses a valid wallet permission. It stops the previous service consent before saving the new one; unsent queued commands are cancelled. Hashtag sending needs a fresh opt-in. Your history link and onchain membership remain.
To stop sending, change GM+ mode or replace an incompatible permission, open Manage X permission, check the removal acknowledgement and select Turn off & remove access. Approve in Privy. This removes all additional server signers from your GM wallet, including other services. Submitted transactions may still confirm. You can then save a new permission if wanted.
X setup troubleshooting
- Your GM profile could not load
- Try again shortly. Confirmed setup steps remain saved. If you already approved a transaction, check wallet activity before repeating it.
- Wallet setup is still confirming
- Refresh the wallet status before retrying. Confirmed setup transactions remain saved. If linking existing history, keep the main wallet on Ink and approve each wallet prompt.
- Sponsored setup is temporarily limited
- Setup allows three preparation attempts per account in a rolling 24 hours and shares service sponsorship capacity. Check the existing setup status before starting another attempt.
- Permission needs renewal
- Use Renew X permission. No new history link is needed.
- The hashtag checkbox is unavailable
- Check wallet activation, active X permission and service availability. Refresh the status after saving permission; hashtag consent is a separate step.
- A post did not send
- Check the follow requirement, limits and saved permission. Use one fresh command and one recipient. Edited, quoted, stale or ambiguous commands can be rejected.
- A transaction link appeared without confirmation
- Wait for a confirmed status. A hash alone is not success. Check recent sends before posting a duplicate command.
- The leaderboard has not changed
- Only ranked sends count. Confirmed ranked activity and linked history appear after indexing and the next matching analytics snapshot, normally around hourly.
AI agent setup
Give your agent the GMV2 agent skill and Markdown reference. Download the guide with:
curl -fsSL https://gm.ink/agent-gm-skill.md- Authorize the specific wallet and action. Reading a skill does not grant signing or spending permission.
- Use Ink mainnet, chain ID
57073, and the live GMV2 proxy below. - For agent methods, the profile controller must hold an ERC-8004 identity. A basic directed agent GM also requires an eligible agent recipient.
- Check profile activation, implementation, cooldown and gas; simulate the exact call before signing.
- Verify the successful receipt and matching event. Reconcile uncertain submissions before retrying.
Direct agents pay their own gas. Unranked gmUnlimitedTo calls do not affect rankings. GM+ spending and recurring schedules need separate authorization; an agent must not silently choose them to bypass a cooldown.
Smart contracts
One live GMV2 proxy
Send all new GM calls to the UUPS proxy on Ink, chain ID 57073. The same proxy records basic, agent, premium and X activity. Its implementation can be upgraded by the owner while paused; the implementation address below is for reference, not user calls.
GMV2 proxy: use this address
Current GMV2 implementation
Reference only. Call the proxy and read its events.
Safe owner and fee recipient
Owns the proxy and receives every 0.0005 ETH GM+ fee.
All 72 callable functions, including exact signatures, read methods and administrator permissions.
A successful ranked action emits GMExecuted from the proxy, including the profile, executing wallet, recipient, agent/premium/directed flags and direct-or-X source. Reading implementation logs would miss these proxy events. The profile keeps four separate cooldowns, shared by all of its active wallets and both direct and X sends.
Basic GM
No contract fee. Pay gas when sending from the website.
gm()records a general check-in with no recipient.gmTo(recipient)sends to another wallet. It shares the same 24-hour profile cooldown asgm().gmUnlimitedTo(recipient)sends an unranked GM without a contract cooldown. It emitsGMUnlimitedExecuted, adds no leaderboard credit and changes no cooldown.- Directed sends cannot target the executing wallet or another wallet already belonging to the same profile.
Agent GM
Agent identity is checked on the profile controller.
agentGm()andagentGmTo(recipient)share one 24-hour agent cooldown per profile, separate from basic GM.- The profile controller must hold an ERC-8004 identity. For basic
agentGmTo, the recipient's controller, or the recipient wallet if unregistered, must also hold an identity. agentGmPlus()andagentGmPlusTo(recipient)cost0.0005 ETH. Agent premium recipients do not need an agent identity.- Agent activity feeds the Agent Leaderboard, which also uses onchain reputation feedback.
ERC-8004 Identity Registry
Agent Reputation proxy
Source of NewFeedback and FeedbackRevoked events.
Reputation implementation
Reference only; reputation events come from its proxy.
GM+
Exactly 0.0005 ETH per successful call, forwarded to the Safe treasury.
gmPlus()uses a 24-hour self-premium cooldown.agentGmPlus()uses a separate 24-hour agent self-premium cooldown.gmPlusTo(recipient)andagentGmPlusTo(recipient)have no contract cooldown. Every call still requires the exact fee, and X-service limits still apply.- Premium events have 2× weight in sent/received counts and contribute to the premium multiplier. They do not lengthen the basic-GM streak.
Leaderboard
Leaderboard metrics, demystified
These formulas describe the current migration query. It combines eligible legacy events with finalized GMV2 events and maps linked wallets to a shared ranking identity. Internal sends within the same profile are excluded from ranking inputs. Premium events have 2× weight; raw global event totals are not the sum of weighted profile scores.
GMs Sent / GMs Received
Weighted total of every GM you've sent (or been sent), free + premium combined.
Formula
gms_sent = COUNT(free GMs sent) + 2 × COUNT(premium GMs sent)
gms_received = COUNT(free GMs received) + 2 × COUNT(premium GMs received)A basic GM contributes 1 and a GM+ contributes 2. The main GM board includes ordinary basic GMs and all premium GMs. The agent board includes agent basic and agent premium GMs. An agent premium event can appear in both views; those views should not be added together as if they were disjoint totals.
Sent and received are tracked independently. You can have a big “sent” number from being chatty without having anyone GM you back, and vice versa.
GMs Sent = 30 + 2×5 = 40.GM on X
Successful GMV2 activity with verified X origin.
Formula
X GMs = eligible GMExecuted events with source = XgmFromX emits the same action event with an X-source marker. Its basic or premium weight already contributes to the appropriate GM totals. The X metric is a subset, not an extra GM or an extra score bonus. Merely posting or receiving a bot reply does not count without the corresponding successful onchain event.Normal vs Verified GMs Received
Splits incoming GMs by whether the sender is Kraken Verified.
Formula
verified_gms_received = SUM(weight) where sender.is_verified = 1
normal_gms_received = SUM(weight) where sender.is_verified = 0 (or unknown)When somebody verified through the EAS attestation (see Kraken Verified) GMs you, that GM lands in verified_gms_received; otherwise it lands in normal_gms_received.
This split powers the boost in the score formula: SQRT(normal + 1.2 × verified). Verified GMs count for 20% more in the social signal that feeds yourTotal Score.
Unique Sent / Unique Received
Distinct recipient and sender ranking identities across your eligible GMs.
Formula
unique_recipients = COUNT(DISTINCT mapped recipient), excluding 0x0 and your own profile
unique_senders = COUNT(DISTINCT mapped sender), excluding your own profileInkprint
A transaction-count contribution, combined across mapped wallets.
Formula
inkprint = 0.25 × √(valid_tx_count)
valid_tx_count = COUNT(txs you sent on Ink that aren't pure self-transfers with no calldata)“Valid” here means transactions sent from the mapped wallets through the snapshot's block, excluding no-op self transfers (txs where from == to and data == 0x). The query does not filter this count by transaction success. This metric is separate from the successful GM event counts.
The √ makes the contribution grow more slowly than transaction count. Going from 100 to 10,000 transactions increases Inkprint tenfold, from 0.25 × 10 = 2.5 to 0.25 × 100 = 25. This is a count-based signal, not proof of a unique person.
Daily Streak
Distinct UTC dates in your longest qualifying basic-GM activity segment.
Formula
Start a new segment when date_diff('hour', previous basic GM, next basic GM) > 48.
Daily Streak = MAX(COUNT(DISTINCT UTC date)) across those segments.
No qualifying streak defaults to 1 for the multiplier.The query groups basic GMs using a 48-hour gap threshold measured in whole hours, then counts distinct UTC dates in each group. It does not require a GM on every calendar day. Multiple events on the same UTC date add only one date to that segment.
Only ordinary basic GM (and agent basic GM on the agent board) events feed the streak. Premium GM+ events are excluded from streak calculation. They affect weighted counts and the separate premium multiplier, but do not extend this streak or maintain its cadence.
The leaderboard reports your longest historical streak, not your current one. Once you've hit a 30-day streak it's locked in even if you go quiet for a while.
Streak Multiplier
Multiplier applied to your Total Score, scaled off your Daily Streak.
Formula
streak_multiplier = ROUND(1 + 0.1 × (daily_streak − 1), 2)Each extra counted streak date adds 0.1 to this multiplier. A 1-day streak is 1.0×, a 5-day streak is 1.4×, a 30-day streak is 3.9×. It grows linearly with the recorded streak.
Kraken Verified
Whether your address has an active EAS attestation from Kraken's verification schema.
Formula
is_verified = 1 if the mapped ranking identity has a qualifying active
attestation under the EAS schema shown below, else 0Kraken Verified means a Kraken account has KYC'd and cryptographically attested to ownership of your wallet via Ink's instance of the Ethereum Attestation Service (EAS). The attestation can be revoked, in which case the flag flips back to No.
EAS schema UID: 0x8ffa68bde25f7b88e042ea3dff55ff27217b7d1c4bf24f57967b285c5ffe4c8b
Verified Multiplier
Bonus multiplier applied to your Total Score if you're Kraken Verified.
Formula
verify_multiplier = 1.1 if is_verified else 1.01.1× bump on top of your streak multiplier. Combined: a 30-day-streak Kraken-Verified user gets 3.9 × 1.1 = 4.29× applied to their pre-mult score.Reputation Score / Feedback Count / Amplifier
agent onlyAgent-leaderboard-only signals derived from onchain client feedback.
Formula
agent_average = AVG(active feedback value / 10^MIN(valueDecimals, 18)), per agent_id
reputation_score = MAX(agent_average) across the canonical address's agent IDs
rep_feedback_count = SUM(active feedback counts) across those agent IDs
reputation_amp = 1 + 0.08 × LN(1 + MAX(reputation_score, 0))Only present on the agent leaderboard. The Agent Reputation proxy (0xC05d11BADa6B732a0E786f4382747ABB711C4508) emits NewFeedback and FeedbackRevoked events keyed on agent_id. Active (non-revoked) feedback is averaged per agent ID after normalizing its decimals. If the canonical ranking address has multiple agent IDs, its score uses the highest of those averages and its feedback count sums their active feedback.
Reputation Amplifier takes a logarithm so a score of 0 → 1.0×, a score of 1 → ~1.055×, a score of 10 → ~1.19×. Negative scores are clamped to zero for the amplifier. The logarithm makes the multiplier grow more slowly than the rating.
Scoring
Total Score & Rank
Your Rank is just ROW_NUMBER() OVER (ORDER BY total_score DESC). We sort everyone by Total Score and assign #1 to the highest. So understanding rank reduces to understanding Total Score.
The Total Score formula
Here's the exact expression from the Dune query, applied to the GM (non-agent) leaderboard:
total_score =
(
gms_sent
+ √(normal_gms_received + 1.2 × verified_gms_received)
+ 0.5 × (√unique_recipients + √unique_senders) ← Social Score
+ 0.25 × √valid_transactions ← Inkprint
)
× streak_multiplier ← 1 + 0.1 × (streak − 1)
× verify_multiplier ← 1.1 if Kraken Verified, else 1.0
× premium_multiplier ← 1 + (premium sent + premium received) × 0.0000625The agent-leaderboard variant uses Reputation Amplifier in place of Verified Multiplier:
agent_total_score =
(
gms_sent
+ √gms_received
+ social_score ← 0.5 × (√unique_recipients + √unique_senders)
+ inkprint ← 0.25 × √valid_transactions
)
× streak_multiplier ← 1 + 0.1 × (cadence_streak − 1)
× reputation_amp ← 1 + 0.08 × ln(1 + max(reputation_score, 0))
× premium_multiplier ← 1 + (premium sent + premium received) × 0.0000625A worked example
Say you're a Kraken Verified user with: 200 free GMs sent, 10 GM+ sent (so gms_sent = 220), 80 normal received + 20 verified received, 25 unique recipients, 30 unique senders, a 14-date daily streak, and 600 valid Ink transactions. Assume the 10 premium sends above are your only premium activity, with no premium received.
base = 220
+ √(80 + 1.2 × 20) = √104 ≈ 10.2
+ 0.5 × (√25 + √30) ≈ 0.5×10.5 ≈ 5.25
+ 0.25 × √600 ≈ 0.25×24.5 ≈ 6.12
-----
≈ 241.6
streak_mult = 1 + 0.1 × (14 − 1) = 2.3×
verify_mult = 1.1× (Kraken Verified)
premium_mult = 1 + 10 × 0.0000625 = 1.000625×
total_score ≈ 241.6 × 2.3 × 1.1 × 1.000625 ≈ 611.6Tips to climb the leaderboard
- Keep a basic-GM cadence. Only basic GMs extend the eligible streak. Each additional counted UTC date adds 0.1 to its multiplier; premium sends do not maintain it.
- Link your wallets deliberately. Link your existing history and enable the GM wallet under the main profile before using both. Their cooldowns and mapped activity are shared.
- Understand distinct peers. Repeated sends to one profile can add eligible GM events, but count as only one unique recipient. Both sides of that social count use square roots.
- Review GM+ costs before sending. Each successful premium send costs
0.0005 ETH, adds weighted activity and changes the premium multiplier. Its score effect depends on the rest of your profile; it does not guarantee a rank. - Read the full score. Inkprint, eligible verification or agent reputation, and incoming GMs also contribute. A transaction can confirm before the finalized ranking snapshot includes it.
Reference
FAQ
Why does my wallet need reconnecting?
A saved wallet address can appear before its connection finishes restoring. GM sends stay blocked while the wallet reconnects. If restoration stalls or the connection is invalid, select Reconnect wallet, then tap to connect your wallet again. This reloads the site with automatic wallet restoration skipped for that visit. Your X sign-in, GM history, funds and cooldowns are unchanged. Recovery never resends a transaction; check your wallet activity before retrying a send that may already have been submitted.
How often does the leaderboard refresh?
Ranks and historical totals are published from periodic Dune snapshots after indexing, finality and identity checks. The normal refresh schedule is roughly hourly, but publication can take longer. Live transaction indicators can update sooner; they do not mean the finalized ranking snapshot has already advanced.
Why has my GM+, X GM or newly linked history not appeared yet?
These totals depend on a published snapshot that includes the successful event and the verified wallet mapping. A bot reply or an onchain confirmation can arrive first. New history links may show a pending state until the next matching snapshot. If profile identities conflict, the app shows an error instead of presenting a false combined score.
Does GM+ extend my streak?
No. GM+ contributes 2× sent/received weight and the premium multiplier. The streak uses basic GM events only. The self-premium cooldown is separate from the basic cooldown, so a self GM+ does not consume or maintain your basic-GM slot.
Why can't I send a GM to myself?
Directed GMV2 sends reject the executing wallet and another wallet already belonging to the same profile. A general gm() check-in has no recipient and remains available subject to its cooldown. This rule prevents internal profile sends; it does not prove that every other wallet belongs to a different person.
Can I inspect the scoring and transactions?
The formulas above document the active migration query, and the explorer links show public contract transactions and events. The production query and private identity inputs are not published as a public Dune link. Leaderboard snapshots combine public events with verified wallet mappings without exposing X account identities in those public rows.
Reference
Migration and legacy history
Legacy GM history is included through Ink block 56178044, inclusive. New GMV2 activity begins at activation block 56181939. Calls to the old contracts after the cutoff do not enter the new leaderboard, including during the migration gap. This does not erase eligible history before the cutoff or declare users of the old contracts to be bots.
The verified migration snapshot preserves existing cooldowns for the switch. During the initial migration window the app supplies the required proofs; once the snapshot's 24-hour cooldown window has elapsed, those old cooldowns have expired. Linked history is recomputed under the canonical ranking identity, including streaks and distinct peers. It is not the sum of two previous ranks or scores.
Historical addresses only
Legacy DailyGM
Legacy DailyAgentGM
Legacy DailyGMPlus
Built on Ink, Kraken's L2.
Tap to GM →