카이카스로 트랜젝션 하는 방법 질문~

카이카스와 연동을 하여 트랜젝션을 사용해보려고 하는데 잘 안되네요 ㅠㅠ

caver-js 버전은 “^1.6.7” 입니다.

카이카스 문서는 아래 와 같습니다. 아래의 문서를 참고 하여 작업 중입니다.

const signedTransaction = await caver.klay.signTransaction({
  type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
  from: klaytn.selectedAddress,
  to: '0x1d389d91886fd0af55f44c56e1240eb6162ddff8',
  data:
    '0x6353586b0000000000000000000000001d389d91886fd0af55f44c56e1240eb6162ddff8',
  gas: '300000'
})
const senderRawTransaction = signedTransaction.rawTransaction

//register address for fee payment
caver.klay.accounts.wallet.add(feePayerPrivateKey, feePayerAddress)

caver.klay
  .sendTransaction({
    senderRawTransaction,
    feePayer: feePayerAddress
  })
  .once('transactionHash', transactionHash => {
    console.log('txHash', transactionHash)
  })
  .once('receipt', receipt => {
    console.log('receipt', receipt)
  })
  .once('error', error => {
    console.log('error', error)
  })

그리고 제가 작성한 코드는 아래와 같습니다.

const signedTransaction = await caver.klay.signTransaction({
  type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
  from: "로그인한 카이카스 address",
  to: '제가 생성한 바오밥에 배포한 컨트랙 address',
  data: myContract.methods.mintPALN('테스트', '2022-02-20', ipfsUrl).encodeABI(),
  gas: '300000'
})
const senderRawTransaction = signedTransaction.rawTransaction

// feepayer 계정은 컨트렉을 배포 할때 사용한 계정으로...
caver.klay.accounts.wallet.add(feePayerPrivateKey, feePayerAddress)

caver.klay
  .sendTransaction({
    senderRawTransaction,
    feePayer: feePayerAddress
  })
  .once('transactionHash', transactionHash => {
    console.log('txHash', transactionHash)
  })
  .once('receipt', receipt => {
    console.log('receipt', receipt)
  })
  .once('error', error => {
    console.log('error', error)
  })

이렇게 사용 하였는데…
에러가 나네요 ㅠ 제가 무엇을 잘못한걸까요? ㅠ

transactionHash: 0x7d1edccd39fa4d2ba2455c28cf4764aa0b39ce87b9c89fb57eaae17628023a7b

안녕하세요 @himmana :smiley:
혹시 어떤 에러가 나오는지 스크린샷이나 설명을 해주실 수 있으실까요? :thinking:

1 Like
error Error: evm: execution reverted
 {
  "blockHash": "0xec02014a67985275723ec1fa73206bfd89fa371ad08d894d7a0689430264d72e",
  "blockNumber": 83868520,
  "contractAddress": null,
  "feePayer": "0x644f20cb5785da666401ed559e446de6361223d1",
  "feePayerSignatures": [
    {
      "V": "0x7f5",
      "R": "0x1479ca2ef1aca60a18334dc1bb5bda075836538f6ff5734ee64bce2f04b4cf5b",
      "S": "0x1290017fed81248d718f47fdfef5a4887d85127461ffd18c9f0ed12794a2e031"
    }
  ],
  "from": "0xd95ed0ea9c8a18123c6fecf0e0728bf9116b3903",
  "gas": "0x493e0",
  "gasPrice": "0x5d21dba00",
  "gasUsed": 112643,
  "input": "0xcdc05bba000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000126b696d4070616c626f6b736f66742e636f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a323032322d30322d323000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a68747470733a2f2f697066732e696e667572612e696f2f697066732f516d65634b3376625144684336587a54655058454e6b664166684d6270393641464b4d32725841524a736b50347100000000000000000000000000000000000000000000",
  "logs": [],
  "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "nonce": "0x23",
  "senderTxHash": "0x734fa675d5a0a49bb5fb6cdc27f0bd63721a599281bcd6f4b0b2da184abc6ca7",
  "signatures": [
    {
      "V": "0x7f6",
      "R": "0x5961c6ea74ff4d1b7d9c47b685a1f7d3f07dae9449e46749ca5ffbf1cfc72fb3",
      "S": "0x18eee95b5e458e1636c225a716d1afca14ef785227784f0bc419084195e4b106"
    }
  ],
  "status": false,
  "to": "0xa7e56d3aa37a8ad81b84e007b7ece853c47a9ee1",
  "transactionHash": "0x4ff2459378dbc9b02b752075bf0d409d176dbeaad6ee0c202761204effdee677",
  "transactionIndex": 1,
  "txError": "0x9",
  "type": "TxTypeFeeDelegatedSmartContractExecution",
  "typeInt": 49,
  "value": "0x0"
}
    at checkForNormalTx (index.js?657b:765:1)
    at eval (index.js?657b:642:1)

이렇게 에러 메시지를 받았습니다~

실행하신 solidity 함수가 NFT 민팅하는 함수로 보이는데,
payable로 되어있는 것은 아닌가 생각합니다.

payable인 경우에는, 아래와 같이 Transaction option 에 전송할 klay의 value값이 나와있어야 합니다.

const signedTransaction = await caver.klay.signTransaction({
  type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
  from: "로그인한 카이카스 address",
  to: '제가 생성한 바오밥에 배포한 컨트랙 address',
  data: myContract.methods.mintPALN('테스트', '2022-02-20', ipfsUrl).encodeABI(),
  gas: '300000',
  value: "민팅 가격 (peb로 환산)" 
})

revert되는 이유가 다양하게 발생할 수 있기 때문에, 해당 케이스의 경우에는 constract의 해당 method solidity code를 함께 공유해주셔야 답변 드리기 용이할 것 같습니다.

감사합니다.

constract 코드 공유 드립니다. ㅠ;;

pragma solidity ^0.5.0;

import '@klaytn/contracts/token/KIP17/KIP17Token.sol';

contract PalbokToken is KIP17Token {

    constructor(string memory name, string memory symbol) KIP17Token(name, symbol) public {}

    struct PalbokTokenInfo {
        string author;
        string createDate;
    }

    mapping (uint256 => PalbokTokenInfo) palbokTokenInfo;

    // mint
    function mintPALN(
        string memory _author,
        string memory _createDate,
        string memory _tokenURI
    ) public {
        // address to, uint256 tokenId, string memory tokenURI
        uint256 _tokenId = totalSupply().add(1);

        // 토큰에 tokenURI 외 간단한 정보 저장
        setPalbokTokenEtcInfo(_tokenId, _author, _createDate);

        // 토큰 민팅
        mintWithTokenURI(msg.sender, _tokenId, _tokenURI);
    }

    // 토큰에 tokenURI 외 간단한 정보 저장
    function setPalbokTokenEtcInfo(
        uint256 tokenId,
        string memory author,
        string memory createDate
    ) internal {
        palbokTokenInfo[tokenId] = PalbokTokenInfo(author, createDate);
    }

    // 토큰 정보 보기
    function getPALN(uint256 tokenId) public view returns (string memory, string memory) {
        string memory _author = palbokTokenInfo[tokenId].author;
        string memory _createDate = palbokTokenInfo[tokenId].createDate;
        return (_author, _createDate);
    }
}

@himmana 해당 트랜잭션을 분석한 결과 gas limit 설정치보다 많은 gas fee가 나와서 revert된 것으로 보입니다.
gas: ‘500000’ 으로 올려서 실행해보세요.

해결 되셨으면 좋겠네요. 감사합니다.

그것두 아닌가봐요 ㅠ

혹시 caver 사용방법이 틀린걸까요?

import Caver from 'caver-js';

const caver = new Caver(window.klaytn);

이게 문제인 것은 아니겠죠?;;

Caver 정의 방식은 문제가 없어 보입니다.

아래 코드로 브라우저의 dev tool consol 에서 문제없이 transaction이 실행되었습니다.
가스비 말고는 별다른 변경사항은 없는데, 다시한번 확인 해보실수 있으실까요?

코드에 문제가 있는 경우에는 transaction 자체가 실행되지 않는걸 확인해서, 가스비 문제가 제일 컸던것 같습니다.

const myContract = new caver.contract(myContractABI, myContractAddress)
const ipfsUrl = "https://ipfs.infura.io/ipfs/QmecK3vbQDhC6XzTePXENkfAfhMbp96AFKM2rXARJskP4q"
const inputData = await myContract.methods.mintPALN('kim@palboksoft.com','2022-02-20',ipfsUrl).encodeABI()

const signedTransaction = await caver.klay.accounts.signTransaction({
      type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
      from: klaytn.selectedAddress,
      to: myContractAddress,
      data: inputData,
      gas: '500000'
})

const senderRawTransaction = signedTransaction.rawTransaction
    
// // feepayer 계정은 컨트렉을 배포 할때 사용한 계정으로...
caver.klay.accounts.wallet.add(feePayerPrivateKey, feePayerAddress)

caver.klay.sendTransaction({
    senderRawTransaction,
    feePayer: feePayerAddress
})
.once('transactionHash', transactionHash => {
    console.log('txHash', transactionHash)
})
.once('receipt', receipt => {
    console.log('receipt', receipt)
})

아래는 해당 성공한 트랜잭션입니다.
0xcf12ef40bbd8cfeca0e69ec9050456e4fdecba5c0e71a7d32e86d9e891b5f074

2 Likes

아! minter 계정으로 해야 되는건데 다른 계정을 이용해서 안됐던것 같습니다~
콜룩…
성심성의껏 봐주셔서 정말 감사합니다~

1 Like