Pular para o conteúdo
Abrir o app

Cunhe pela sua página

Há dois jeitos de vender uma coleção do KURV a partir da sua própria página. Os dois funcionam na Base e na Solana, e toda taxa, preço e regra de venda on-chain continua valendo: o mesmo contrato ou programa recebe o mesmo pagamento.

Você querUse
Colar uma linha e ter um botão de cunharO botão de cunhar: o comprador assina em uma janela do KURV
Manter o comprador na sua página com o seu próprio conector de carteiraO cliente do KURV: o comprador assina na própria carteira

Indique a rede com 84532 (Base Sepolia) ou solana:devnet (Solana Devnet). Os endereços das coleções estão nas APIs públicas.

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

Um toque abre uma janela do KURV. O comprador assina ali com a conta do KURV ou com uma carteira, e a sua página nunca toca em uma carteira nem em uma chave. Defina data-label, data-background e data-color para usar as suas próprias palavras e cores. Se o seu site envia uma Content-Security-Policy, permita https://testnet.kurv.fun em script-src.

A janela primeiro cumprimenta a sua página, e o nome do site só aparece nela se a sua página responder da própria origem. Depois ela corta o vínculo com a sua página, de modo que nada em uma página consegue tocar uma janela que está assinando. A resposta vem da origem do KURV, é reconhecida pelo valor aleatório que aquele toque gerou e vai só para a origem da sua página, e então o script dispara kurv:mint no elemento:

statusSignifica
mintedA cunhagem foi concluída: chain, collection, tx, tokenIds, quantity. Pode vir depois de closed quando um login demorou muito
closedFaz um tempo que não há sinal da janela, e não houve cunhagem. O KURV nunca diz o motivo
blockedO navegador se recusou a abrir uma janela. Peça ao comprador que a permita

Sua página não fica sabendo nada de um comprador que não cunha: nem a carteira dele, nem se está em uma lista de permissão. As páginas do KURV são o único lugar onde o comprador lê essas respostas.

Um site que envia Cross-Origin-Opener-Policy: same-origin não consegue responder ao cumprimento: a cunhagem e a resposta continuam funcionando, e a janela não mostra o nome do site. Use same-origin-allow-popups no lugar. Trate tx como uma alegação até que o seu próprio servidor a tenha lido na cadeia.

Um módulo ES sem dependências, com os tipos ao lado, em v1.d.ts. Ele pede às APIs públicas uma cotação atualizada e as chamadas exatas para este comprador, com a comprovação da lista de permissão incluída, e as entrega à carteira do comprador.

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

Na Solana, use uma carteira Wallet Standard. O KURV assina só pela conta da peça nova, e a carteira assina e paga como comprador. As taxas de rede e o aluguel da conta são em 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'),
});

Qualquer conector serve: evmWallet e solanaWallet envolvem o seu em poucas linhas. O cliente nunca vê uma chave.

kurv.prepareMint({ chain, address, wallet, quantity }) responde com o plano e não assina nada, e esse plano é a cotação: quote.total_base_units agora e quote.max_total_base_units, o máximo que este comprador pode pagar na moeda da coleção, que o contrato ou o programa faz valer. Uma janela de venda com uma segunda moeda cobra também quote.additional_total_base_units nessa moeda, e a taxa de rede vem por cima. Uma coleção vendida com preço crescente assina um pouco acima da cotação, para que uma cunhagem que chegue antes não faça a do comprador falhar.

O mesmo plano por HTTP, sem conta e sem chave:

Janela do 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.codeSignificaO que fazer
not_on_allowlistEsta janela de venda é para a sua lista de permissãoAvise o comprador
not_openA coleção não está à venda agoraMostre a próxima janela dela a partir do registro da coleção
use_windowUm leilão ou uma janela posterior com uma segunda moedaAbra error.window_url
rate_limitedMuitas solicitações desta redeTente de novo daqui a pouco

Salve isto como um arquivo em qualquer site https, ou sirva a partir da sua própria máquina, e toque no botão. É preciso ter uma carteira de navegador na 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>

A arte ainda não revelada continua selada em tudo isso: a API responde com chamadas e valores, nunca com os arquivos de uma coleção selada. Veja Riscos e isenção de responsabilidade.

Nada aqui é recomendação financeira. Leia Riscos e aviso legal antes de cunhar, comprar ou vender ao Vault. Voltar para kurv.fun. Política de privacidade. Termos de uso. .