near-intents

Universal cross-chain swap & bridge skill for OpenClaw using the NEAR Intents 1Click SDK. Supports 14+ blockchains including NEAR, Base, Ethereum, Solana, and Bitcoin.

Safety Notice

This listing is from the official public ClawHub registry. Review SKILL.md and referenced scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "near-intents" with this command: npx skills add cuongdcdev/near-intents

NEAR Intents Skill — 1Click SDK

📋 TL;DR

What it does: Universal cross-chain swap & bridge tool powered by the 1Click API and the @defuse-protocol/one-click-sdk-typescript SDK.

Supported chains: NEAR, Base, Ethereum, Arbitrum, Solana, BSC, Gnosis, Starknet, Bitcoin, Dogecoin, Zcash, Litecoin.

How it works:

  1. Get a quote from the 1Click API → receive a deposit address
  2. Send tokens to the deposit address on the origin chain
  3. 1Click handles the swap/bridge automatically
  4. Tokens arrive at the recipient address on the destination chain

Key facts:

  • Minimum ~$0.10 USD per swap
  • NEAR account only required when the origin asset is on NEAR
  • No NEAR account needed for cross-chain swaps from other chains (e.g., Arb USDC → Sol USDC)
  • JWT authentication optional but avoids 0.2% fee → register at partners.near-intents.org

Core Concept

All swaps go through the 1Click API (https://1click.chaindefuser.com):

User Wallet ──► [Deposit to 1Click address] ──► Market Makers ──► Recipient on Destination Chain

There is no need to interact with intents.near directly — the 1Click API abstracts everything.


executeIntent() API

The single entry point exported by index.ts:

import { executeIntent } from './index';

const result = await executeIntent({
  assetIn: 'NEAR',           // Origin token (see Asset Naming below)
  assetOut: 'base:USDC',     // Destination token
  amount: '1.0',             // Human-readable amount
  recipient: '0x...',        // Destination address (optional if same-chain NEAR)
  mode: 'auto',              // 'auto' (default) or 'manual'
  swapType: 'EXACT_INPUT',   // 'EXACT_INPUT' (default) or 'EXACT_OUTPUT'
});

Parameters

ParameterTypeRequiredDescription
assetInstringOrigin asset symbol (e.g., 'NEAR', 'base:USDC', 'arb:ARB')
assetOutstringDestination asset symbol
amountstringHuman-readable amount (e.g., '1.0', '0.5')
recipientstringDestination address. Required for cross-chain. Defaults to NEAR account
refundAddressstring⚠️REQUIRED for non-NEAR origins. Address on origin chain for refunds if swap fails. CRITICAL for fund safety!
modestring'auto' sends deposit automatically from NEAR account. 'manual' returns quote + deposit address for user to send manually
swapTypestring'EXACT_INPUT' (amount = input), 'EXACT_OUTPUT' (amount = desired output)

⚠️ CRITICAL: Refund Address Safety

When assetIn is on a non-NEAR chain (e.g., 'base:USDC', 'arb:ARB', 'btc:BTC'):

  1. refundAddress is REQUIRED — the function will throw an error if missing
  2. ALWAYS ask the user for their wallet address on the origin chain
  3. NEVER assume or guess — using the wrong address = permanent fund loss
  4. Explain to the user: "If the swap fails, your tokens will be refunded to this address"

Example:

// ❌ WRONG - Missing refundAddress for non-NEAR origin
await executeIntent({
  assetIn: 'base:USDC',  // Base origin
  assetOut: 'NEAR',
  amount: '0.5',
  recipient: 'user.near',
  mode: 'manual'
});
// → Error: Cross-chain swap from base:USDC requires refundAddress parameter

// ✅ CORRECT - User's Base wallet address provided
await executeIntent({
  assetIn: 'base:USDC',
  assetOut: 'NEAR',
  amount: '0.5',
  recipient: 'user.near',
  refundAddress: '0x123...',  // User's Base address
  mode: 'manual'
});

Why this matters:

  • Swaps can fail due to market conditions, liquidity issues, or timing
  • Failed swaps trigger automatic refunds to refundAddress on the origin chain
  • If refundAddress is wrong or belongs to someone else, funds are permanently lost

Returns

  • Auto mode: "Swap Successful! 1.0 NEAR → 0.97 USDC\nTransaction: https://nearblocks.io/txns/...\nExplorer: https://explorer.near-intents.org/transactions/..."
  • Manual mode: Formatted instructions with deposit address, amounts, tracking URL, and deadline

Asset Naming

Use chain:SYMBOL format. Omit chain prefix for NEAR-native tokens.

ChainPrefixExamples
NEAR(none)NEAR, USDC, USDT, wNEAR
Basebase:base:USDC
Ethereumeth:eth:ETH, eth:USDC
Arbitrumarb:arb:USDC, arb:ARB
Solanasol:sol:SOL, sol:USDC
BSCbsc:bsc:USDC
Bitcoinbtc:btc:BTC (native only)
Dogecoindoge:doge:DOGE (native only)
Zcashzec:zec:ZEC (native only)
Litecoinltc:ltc:LTC (native only)
  • Case-insensitive: near, NEAR, Near all work
  • UTXO chains (BTC, DOGE, ZEC, LTC): native tokens only — no wrapped/ERC-20 equivalents

Modes

Auto Mode (default)

Automatically sends the deposit from the configured NEAR account.

Use when: Origin asset is on NEAR and agent has NEAR credentials in .env.

await executeIntent({
  assetIn: 'NEAR',
  assetOut: 'base:USDC',
  amount: '1.0',
  recipient: '0xYourBaseAddress',
});

Manual Mode

Returns a quote with deposit address — the user (or agent) sends tokens separately.

Use when: Origin is on a non-NEAR chain, or you want to show the user a quote first.

const quote = await executeIntent({
  assetIn: 'arb:USDC',
  assetOut: 'sol:USDC',
  amount: '5.0',
  recipient: 'YourSolanaAddress',
  mode: 'manual',
});
// Returns deposit address + instructions

EXACT_OUTPUT

Specify the desired output amount; the 1Click API tells you how much to send.

const quote = await executeIntent({
  assetIn: 'USDT',
  assetOut: 'base:USDC',
  amount: '10.0',          // Want exactly 10 USDC out
  recipient: '0x...',
  mode: 'manual',
  swapType: 'EXACT_OUTPUT',
});

Examples

1. Swap NEAR → USDC on Base (Auto)

await executeIntent({
  assetIn: 'NEAR',
  assetOut: 'base:USDC',
  amount: '1.0',
  recipient: '0xYourBaseAddress',
});

2. Bridge USDC from Arbitrum → Solana (Manual)

const quote = await executeIntent({
  assetIn: 'arb:USDC',
  assetOut: 'sol:USDC',
  amount: '5.0',
  recipient: 'YourSolanaAddress',
  refundAddress: '0xYourArbitrumAddress',  // REQUIRED for refunds
  mode: 'manual',
});
// User sends 5 USDC to the deposit address on Arbitrum

3. Swap NEAR → USDC (same chain)

await executeIntent({
  assetIn: 'NEAR',
  assetOut: 'USDC',
  amount: '2.0',
});

4. Get a quote: How much NEAR for 10 USDC on Arbitrum?

const quote = await executeIntent({
  assetIn: 'NEAR',
  assetOut: 'arb:USDC',
  amount: '10.0',
  recipient: '0xYourArbAddress',
  mode: 'manual',
  swapType: 'EXACT_OUTPUT',
});

5. Send BTC to NEAR address

const quote = await executeIntent({
  assetIn: 'btc:BTC',
  assetOut: 'NEAR',
  amount: '0.01',
  recipient: 'yourname.near',
  refundAddress: 'bc1q...',  // REQUIRED - Your Bitcoin address
  mode: 'manual',
});
// User sends 0.01 BTC to the deposit address on Bitcoin

Configuration

.env file (only needed for auto mode with NEAR origin):

NEAR_ACCOUNT_ID=your-account.near
NEAR_PRIVATE_KEY=ed25519:your_private_key_here
NEAR_RPC_URL=https://rpc.mainnet.fastnear.com
NEAR_NETWORK_ID=mainnet
ONE_CLICK_JWT=optional_jwt_token
  • ONE_CLICK_JWT: Register at partners.near-intents.org to avoid the 0.2% fee.
  • Skip .env entirely if only using manual mode for non-NEAR-origin swaps.

⚠️ Never commit .env to version control!


Under the Hood — 1Click SDK Flow

executeIntent()
  │
  ├─ 1. resolveToken(assetIn)  →  { symbol, decimals, assetId }
  ├─ 2. resolveToken(assetOut) →  { symbol, decimals, assetId }
  ├─ 3. toSmallestUnit(amount, decimals)
  │
  ├─ 4. OneClickService.getQuote({
  │       originAsset, destinationAsset, amount,
  │       refundTo, recipient, deadline, ...
  │    })
  │    → Returns { depositAddress, amountIn, amountOut }
  │
  ├─ [manual mode] → return quote instructions
  │
  ├─ 5. account.transfer() → send deposit to depositAddress
  ├─ 6. OneClickService.submitDepositTx() → (optional, speeds up)
  └─ 7. OneClickService.getExecutionStatus() → poll until SUCCESS

Swap Statuses

StatusMeaning
PENDING_DEPOSITWaiting for deposit
PROCESSINGDeposit detected, market makers executing
SUCCESSTokens delivered to recipient
INCOMPLETE_DEPOSITDeposit below required amount
REFUNDEDSwap failed, tokens returned to refund address
FAILEDSwap failed due to error

Token Map (built-in)

The code includes a static TOKEN_MAP for common tokens:

KeyAsset ID (NEP-141)Decimals
NEARnep141:wrap.near24
USDCnep141:17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a16
USDTnep141:usdt.tether-token.near6
base:USDCnep141:base-0x833589fcd6edb6e08f4c7c32d4f71b54bda02913.omft.near6
arb:USDCnep141:arb-0xaf88d065e77c8cc2239327c5edb3a432268e5831.omft.near6
arb:ARBnep141:arb-0x912ce59144191c1204e64559fe8253a0e49e6548.omft.near18
eth:ETHnep141:eth.omft.near18
eth:USDCnep141:eth-0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.omft.near6
sol:SOLnep141:sol.omft.near9
sol:USDCnep141:sol-5ce3bf3a31af18be40ba30f721101b4341690186.omft.near6

To add more tokens: use OneClickService.getTokens() or check TOKENS.md.


Decimals Quick Reference

TokenDecimals"1.0" → smallest unit
NEAR241000000000000000000000000
USDC61000000
USDT61000000
ETH181000000000000000000
SOL91000000000
BTC8100000000

Decimal conversion is handled automatically by index.ts using decimal.js.


Tracking & Explorer

  • NEAR transactions: https://nearblocks.io/txns/<txHash>
  • 1Click swap status: https://explorer.near-intents.org/transactions/<depositAddress>

Troubleshooting

ErrorSolution
Token not found: XCheck symbol and chain prefix. See TOKEN_MAP or TOKENS.md
No deposit address in quote responseSolver couldn't match the pair/amount. Try a different amount or pair
NEAR_ACCOUNT_ID and NEAR_PRIVATE_KEY must be setConfigure .env or use mode: 'manual'
Swap failed with status: REFUNDEDTokens returned to refund address. Retry with different amount
Status polling timed outCheck explorer URL manually. Swap may still complete
401 Authentication errorJWT is invalid or expired. Register at partners.near-intents.org

Dependencies

{
  "@defuse-protocol/one-click-sdk-typescript": "0.1.1",
  "@near-js/accounts": "^2.2.4",
  "@near-js/crypto": "^2.2.4",
  "@near-js/providers": "^2.2.4",
  "@near-js/signers": "^2.2.4",
  "@near-js/tokens": "^2.2.4",
  "decimal.js": "^10.4.3",
  "dotenv": "^16.3.1"
}

Files Overview

FilePurpose
index.tsMain entry — exports executeIntent()
lib-1click/Step-by-step 1Click SDK examples (get tokens, get quote, send deposit, etc.)
SKILL.mdThis file — primary AI agent reference
AI-AGENT-GUIDE.mdDetailed agent workflow guide
TOKENS.mdFull token reference with decimals and asset IDs
manifest.jsonSkill manifest for OpenClaw
README.mdProject documentation
USAGE_GUIDE.mdUsage patterns and troubleshooting

Version

v2.0.0 — Powered by 1Click SDK and NEAR Intents

License

MIT

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Web3

Nansen Trading

Execute DEX swaps on Solana or Base, including cross-chain bridges. Use when buying or selling a token, getting a swap quote, or executing a trade.

Registry SourceRecently Updated
Web3

Cruzl Sentinel Core

Optimizes onchain activity by scoring ecosystems, generating tailored strategies, and suggesting behavior to avoid bot-like patterns across multiple platforms.

Registry SourceRecently Updated
Web3

Polymarket Aionmarket Trader

Place Polymarket trades through Aionmarket. Use when the user wants to search prediction markets, register wallet credentials, verify a wallet, or submit a P...

Registry SourceRecently Updated
310Profile unavailable
Web3

Power Automate Build

Build, scaffold, and deploy Power Automate cloud flows using the FlowStudio MCP server. Your agent constructs flow definitions, wires connections, deploys, a...

Registry SourceRecently Updated
3790Profile unavailable