The income layer for crypto. The borrower connects a wallet, signs once (read-only), and Shore reads their staking and DeFi yield, classifies it under the tax rules, and returns lender-ready qualifying income with a certificate. Non-QM ready, drop-in.
1 // the income step, now for on-chain wealth 2 const income = await useShore({ 3 wallet: true, // borrower connects + signs 4 chains: "all", // ETH, SOL, L2s… 5 certificate: true 6 }) 7 8 income.monthlyQualifying // → 1855 USD/mo 9 income.taxBasis // ordinary @ receipt 10 income.certificate.hash // 0x… ✓ verified
Reads yield from
Conforming loans can't count crypto income. Shore lives in the non-QM lane and does exactly one thing: turn a borrower's on-chain yield into clean, verified, tax-grounded qualifying income, in the schema your underwriting already reads.
MetaMask, Coinbase Wallet, Phantom, Rabby, Ledger, WalletConnect. The borrower picks one and signs. No app, no account, no seed phrase shared.
Lido, Rocket Pool, EigenLayer, exchange staking, Solana validators, LP and lending yield, across every chain and L2. One read, all of it.
Yield is classified as ordinary income at receipt (IRS Rev. Rul. 2023-14) and seasoned over 24 months. The same policy-to-rules logic Fenero runs on tax returns.
The borrower signs a message to prove ownership. Shore never holds keys, never moves funds, never takes custody. A signature, not a transaction.
Every result ships with a verifiable certificate: wallet proof, on-chain source, USD conversion, tax basis. Defensible enough to put in front of an investor.
Qualifying income returns in a clean schema your DSCR / bank-statement underwriting already parses. Drop-in. You only pay when it returns verified income.
npm i @fenero/shore and drop in your API key.
Call useShore({ wallet: true }). A neon connect popup opens on your page. The borrower picks a wallet and signs a read-only message to prove ownership.
We scan every chain for staking and DeFi positions, price them in USD, and classify the yield as income under the tax rules, seasoned over 24 months.
A monthly qualifying-income figure plus a certificate of provenance returns in the same call. Your underwriting doesn't change. You only pay for this step.
1 import { useShore } from "@fenero/shore" 2 3 // borrower connects a wallet, signs once 4 const income = await useShore({ wallet: true }) 5 6 // → tax-grounded, USD, 24-mo seasoned 7 income.monthlyQualifying // 1855 8 income.positions[] // Lido, RP, Jito… 9 income.certificate // 0x… provenance ✓
Shore isn't a new integration to design around. It's the income check, for the borrower whose paycheck is a validator. Same screen, same schema, same workflow. They connect a wallet instead of uploading a W-2.
Self-employed, paid in crypto, or living on staking yield. No W-2, no pay stub, nothing your income step can use.
Your code calls useShore(). A neon connect popup drops on the page. The borrower picks a wallet and signs.
One signature proves they own the wallet. No funds move, no keys shared. Shore reads the chain.
USD, tax-grounded, seasoned, with a certificate. Returns in the same call your underwriting already reads.
With wallet: true the borrower never leaves your page. The Shore connect popup renders right where the income step stalled. They sign once, and verified qualifying income comes back.
Drop it in as a React hook, vanilla JS, a <shore-connect> web component, or a zero-SDK hosted page. Same popup, any stack.
Connect the wallet that earns your staking and DeFi yield. We'll read it, you keep custody.
Shore reads, it never holds. Proof is a signature, not a transfer. The most paranoid crypto-native borrower can connect without giving up a thing.
Shore never sees a private key or seed phrase. Ownership is proven with a signed message. We cannot move funds. Ever.
Public addresses and on-chain data only. No approvals, no spend permissions, no transactions requested.
Wallet data is used for the one call and nothing else. Never resold, never shared, never training data.
Every result is independently checkable: wallet proof, on-chain source, USD basis, tax classification. Audit export on demand.
No seats, no subscription. You're billed only when Shore returns verified qualifying income. A borrower who never connects costs you nothing.
Limited private beta. We onboard design partners personally and wire it into your stack with you.
const income = await useShore({ wallet: true })