Cunhar a partir da sua página
Há duas formas de vender uma coleção do KURV a partir da sua própria página. As duas funcionam na Base e na Solana, e todas as taxas, preços e regras de venda on-chain continuam em vigor: o mesmo contrato ou programa recebe o mesmo pagamento.
| Pretende | Utilize |
|---|---|
| Colar uma linha e ter um botão de cunhar | O botão de cunhar: o comprador assina numa janela do KURV |
| Manter o comprador na sua página com o seu próprio conector de carteira | O 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.
O botão de cunhar
Secção “O botão de cunhar”<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 aí com a conta do KURV ou com uma carteira, e a sua página nunca toca numa carteira nem numa 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 cumprimenta primeiro a sua página, e o nome do site só aparece nela se a sua página responder a partir da própria origem. Depois corta a ligação à sua página, pelo que nada numa página consegue tocar numa janela que está a assinar. A resposta vem da origem do KURV, é reconhecida pelo valor aleatório que aquele toque gerou e segue apenas para a origem da sua página, e só então o script dispara kurv:mint no elemento:
status | Significa |
|---|---|
minted | A cunhagem foi concluída: chain, collection, tx, tokenIds, quantity. Pode seguir-se a closed quando um início de sessão demorou muito |
closed | Há algum tempo que não há sinal da janela, e não houve cunhagem. O KURV nunca diz o motivo |
blocked | O navegador recusou abrir uma janela. Peça ao comprador que a permita |
A sua página não fica a saber nada sobre um comprador que não cunha: nem a carteira, nem se consta de 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 a funcionar e a janela não mostra o nome do site. Utilize same-origin-allow-popups em alternativa. Convém tratar tx como uma alegação até que o servidor próprio a tenha lido na cadeia.
O cliente do KURV
Secção “O cliente do KURV”Um módulo ES sem dependências, com os tipos ao lado, em v1.d.ts. 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 entrega essas chamadas à 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, utilize uma carteira Wallet Standard. O KURV assina apenas pela conta da peça nova, e a carteira assina e paga como comprador. As taxas de rede e o aluguer 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 cumprir. Uma janela de venda com uma segunda moeda cobra também quote.additional_total_base_units nessa moeda, e a comissão de rede acresce a isto. Uma coleção vendida a preço crescente assina um pouco acima da cotação, para que uma cunhagem que chegue antes não faça falhar a do comprador.
O mesmo plano por HTTP, sem conta e sem chave:
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 | Significa | O que fazer |
|---|---|---|
not_on_allowlist | Esta janela de venda é para a sua lista de permissão | Informe o comprador |
not_open | A coleção não está à venda neste momento | Mostre a janela seguinte a partir do registo da coleção |
use_window | Um leilão ou uma janela posterior com uma segunda moeda | Abra error.window_url |
rate_limited | Demasiados pedidos a partir desta rede | Tente novamente daqui a pouco |
Uma página que funciona
Secção “Uma página que funciona”Guarde isto como um ficheiro em qualquer site https, ou sirva-o a partir da sua própria máquina, e carregue no botão. É necessária 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 por revelar continua selada em tudo isto: a API responde com chamadas e valores, nunca com os ficheiros de uma coleção selada. Consulte Riscos e aviso legal.
Nada do que aqui está constitui aconselhamento financeiro. Leia Riscos e aviso legal antes de cunhar, comprar ou vender ao Vault. Voltar a kurv.fun. Política de privacidade. Termos de utilização. .