콘텐츠로 이동
앱 열기

내 페이지에서 민팅하기

KURV 컬렉션을 내 페이지에서 판매하는 방법이 두 가지 있어요. 둘 다 Base와 Solana에서 작동하고, 온체인 수수료, 가격, 판매 규칙은 그대로 적용돼요. 같은 컨트랙트나 프로그램이 같은 결제를 받아요.

하고 싶은 일쓸 것
한 줄을 붙여 넣어 Mint 버튼 만들기Mint 버튼: 구매자가 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를 보낸다면 script-src에서 https://testnet.kurv.fun을 허용하세요.

창은 먼저 내 페이지에 인사를 건네요. 내 페이지가 자신의 오리진에서 답할 때만 창에 사이트 이름이 나타나요. 그다음 창은 내 페이지와의 연결을 끊어서, 페이지의 그 무엇도 서명 중인 창을 건드릴 수 없어요. 답은 KURV의 오리진에서 오고, 그 버튼 누름이 뽑은 임의의 값으로 확인되며, 내 페이지의 오리진에만 전달돼요. 그러면 스크립트가 요소에서 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는 내 서버가 체인에서 직접 읽어 확인하기 전까지는 주장일 뿐이라고 보세요.

의존성이 없는 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는 호출과 금액만 알려 주고, 봉인된 컬렉션의 파일은 절대 알려 주지 않아요. 리스크 및 면책 조항을 참고하세요.

이곳의 어떤 내용도 투자 조언이 아니에요. 민팅하거나 사거나 되팔기 전에 리스크 및 면책 조항 문서를 꼭 읽어 주세요. kurv.fun으로 돌아가기. 개인정보처리방침. 이용약관. .