Назад към всички

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.

$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
namenear-intents
descriptionUniversal cross-chain swap & bridge skill for OpenClaw using the NEAR Intents 1Click SDK. Supports 14+ blockchains including NEAR, Base, Ethereum, Solana, and Bitcoin.

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