Embed the SyncWallet swap widget into your app with three lines of code. Every swap your users make generates 0.5% for you — paid manually by SyncHold, no contract needed.
The total swap fee is 1%. When a user swaps through your integration, 0.5% is attributed to your wallet on our dashboard. SyncHold collects the full 1% on-chain and transfers your share manually — weekly or by threshold, your choice.
No smart contract to deploy. No trust assumptions. You earn, we track, we pay.
| Category | Rate | Amount |
|---|---|---|
| Total fee collected | 1.0% | $100.00 |
| Your partner earnings | 0.5% | $50.00 |
| SyncHold keeps | 0.5% | $50.00 |
SyncWallet already charges a 1% swap fee. The partner split happens inside that existing fee — your users pay the same regardless of whether they swap through your app or directly.
The widget SDK is a plain JavaScript file — no npm, no bundler required, though both work. For deeper integrations (balances, swap quotes, World ID verification) use @synchold/worldchain-sdk, our npm package. Same app key, either way.
<!-- 1. Load the SDK --> <script src="https://synchold.org/sdk/synchold-swap-sdk.js?v=1.2.0"></script> <!-- 2. Initialise with your app key --> <script> SyncHoldSwap.init("sk_your_app_key_here"); </script> <!-- 3. Open the swap widget from any button --> <button onclick="SyncHoldSwap.open({ tokenIn: 'WLD', tokenOut: 'USDC' })"> Swap with SyncHold </button>
import { useEffect } from 'react' export function SwapButton() { useEffect(() => { const s = document.createElement('script') s.src = 'https://synchold.org/sdk/synchold-swap-sdk.js?v=1.2.0' s.onload = () => window.SyncHoldSwap.init("sk_your_app_key_here") document.head.appendChild(s) }, []) return ( <button onClick={() => window.SyncHoldSwap?.open({ tokenIn: 'WLD' })}> Swap with SyncHold </button> ) }
<template> <button @click="openSwap">Swap with SyncHold</button> </template> <script setup> import { onMounted } from 'vue' onMounted(() => { const s = document.createElement('script') s.src = 'https://synchold.org/sdk/synchold-swap-sdk.js?v=1.2.0' s.onload = () => window.SyncHoldSwap.init("sk_your_app_key_here") document.head.appendChild(s) }) const openSwap = () => window.SyncHoldSwap?.open({ tokenIn: 'WLD' }) </script>
// Load SDK dynamically const script = document.createElement('script') script.src = 'https://synchold.org/sdk/synchold-swap-sdk.js?v=1.2.0' script.onload = () => { SyncHoldSwap.init('sk_your_app_key_here') } document.head.appendChild(script) // Open from any event document.getElementById('swap-btn').addEventListener('click', () => { SyncHoldSwap.open({ tokenIn: 'WLD', tokenOut: 'USDC', onSuccess: (result) => console.log('Swap done', result), onClose: () => console.log('Widget closed'), }) })
// npm install @synchold/worldchain-sdk viem import { SyncHoldClient, TokenProvider, SwapProvider, VerifyProvider, TOKENS } from '@synchold/worldchain-sdk' const client = new SyncHoldClient({ appKey: 'sk_your_app_key_here' }) // Balances const tokens = new TokenProvider(client) const balance = await tokens.balanceOf(TOKENS.WLD.address, '0xUserWallet') // Swap quotes (direct V2/V3 pools on World Chain) const swap = new SwapProvider(client) const quote = await swap.quote(TOKENS.WLD.address, TOKENS.USDC.address, 10n ** 18n) // World ID human verification — server-mediated, requires appKey const verify = new VerifyProvider(client) const result = await verify.verify('my-action', idkitProofResult) if (result.ok) console.log('verified, nullifier:', result.nullifierHash)
Call once after the SDK loads. Pass your sk_… app key. This links every subsequent swap to your account so fees are attributed correctly.
Throws a console warning if the key format is invalid — no silent failures.
init() preloads the wallet in a hidden iframe by default, so open() shows it instantly — no spinner. Pass { autoOpen: true } to pop the wallet modal automatically as soon as it's ready, with zero clicks.
SyncHoldSwap.init("sk_...", { autoOpen: true }) — disable with { preload: false } if you'd rather trigger it yourself later.
The embedded wallet is the real SyncWallet app — same UI, all tokens. But World App's connect APIs aren't reachable from inside a nested iframe, so by default it shows its own "Connect" screen first.
If your app already knows the user's World App wallet address, pass it via { walletAddress: "0x..." } in init() or open() — the widget skips straight to the full token list with real balances.
Opens the swap sheet. Optional: tokenIn, tokenOut, amount to pre-fill the form. Callbacks: onSuccess(result) and onClose().
The widget is a full-screen slide-up overlay rendered inside an iframe.
Every swap posted with your appKey is recorded in your partner account. The 0.5% fee is computed automatically on each swap's USD value and added to your pending balance.
View live at synchold.org/sdk — no login, just your app key.
SyncHold reviews partner balances and sends the accumulated 0.5% to your registered wallet. Payments are made in WLD or USDC on WorldChain — your choice at time of payment.
Minimum payout threshold: $10. Contact [email protected] to request early payout.
Check that a user is a real, unique person before granting access to your app — proof-of-personhood via World ID, the same verification SyncWallet uses for its own airdrops and mint gating.
Runs through POST /api/sdk/verify — your app key is validated server-side, then the proof is proxied to World ID's cloud verify. Each nullifier can only be used once.
Structured the same way as @holdstation/worldchain-sdk: a SyncHoldClient plus focused providers — TokenProvider for balances, SwapProvider for on-chain quotes, VerifyProvider for World ID.
npm install @synchold/worldchain-sdk viem — TypeScript types included, built on viem.
Register your app and get your sk_… key instantly. Paste it into the SDK, deploy, and every swap your users make starts generating revenue for you.
Your registered wallet is where we send your share. Make sure it's a WorldChain-compatible address you control.
Three lines of code. No contract. No custody. Just revenue.