Integrate with Gully Chain
Gully Core contracts, embeds and oEmbed, the share API, and Gully ID one-tap approvals with the Gully Wallet SDK. Everything here is live on testnet unless it says otherwise.
On this page: Gully Core · Embeds and oEmbed · Share API · Gully ID one-tap and Wallet SDK
Gully Core contracts
Live on testnet
The 44 Gully Core contracts are deployed on GullyChain Testnet (2026-10-29, version 1.0.0-testnet) and verified on Sourcify. Launches in the app (app.gullychain.xyz/launch), swaps, token pages and analytics run on Gully Core; you can also call the contracts directly.
Gully Core is the chain's own launchpad and DEX core: one shared Vault with concentrated-liquidity (CL) and Bin pool managers, a UniversalRouter, one-transaction launches with the launch liquidity locked forever, launchpads and DEXes as clones (GullyCorePadFactory), range orders and DCA. Deployed through CreateX 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed; governance and protocol fees go to the testnet governance Safe. It reuses WETH9, USDC.e and Permit2 from the contracts table. Design and fee model: Gully Core in the docs.
Every address with its verification status and ABI link is also in contracts.json and llms-contracts.txt.
Embeds and oEmbed
Every track, video, Short and live stream in the app has an embeddable player at https://app.gullychain.xyz/embed/<kind>/<id> (kinds track, video, short, live). The player loads only its own script, runs no trackers and may be framed by any site; paid titles show a button that opens the app.
<iframe src="https://app.gullychain.xyz/embed/video/VIDEO_ID" width="640" height="360"
style="border:0;border-radius:12px;max-width:100%"
allow="autoplay; encrypted-media; fullscreen; picture-in-picture"
allowfullscreen loading="lazy" title="My film on Gully Chain"></iframe>Sizes: track 100% x 152, video and live 640 x 360, short 360 x 640.
oEmbed
Resolve any app or share link to an embed. CORS is open, only format=json is supported, and maxwidth / maxheight size the player and thumbnail. Tracks answer type: "rich", videos, Shorts and live streams type: "video" with the iframe in html, everything else type: "link" with the card as thumbnail_url. Unknown URLs answer 404. App and share pages also announce the endpoint with <link rel="alternate" type="application/json+oembed">.
https://app.gullychain.xyz/oembed?url=https://app.gullychain.xyz/watch/VIDEO_ID&maxwidth=600curl -s "https://app.gullychain.xyz/oembed?url=https://app.gullychain.xyz/watch/VIDEO_ID"
# {"version":"1.0","provider_name":"Gully Chain","type":"video","width":640,"height":360,
# "html":"<iframe src=\"https://app.gullychain.xyz/embed/video/VIDEO_ID\" ...>","thumbnail_url":"https://app.gullychain.xyz/s/video/VIDEO_ID.png", ...}Creator guide: Share and embed.
Share API
Share links have the form https://app.gullychain.xyz/s/<kind>/<id>: link-preview bots get Open Graph and Twitter cards, people are sent on to the app. Kinds include track, video, short, live, p (profile, by .gully label), post, t (token or launch) and quest. Add ?r=<referral> and utm_* parameters to attribute visits.
| Endpoint | What it returns |
|---|---|
GET https://app.gullychain.xyz/s/<kind>/<id>.png | The 1200 x 630 link-preview card |
GET https://app.gullychain.xyz/s/<kind>/<id>.story.png | The 1080 x 1920 story image |
GET https://social.gullychain.xyz/v1/share/counts?kind=&id= | {shares, visits, byNetwork, visitsBySource} for one item |
POST https://social.gullychain.xyz/v1/share/event | Counts a share from your own button: body {"kind", "id", "network"}, rate limited (120 an hour per IP) |
Networks for share/event: native, copy, x, facebook, whatsapp, telegram, instagram, tiktok, imessage, sms, story, embed, qr, other.
curl -s "https://social.gullychain.xyz/v1/share/counts?kind=video&id=VIDEO_ID"
curl -s -X POST https://social.gullychain.xyz/v1/share/event -H 'content-type: application/json' \
-d '{"kind":"video","id":"VIDEO_ID","network":"x"}'Gully ID one-tap and the Gully Wallet SDK
Use Sign in with Gully (OpenID Connect) for identity, and the Gully Wallet SDK for on-chain actions. Load one script and you get window.gully, an EIP-1193 provider that is also announced over EIP-6963 as "Gully Wallet", plus a <gully-wallet-pill> account button. Every request opens a small approval window on gullyid.xyz; the server never holds a user key.
<script src="https://gullyid.xyz/wallet.js"></script>
<gully-wallet-pill></gully-wallet-pill>
<script>
const [account] = await GullyWallet.connect() // eth_requestAccounts
// approve + swap in one approval: EIP-5792 batch, sponsored when the paymaster agrees
const { id } = await window.gully.request({
method: 'wallet_sendCalls',
params: [{ version: '2.0.0', chainId: '0x768d6', from: account, calls: [approveCall, swapCall] }],
})
await window.gully.request({ method: 'wallet_getCallsStatus', params: [id] })
</script>Also supported: eth_sendTransaction, personal_sign and eth_signTypedData_v4 (verify them as ERC-1271, or ERC-6492 before the account is deployed; viem's verifyMessage and verifyTypedData handle both), wallet_switchEthereumChain, wallet_getCapabilities (paymaster service and atomic batches on 0x768d6). Helpers on GullyWallet: connect(), disconnect(), state(), balances(), send(), swap(), receive(), open(path). An ES module build is at https://gullyid.xyz/wallet.mjs.
Approval tiers
| Tier | What | How the user approves |
|---|---|---|
| No prompt | Free Gully actions: quest check-ins and claiming rewards (0-value calls to allowlisted Gully contracts) | Nothing |
| One tap | USDC.e tips, small Gully Swap swaps from USDC.e, pay-per-view unlocks and membership renewals for the user, under your app's daily limit, to recipients paid before | One button ("Tip $1 to @maya") |
| Passkey | Over the limit, a first payment to a new recipient, launching a coin, bridging, ETH, contracts not on the allowlist, unpriced calls | Full review and the passkey |
| Always passkey | Security changes: recovery, devices, the root key, raising the limit | The passkey; the session key cannot express these |
The daily limit is $25 by default, counted in USDC.e and adjustable per app from $0 to $250 by the user. The session key is a non-extractable P-256 key on the Gully ID origin, installed once with the passkey, valid for 7 days and limited to 100 operations per app per UTC day. On chain it is one Kernel v3.3 permission: CallPolicy (the allowlist, never the account itself), TimestampPolicy (expiry) and GullySessionPolicy 0xFDEB7b7715200dBc94A058BA1254b863c08D070E (the per-day spend and op caps), with signatures disabled so it can never sign ERC-1271 messages. Pricing fails closed: anything the wallet cannot price needs the passkey. Pass capabilities: { gully: { intent: 'tip' } } to wallet_sendCalls for the one-tap sheet wording. Users see their limits and today's spend, and revoke apps, in Gully ID under Me, Connected apps. eth_sign and eth_signTransaction are refused (a smart account has no raw key).
Full guide: gullyid.xyz/developers/wallet-sdk (opens in a new tab). Accounts, bundler and paymaster: Accounts and passkeys.