Минт с вашей страницы
Есть два способа продавать коллекцию KURV со своей страницы. Оба работают на Base и на Solana, и все комиссии, цены и правила продажи в сети по-прежнему действуют: тот же контракт или программа принимает тот же платёж.
| Вам нужно | Используйте |
|---|---|
| Вставить одну строку и получить кнопку минта | Кнопка минта: покупатель подписывает в окне KURV |
| Оставить покупателя на своей странице со своим коннектором кошелька | Клиент KURV: покупатель подписывает в своём кошельке |
Сеть задаётся значением 84532 (Base Sepolia) или solana:devnet (Solana Devnet). Адреса коллекций есть в Публичных API.
Кнопка минта
Заголовок раздела «Кнопка минта»<div id="mint" data-kurv-mint data-chain="84532" data-address="0x8354d02d8022f455db9acb235c6f6655c8adabd3"></div><script src="https://testnet.kurv.fun/sdk/mint-button/v1.js" async></script><script> document.getElementById('mint').addEventListener('kurv:mint', (event) => { if (event.detail.status === 'minted') console.log(event.detail.tx, event.detail.tokenIds); });</script>Нажатие открывает окно KURV. Покупатель подписывает там с помощью аккаунта KURV или кошелька, а ваша страница никогда не касается ни кошелька, ни ключа. Задайте data-label, data-background и data-color, чтобы использовать свои слова и цвета. Если ваш сайт отправляет Content-Security-Policy, разрешите https://testnet.kurv.fun в script-src.
Окно сначала здоровается с вашей страницей, и название сайта появляется в нём, только если страница отвечает со своего origin. Затем окно разрывает связь со страницей, так что ничто на странице не может коснуться окна, в котором идёт подпись. Ответ приходит от origin KURV, опознаётся по случайному значению, созданному тем нажатием, и уходит только на origin вашей страницы, а затем скрипт вызывает kurv:mint на элементе:
status | Значение |
|---|---|
minted | Минт завершён: chain, collection, tx, tokenIds, quantity. Может прийти после closed, если вход долго не завершался |
closed | Окно давно не подаёт признаков жизни, минта нет. KURV никогда не сообщает причину |
blocked | Браузер отказался открыть окно. Попросите покупателя разрешить его |
Ваша страница ничего не узнаёт о покупателе, который не делал минт: ни его кошелёк, ни входит ли он в список допуска. Эти ответы покупатель читает только на страницах KURV.
Сайт, отправляющий Cross-Origin-Opener-Policy: same-origin, не может ответить на приветствие: минт и ответ всё равно работают, а в окне не показывается название сайта. Используйте вместо этого same-origin-allow-popups. Считайте tx заявлением, пока ваш собственный сервер не прочитал его в блокчейне.
Клиент KURV
Заголовок раздела «Клиент KURV»Один ES-модуль без зависимостей, его типы лежат рядом, в v1.d.ts. Он запрашивает у Публичных API актуальную котировку и точные вызовы для этого покупателя, включая подтверждение допуска по списку, и передаёт их кошельку покупателя.
import { createKurvClient, eip1193Wallet } from 'https://testnet.kurv.fun/sdk/client/v1.js';
const kurv = createKurvClient();const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' });
const result = await kurv.mint({ chain: '84532', address: '0x8354d02d8022f455db9acb235c6f6655c8adabd3', wallet: eip1193Wallet(window.ethereum, account), quantity: 1, // Show the buyer the amounts, and answer false to sign nothing. review: (plan) => confirm(`Pay at most ${plan.quote.max_total_base_units} base units?`),});На Solana используйте кошелёк стандарта Wallet Standard. KURV подписывает только за аккаунт новой работы, а кошелёк подписывает и платит как покупатель. Комиссии сети и аренда аккаунта оплачиваются в SOL.
import { createKurvClient, walletStandardWallet } from 'https://testnet.kurv.fun/sdk/client/v1.js';
const kurv = createKurvClient();const result = await kurv.mint({ chain: 'solana:devnet', address: collectionAddress, wallet: walletStandardWallet(wallet, account, 'solana:devnet'),});Подойдёт любой коннектор: evmWallet и solanaWallet оборачивают ваш в несколько строк. Клиент никогда не видит ключа.
kurv.prepareMint({ chain, address, wallet, quantity }) возвращает план и ничего не подписывает, и этот план и есть котировка: quote.total_base_units сейчас и quote.max_total_base_units, максимум, который может быть списан с этого покупателя в монете коллекции и который обеспечивают контракт или программа. Окно продаж со второй монетой списывает ещё и quote.additional_total_base_units в этой монете, а комиссия сети идёт сверху. Коллекция с растущей ценой подписывается чуть выше котировки, чтобы чужой минт, прошедший раньше, не сорвал минт покупателя.
Тот же план по HTTP, без аккаунта и без ключа:
curl -X POST https://testnet.kurv.fun/api/v1/collections/84532/0x8354d02d8022f455db9acb235c6f6655c8adabd3/mint-call \ -H 'content-type: application/json' \ -d '{"wallet":"0xYourBuyer","quantity":1}'error.code | Значение | Что делать |
|---|---|---|
not_on_allowlist | Это окно продажи только для списка допуска | Сообщите покупателю |
not_open | Коллекция сейчас не продаётся | Покажите её следующее окно из записи коллекции |
use_window | Аукцион или более позднее окно со второй монетой | Откройте error.window_url |
rate_limited | Слишком много запросов из этой сети | Повторите чуть позже |
Рабочая страница
Заголовок раздела «Рабочая страница»Сохраните это как файл на любом сайте с https или запустите со своей машины и нажмите кнопку. Нужен браузерный кошелёк в Base Sepolia.
<!doctype html><meta charset="utf-8"><title>Mint</title><button id="mint">Mint</button><p id="said" role="status"></p><script type="module"> import { createKurvClient, eip1193Wallet } from 'https://testnet.kurv.fun/sdk/client/v1.js';
const kurv = createKurvClient(); const said = document.getElementById('said');
document.getElementById('mint').addEventListener('click', async () => { try { const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' }); const result = await kurv.mint({ chain: '84532', address: '0x8354d02d8022f455db9acb235c6f6655c8adabd3', wallet: eip1193Wallet(window.ethereum, account), review: (plan) => confirm(`Pay at most ${plan.quote.max_total_base_units} base units?`), }); said.textContent = result.status === 'minted' ? `Minted: ${result.tx}` : 'Nothing was signed.'; } catch (error) { said.textContent = error.message; } });</script>Нераскрытый арт во всём этом остаётся запечатанным: API отвечает вызовами и суммами, но никогда не файлами запечатанной коллекции. См. Риски и отказ от ответственности.
Ничто здесь не является финансовым советом. Прочитайте раздел «Риски и отказ от ответственности», прежде чем минтить, покупать или продавать обратно в Vault. Вернуться на kurv.fun. Политика конфиденциальности. Условия использования. .