클레이튼 + 커스텀 토큰(KIP7) transfer 문의

안녕하세요. KIP17 NFT를 클레이튼과 커스텀 토큰(KIP7)으로 Minting을 하려고 합니다.
현재 KIP17 컨트랙트에서 KIP7컨트랙트를 불러와 커스텀 함수로 transfer하고있습니다.
KIP7토큰은 토큰 발행 지갑으로 전송됩니다.

   function MintNFT(uint256 amount) external payable nonReentrant canSale(amount) {
        (bool success, ) = treasury.call.value(msg.value)("");

        require(success, "Fail to send value.");

        for (uint256 i=0; i<amount; i++) {
            _tokenId.increment();

            uint256 newTokenId = _tokenId.current();

            _mint(msg.sender, newTokenId);

            _setTokenURI(newTokenId, _tokenBaseURI);
        }
        
         // KIP7 컨트랙트의 함수입니다.
        transferFromNft(msg.sender, tokenOwnerAddress, amount);

        salesMintedQty += amount;
    }
// 프론트 코드 입니다
 const transactionInput = myContract.methods.mintNFT(totalCustomToken).encodeABI();
    
        caver.klay.sendTransaction({
            from: address,
            to: process.env.NFT_CONTRACT_ADDRESS,
            input: transactionInput,
            value: caver.utils.toPeb(`${totalKlay}`, 'KLAY'),
            gas: '8500000',
        })

이런식으로 구현하는게 맞을까요??

아니면 유저에게 먼저 approve를 받은 후에 token.transferFrom으로 토큰을 토큰 오너에게 전달해 줘야하나요?
이경우 트젝을 두번 해야하는데 고민입니다.

클레이로 구매하는 경우는 payable,

KIP7으로 구매하는 경우는 nonpayable 로.minting 함수를 구현하면 될것같습니다.

아니면 2가지 다 필요한 경우인가요?

민팅하고 전송을 프론트에서 따로한 경우 민팅트랜잭션은 revert 가 나더라도 토큰만 전송될수있기때문에 mint 함수에서 KIP7 를 transfer하도록 설계하시는게 좋을것같습니다.

감사합니다!
KIP17은 클레이와 KIP7 을 같이 사용하여 민팅하게 하려고 합니다.
개발은 KIP17컨트랙트의 민팅 함수안에 KIP7 컨트랙트를 불러와 transfer로 KIP7을 보내려고 합니다.
transfer를 호출 시 KIP17 컨트랙트의 msg.sender와 KIP7 컨트랙트의 msg.sender가 달라지는데 이 경우 KIP7 컨트랙트 쪽에서 msg.sender가 KIP17 컨트랙트일때만 transfer할 수 있는 함수를 만들어야 할까요?

그 경우에는, minting method 내에서 approve 를 이용해, NFT minting contract 가 발행자 주소의 custom KIP7의 allowance를 지불해야할 KIP7 수량만큼 진행하시고,

transferFrom을 통해 KIP7의 지갑이동을 구현하시면됩니다.

안녕하세요!


_approve(msg.sender, spender, value);

msg.sender의 토큰을 spender가 권한을 갖는건데
kip17 민팅함수내에서 kip7 approve를 호출시 kip17컨트랙트가 msg.sender가 되지않나요? 제가 잘못 이해한걸까요?

아 제대로 이해하신게 맞습니다. 제가 잠시 착각했네요. approve는 front 에서 NFT minting contract 주소를 spender로 진행하셔야 하고, minting method 내에서는 transferFrom 만 이용하시면 됩니다.

2 Likes

이해했습니다! 친절한 설명 감사드립니다!!