Skip to main content
After creating intents, they must be signed before submission to the Verifier contract via the execute_intents function. The Verifier supports multiple signature standards to enable signing from NEAR, Ethereum, TRON, Solana, Stellar, TON, and passkey-based wallets.
Encoding Requirements for the Verifier Contract
CurvePublic KeySignature
Ed2551932 bytes64 bytes
Secp256k164 bytes (uncompressed)65 bytes (r || s || v)
P25664 bytes (uncompressed)64 bytes (r || s)
Important: Compressed public keys are not supported for ECDSA curves (Secp256k1, P256). Public keys must be in uncompressed format (raw 64-byte x || y coordinates without prefix bytes).Signatures must be in raw concatenated byte format, not DER-encoded.
Every public key registered to an account can sign intents on its behalf. See Account Abstraction for key management details.

Signature types

Different wallets use different signing standards. To allow users to sign with their existing wallet, the Verifier supports multiple verification methods — each corresponding to a specific wallet ecosystem (e.g., ERC-191 for MetaMask, Raw Ed25519 for Phantom). Each signed intent conforms to the MultiPayload enum.

NEP-413

The NEP-413 standard is an off-chain message signing standard recognized by NEAR wallets.
FieldDescription
standard"nep413".
payload.recipientContract address (e.g., intents.near). Prevents replay on other contracts.
payload.nonceBase64-encoded 256-bit nonce.
payload.messageSerialized JSON payload string containing signer_id, deadline, and intents.
public_keySigner’s public key. Encoded as key type prefix + base58 (e.g., ed25519:...).
signatureCryptographic signature. Encoded as key type prefix + base58.
{
  "standard": "nep413",
  "payload": {
    "recipient": "intents.near",
    "nonce": "Vij2xgAlKBKzgNPJFViEQRgYyS7p2NEiYTTY4XmT8go=",
    "message": "{\"deadline\":\"2025-05-21T10:34:04.254392Z\",\"intents\":[{\"intent\":\"transfer\",\"receiver_id\":\"bob.near\",\"tokens\":{\"nep141:usdc.near\":\"10\"}}],\"signer_id\":\"alice.near\"}"
  },
  "public_key": "ed25519:C3jXhkGhEx88Gj7XKtUziJKXEBMRaJ67bWFkxJikVxZ2",
  "signature": "ed25519:2ns3eCikZFxFA6e9ApunuDG4XwJUPrB8q82fYViBKjheqiDYcCmLN9RnB9NhoEvCdNoS3L3qYD9FAnKd7UkTnuij"
}

ERC-191

Compliant with the ERC-191 standard for off-chain message signing (Ethereum wallets like MetaMask).
FieldDescription
standard"erc191".
payloadSerialized JSON payload string. The signer_id is the Ethereum address.
signatureSecp256k1 signature. Encoded as key type prefix + base58 (e.g., secp256k1:...).
There is no public_key field because it can be recovered from the secp256k1 signature and data.
Ethereum clients shift the recovery byte (v) based on chain ID. The Verifier contract expects v ∈ {0, 1}, so clients must normalize the recovery byte before submission.
{
  "standard": "erc191",
  "payload": "{\"signer_id\":\"0xca67C1Bb3FD69857E5edaF6aA1c65371bF46A464\",\"verifying_contract\":\"intents.near\",\"deadline\":\"2025-05-26T13:24:16.983Z\",\"nonce\":\"Vij2xgAlKBKzwGNqwogWQxiy87p9jW5Omfg+L9bXBDw=\",\"intents\":[{\"intent\":\"token_diff\",\"diff\":{\"nep141:usdc.near\":\"-1000\",\"nep141:usdt.near\":\"1000\"}},{\"intent\":\"ft_withdraw\",\"token\":\"usdt.near\",\"receiver_id\":\"bob.near\",\"amount\":\"1000\"}]}",
  "signature": "secp256k1:BoR53NKKJ2GfP8bETk427Xav8VMpUcZovLzXeq2EsUD7NnPH2sSmxWFEkDUrguJHHkiu3GwEQxxMo2Rm2ZTDHFygU"
}

TIP-191

Compliant with TIP-191, TRON’s off-chain message signing standard. TIP-191 is fully compatible with ERC-191.
FieldDescription
standard"tip191".
payloadSerialized JSON payload string. The signer_id is the TRON address.
signatureSecp256k1 signature. Encoded as key type prefix + base58 (e.g., secp256k1:...).
Like ERC-191, there is no public_key field because it can be recovered from the secp256k1 signature and data. The same recovery byte normalization applies.

Raw Ed25519

Used by Phantom wallet for Solana off-chain message signing.
FieldDescription
standard"raw_ed25519".
payloadSerialized JSON payload string. Note: deadline uses a Unix timestamp instead of ISO 8601.
public_keySigner’s public key. Encoded as key type prefix + base58.
signatureEd25519 signature. Encoded as key type prefix + base58.
{
  "standard": "raw_ed25519",
  "payload": "{\"signer_id\":\"alice.near\",\"verifying_contract\":\"intents.near\",\"deadline\":{\"timestamp\":1732035219},\"nonce\":\"Vij2xgAlKBKzwGNqwogWQxi9ZuGDNBXlmdy9g3MQSMk=\",\"intents\":[{\"intent\":\"token_diff\",\"diff\":{\"nep141:usdc.near\":\"-1000\",\"nep141:usdt.near\":\"998\"}}]}",
  "public_key": "ed25519:9aqyNsCRrDkq9SceVRCdW1Zs9BmEP8ieJQRJim8iRLF",
  "signature": "ed25519:9RHRenkbYN6cfWXkou47sjAf1PuTc6nYM8amHADApfqio8dcMQu28cgfz6wkktBFoE8J7FsZ3rxifFdMdzTTJi6"
}

WebAuthn (Passkey)

For use with passkeys and the Web Authentication standard. The signature can use either Ed25519 or P256 (secp256r1).
FieldDescription
standard"webauthn".
payloadSerialized JSON payload string.
public_keySigner’s public key. Encoded as key type prefix (p256 or ed25519) + base58.
signatureCryptographic signature. Encoded as key type prefix (p256 or ed25519) + base58.
client_data_jsonWebAuthn client data JSON. Contains type, challenge (base64 URL-safe), and origin.
authenticator_dataAuthenticator assertion data. Encoded as base64, URL-safe.
{
  "standard": "webauthn",
  "payload": "{\"signer_id\":\"0x3602b546589a8fcafdce7fad64a46f91db0e4d50\",\"verifying_contract\":\"intents.near\",\"deadline\":\"2025-03-30T00:00:00Z\",\"nonce\":\"A3nsY1GMVjzyXL3mUzOOP3KT+5a0Ruy+QDNWPhchnxM=\",\"intents\":[{\"intent\":\"transfer\",\"receiver_id\":\"bob.near\",\"tokens\":{\"nep141:usdc.near\":\"1000\"}}]}",
  "public_key": "p256:2V8Np9vGqLiwVZ8qmMmpkxU7CTRqje4WtwFeLimSwuuyF1rddQK5fELiMgxUnYbVjbZHCNnGc6fAe4JeDcVxgj3Q",
  "signature": "p256:3KBMZ72BHUiVfE1ey5dpi3KgbXvSEf9kuxgBEax7qLBQtidZExxxjjQk1hTTGFRrPvUoEStfrjoFNVVW4Abar94W",
  "client_data_json": "{\"type\":\"webauthn.get\",\"challenge\":\"4cveZsIe6p-WaEcL-Lhtzt3SZuXbYsjDdlFhLNrSjjk\",\"origin\":\"https://defuse-widget-git-feat-passkeys-defuse-94bbc1b2.vercel.app\"}",
  "authenticator_data": "933cQogpBzE3RSAYSAkfWoNEcBd3X84PxE8iRrRVxMgdAAAAAA=="
}

TonConnect

Follows the standard for data signing on TON.
FieldDescription
addressTON wallet address.
domainDomain associated with the signing request.
timestampISO 8601 timestamp of the signing request.
payload.type"text".
payload.textSerialized JSON payload string containing signer_id, deadline, and intents.
public_keySigner’s public key. Encoded as key type prefix + base58.
signatureEd25519 signature. Encoded as key type prefix + base58.
{
  "address": "EXvSRnDlYHziOJRm1MqGLgQB3EN7319eZLYWVinpoPv7LkBd",
  "domain": "example.com",
  "timestamp": "2025-01-01T00:00:00Z",
  "payload": {
    "type": "text",
    "text": "{\"signer_id\":\"alice.near\",\"verifying_contract\":\"intent.near\",\"deadline\":\"2025-05-26T15:19:43.617898Z\",\"nonce\":\"ZnbiFf4tP4cn65XLuZ6T1H6/Vr3o6ucNftdx3pInLnc=\",\"intents\":[{\"intent\":\"ft_withdraw\",\"token\":\"usdc.near\",\"receiver_id\":\"bob.near\",\"amount\":\"1000\"}]}"
  },
  "public_key": "ed25519:G4HVCaJg9vZb2srcLoWxR9grQ3tGLNFMVrZBhTtBi4Q1",
  "signature": "ed25519:5cwYdTNeGy1mApo9RNor9hSXvcG6GbvVm6di6kuf4frnARtVWRpJoPtvFKHMbt7uDGDtgFfn6bPDFGPK5jamqBwC"
}

SEP-53

Compliant with SEP-53, Stellar’s standard for signing arbitrary messages using Stellar key pairs.
FieldDescription
standard"sep53".
payloadSerialized JSON payload string.
public_keySigner’s public key. Encoded as key type prefix + base58 (e.g., ed25519:...).
signatureEd25519 signature. Encoded as key type prefix + base58.

Adding more signature types

To support additional key or signature types, contact the NEAR Intents team via Telegram.