Aller au contenu
Ouvrir l’app

Minter depuis votre page

Il y a deux façons de vendre une collection KURV depuis votre propre page. Les deux fonctionnent sur Base et sur Solana, et chaque frais, prix et règle de vente on-chain s’applique toujours : le même contrat ou programme encaisse le même paiement.

Vous voulezUtilisez
Coller une ligne et obtenir un bouton MinterLe bouton Minter : l’acheteur signe dans une fenêtre KURV
Garder l’acheteur sur votre page avec votre propre connecteur de portefeuilleLe client KURV : l’acheteur signe dans son portefeuille

Désignez le réseau avec 84532 (Base Sepolia) ou solana:devnet (Solana Devnet). Les adresses des collections sont dans les API publiques.

<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>

Un appui ouvre une fenêtre KURV. L’acheteur y signe avec son compte KURV ou un portefeuille, et votre page ne touche jamais un portefeuille ni une clé. Définissez data-label, data-background et data-color pour vos propres mots et couleurs. Si votre site envoie une Content-Security-Policy, autorisez https://testnet.kurv.fun dans script-src.

La fenêtre commence par saluer votre page, et le nom du site n’y apparaît que si votre page répond depuis sa propre origine. Ensuite elle coupe son lien avec votre page, si bien que rien sur une page ne peut toucher une fenêtre en train de signer. La réponse vient de l’origine de KURV, se reconnaît à la valeur aléatoire tirée par cet appui et ne va qu’à l’origine de votre page, puis le script déclenche kurv:mint sur l’élément :

statusSignifie
mintedLe mint est terminé : chain, collection, tx, tokenIds, quantity. Il peut suivre closed quand une connexion a duré longtemps
closedPlus aucun signe de la fenêtre depuis un moment, et pas de mint. KURV ne dit jamais pourquoi
blockedLe navigateur a refusé d’ouvrir une fenêtre. Demandez à l’acheteur de l’autoriser

Votre page n’apprend rien d’un acheteur qui ne minte pas : ni son portefeuille, ni s’il figure sur une liste d’autorisation. Les pages de KURV sont le seul endroit où l’acheteur lit ces réponses.

Un site qui envoie Cross-Origin-Opener-Policy: same-origin ne peut pas répondre au salut : le mint et la réponse fonctionnent toujours, et la fenêtre n’affiche aucun nom de site. Utilisez plutôt same-origin-allow-popups. Traitez tx comme une simple déclaration tant que votre propre serveur ne l’a pas lue sur la chaîne.

Un module ES sans dépendances, avec ses types à côté, dans v1.d.ts. Il demande aux API publiques un devis à jour et les appels exacts pour cet acheteur, justificatif de la liste d’autorisation compris, et les remet au portefeuille de l’acheteur.

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?`),
});

Sur Solana, utilisez un portefeuille Wallet Standard. KURV ne signe que pour le compte de la nouvelle pièce, et le portefeuille signe et paie en tant qu’acheteur. Les frais de réseau et le loyer du compte sont en 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'),
});

N’importe quel connecteur convient : evmWallet et solanaWallet enveloppent le vôtre en quelques lignes. Le client ne voit jamais une clé.

kurv.prepareMint({ chain, address, wallet, quantity }) répond avec le plan et ne signe rien, et ce plan est le devis : quote.total_base_units maintenant, et quote.max_total_base_units, le plus que cet acheteur puisse se voir facturer dans le jeton de la collection, que le contrat ou le programme fait respecter. Une fenêtre de vente avec un second jeton facture aussi quote.additional_total_base_units dans ce jeton, et les frais de réseau s’y ajoutent. Une collection vendue à prix croissant signe un peu au-dessus du devis, pour qu’un mint arrivé avant ne fasse pas échouer celui de l’acheteur.

Le même plan en HTTP, sans compte et sans clé :

Fenêtre de terminal
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.codeSignifieQue faire
not_on_allowlistCette fenêtre de vente est réservée à sa liste d’autorisationDites-le à l’acheteur
not_openLa collection n’est pas en vente pour le momentAffichez sa prochaine fenêtre depuis la fiche de la collection
use_windowUne enchère ou une fenêtre ultérieure avec une seconde monnaieOuvrez error.window_url
rate_limitedTrop de requêtes depuis ce réseauRéessayez dans un instant

Enregistrez ceci comme fichier sur n’importe quel site https, ou servez-le depuis votre propre machine, puis appuyez sur le bouton. Il faut un portefeuille de navigateur sur 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>

L’art non révélé reste scellé dans tout cela : l’API répond avec des appels et des montants, jamais avec les fichiers d’une collection scellée. Voir Risques et avertissement.

Rien ici ne constitue un conseil financier. Lisez Risques et avertissement avant de minter, d’acheter ou de revendre au Vault. Retour à kurv.fun. Politique de confidentialité. Conditions d’utilisation. .