Skip to main content

Blinks on Sui

Which controls must a Sui transaction link expose before a person can inspect, approve, and execute it safely?

A blink is a URL that encodes a Programmable Transaction Block (PTB). Share it anywhere a link can go — social post, email, QR code, physical tag. The recipient clicks, sees a transaction modal, approves, and the transaction executes. No app download. No separate wallet setup beyond the initial one-time step.

The Solana Origin

Solana introduced this pattern as Actions and Blinks in 2024. A blink URL resolves to a JSON spec describing the transaction. Wallets parse the spec and render a standard UI. The transaction executes without the user navigating to a dApp.

The key insight: if every link can carry a transaction, then every platform that carries links becomes a transaction surface. X posts, Discord messages, Telegram links — all become points of financial interaction.

Sui Equivalent

Sui's PTB model maps directly to this pattern:

ConceptSolanaSui
Transaction encodingAction JSON specPTB params in URL or QR
AtomicityTransactionPTB (up to 1,024 ops, ~390ms)
Wallet renderBlink UI (wallet extension)dApp Kit transaction modal
SponsorshipRelayer (optional)Sponsored tx (native)
OnboardingExisting wallet requiredzkLogin — OAuth → address

Sui's advantage: sponsored transactions mean the platform pays gas, and zkLogin means users don't need a pre-funded wallet. A new user can click a blink, sign in with Google, and execute a transaction in a single flow.

How It Works

1. Encode PTB as URL parameters
?module=link&fn=createLink&creator=0xABC&platform=p1&reward=100

2. User clicks link (social, email, QR code, NFC tag)

3. dApp Kit renders transaction modal
Shows: what the transaction does, gas cost, expected result

4. User approves
With existing wallet OR via zkLogin (OAuth flow)

5. PTB executes on-chain (~390ms)
Events emitted. State updated. Attribution recorded.

The user never visits a dApp directly. The transaction comes to them.

The intersection that makes this architecturally significant: a blink URL IS an attribution event.

When the link module creates a link object, it records the genealogy — who created it, who shared it, which platform carried it. Every blink share is a link creation. Every blink click is a potential conversion event. The collision module scores quality to prevent spam.

Creator mints content → generates blink URL
Sharer posts URL → link object created on-chain
Buyer clicks → transaction executes
Attribution automatically recorded → revenue splits run

No centralized affiliate platform. No cookie tracking. Purely on-chain attribution from the moment the URL is shared.

PTB Construction

// Encode blink action
const blinksUrl = new URL(`${APP_BASE}/action`);
blinksUrl.searchParams.set("module", "link");
blinksUrl.searchParams.set("fn", "createLink");
blinksUrl.searchParams.set("creator", creatorAddress);
blinksUrl.searchParams.set("platform", platformId);
blinksUrl.searchParams.set("reward", rewardAmount.toString());

// On click — decode and construct PTB
const tx = new Transaction();
tx.moveCall({
target: `${LINK_PKG}::link::create_link`,
arguments: [tx.object(platformId), tx.pure.address(creatorAddress), tx.pure.u64(rewardAmount)],
});

// Platform sponsors gas — user never holds SUI
const { digest } = await sponsoredExecute(tx, userAddress);

Use Cases

Use caseWhat the blink encodesWhat executes
Content attributionlink::createLinkRecords referral, sets reward
Prediction betprediction_game::placeBetStakes tokens, records position
NFT purchasekiosk::purchaseTransfers object, pays creator royalty
Device registrationdevice_registry::registerMints device identity object
Loyalty redemptionloyalty::redeemBurns points, delivers reward

Physical Tags

Blinks extend to physical space. A QR code is a blink. An NFC tag is a blink. A product label, a venue entrance, a machine — any surface that can carry a URL can carry a transaction.

Physical DePIN applications: a device scans a QR code to register on-chain, an installer taps an NFC tag to provision a sensor, a farmer scans a field marker to log an observation. The device_registry module's state machine transitions map directly to blink-triggered events.

Limits, checks, and failure modes

  • A URL transport does not prove consent, beneficiary value, correct attribution, or a legitimate standard decision.
  • Reject a blink when the recipient cannot inspect the exact transaction, signer, object permissions, sponsor, expected state change, and failure path.
  • Treat replay, link substitution, stale object state, malicious sponsorship, wallet rendering differences, and inaccessible approval flows as design failures.
  • Keep participant refusal and stop authority outside token ownership or transaction success.

Proof of done

The concept is ready for a bounded implementation test when a cold participant can inspect, refuse, or execute one PTB from the link; reconstruct the resulting state and attribution receipt; and distinguish transaction completion from the later beneficiary outcome.

Context

Questions

Changes my mind: a bounded test shows that the blink transport cannot preserve inspectable consent, safe refusal, correct state transition, and reconstructable receipts across supported wallets.

Next question: Which single PTB is valuable enough to test without treating transaction completion as outcome proof?

If every link on the internet became a potential transaction entry point — what does that do to the incentive structure of sharing?

  • What stops blink spam when anyone can create attribution links?
  • If the link IS the contract, who owns the relationship — the creator, the sharer, or the platform?
  • At what point does on-chain attribution become more trusted than first-party analytics?