메인넷에서 트랜잭션이 안 됩니다

바오밥 테스트넷에서 잘 되던 트랜잭션 코드가 안 되서
사이프러스 메인넷에서 민팅하는 코드를 디버깅하고 있습니다.

예제로 참고한 소스는 다음과 같습니다.

제 소스 코드의 원문을 보여드리겠습니다.

const caver = new Caver(new Caver.providers.HttpProvider(rpcUrl, option));
var contract = caver.contract.create(abi, contract_addr)

const receipt2 = await contract.methods.publicMint(1).send({
from: account,
to: contract_addr,
value: caver.utils.toPeb(1, ‘KLAY’) * sendKlayValue,
gas: 1000000
});
console.log(receipt2)

const receipt2 = await contract.methods.publicMint(1).send({

이 코드가 문제인 것 같아서 아래의 다양한 방법으로 시도하고 있으나 디버깅이 쉽지 않습니다.

const receipt2 = await contract.methods.publicMint(1).send({
const receipt2 = await contract.methods.publicMint(‘1’).send({
const receipt2 = await contract.methods.publicMint(‘0x1’).send({

const valueToBN = caver.utils.toBN(1);
const receipt2 = await contract.methods.publicMint(valueToBN).send({

아래는 구글 크롬에서 나온 에러 내용입니다.
분명 형변환과 관련 있는 것 같은데 왜 안 되는지 모르겠습니다.

Unhandled Rejection (Error): Number can only safely store up to 53 bits: Number type cannot handle big number. Please use hex string or BigNumber/BN.

:arrow_forward: 5 stack frames were collapsed.

mintEvent

 218 | const caver = new Caver(new Caver.providers.HttpProvider(rpcUrl, option));  
219 | var contract = caver.contract.create(abi, contract_addr)  
220 | > 
221 | const receipt2 = await contract.methods.publicMint('0x1').send({       
222 |   from: account,  
223 |   to: contract_addr,  
224 |   value: caver.utils.toPeb(1, 'KLAY') * sendKlayValue,

아래는 제가 호출한 solidity 코드입니다

//Public Mint
function publicMint(uint256 requestedCount) external payable {

  for(uint256 i = 0; i < requestedCount; i++) {
    _mint(msg.sender, _mintIndexForSale);
    _mintIndexForSale = _mintIndexForSale.add(1);
  }

}

제 추측이 잘못된 것일까요?
어떤 점이 문제인지 모르겠습니다.

약간의 힌트라도 좋으니 댓글 간곡하게 부탁드립니다.
이 문제로 벌써 반나절을 보낸 것 같습니다.
요번에 프론트엔드 개발을 처음해서 그런지 너무 어렵네요 ㅜㅜ

긴 글 읽어주셔서 감사합니다.
좋은 주말 되세요!!

send의 tx option에있는 value 값 (클레이 지출)쪽이 문제일가능성이있습니다.

Klay 변환툴 쓰시기전에 값 먼저 곱하시고, 그다음에 변환해보시고 확인 해보시겠어요?

사실 1을 쓰지않고 그냥 caver.utils.toPeb(sendKlayValue, ‘KLAY’)

쪽이 나아보입니다

답변 감사합니다!!
저도 혹시 그런 것인가 싶어서 코드를 변경했더니
해결된 것 같긴한데…
이번에는 다른 에러가 추가 되었습니다.
ㅜㅜ 관련 에러 한 번 봐주실 수 있나요?

      var bnMintCount = new caverForUtil.utils.BigNumber(1);
      console.log("bnMintCount : " + bnMintCount);

      var klayValue = caverForUtil.utils.toPeb(1, 'KLAY') * sendKlayValue
      var bnKlayValue = new caverForUtil.utils.BigNumber(klayValue);
      console.log("bnKlayValue : " + bnKlayValue);

      var bnGas = new caverForUtil.utils.BigNumber(20000000);
      console.log("bnMintCount : " + bnGas);

      const receipt2 = await contract.methods.publicMint(bnMintCount).send({ 
        from: account,
        to: contract_addr,
        value: bnKlayValue,
        gas: bnGas
      });
      console.log(receipt2);

index.js:132 POST https://node-api.klaytnapi.com/v1/klaytn 400 (Bad Request)
errors.js:92 Uncaught (in promise) Error: Invalid JSON RPC response: {“code”:1034210,“message”:“Unsupported method - klay_sendTransaction”,“requestId”:“5b9451fe-a0d8-9f8c-a1ca-aeb3e11104c6”}
at Object.InvalidResponse (errors.js:92:1)
at index.js:159:1
at XMLHttpRequest.request.onreadystatechange (index.js:122:1)

이 문구가 클레이튼 노드 서버? 노드 서버에서 지원하지 않는 함수를 사용했다는 소리일까요?

답글 달아주셔서 정말 고맙습니다!!

※ 나중에 이 글을 보실 분들을 위해 문제가 있는 코드는 전부 삭제하였습니다!

궁금한게, Caver를 왜 2번 호출하시죠?
Minting은 @Sung-Yeoul_Park 님께서 개발자 지갑으로 진행하시는건가요?

일단

const caverForUtil = new Caver(window.klaytn); 

이 부분이, 지갑 연결한 사용자가 스마트 컨트랙트를 이용해야 하는 경우 트랜잭션을 카이카스로 서명하기 위한 Caver instance가 되거든요.

와주셔서 감사합니다!
유틸리티 함수를 사용하기 위해 따로 호출한 것입니다.
혹시 메인넷을 이용한다고
const caver = new Caver(new Caver.providers.HttpProvider(rpcUrl, option));
이 코드를 사용할 필요가 없나요?

연락주셔서 다시 한 번 감사합니다!!

유틸리티를 사용하실때는, Caver.XXX 이런식으로 바로 사용이 가능하실꺼에요, 메타데이터가 필요없는 static 메소드만 사용하시는 경우니까요.

provider는 EN을 연결하기 위해 제공해주는 것인데, 스마트 컨트랙트 실행주체가 누가 되는것으로 설계하시는건가요?

답변 감사합니다!

유틸리티를 사용하실때는, Caver.XXX 이런식으로 바로 사용이 가능하실꺼에요, 메타데이터가 필요없는 static 메소드만 사용하시는 경우니까요.
→ 제가 사용법을 잘 몰랐습니다. 내공이 많이 부족하네요 ㅜㅜ

provider는 EN을 연결하기 위해 제공해주는 것인데, 스마트 컨트랙트 실행주체가 누가 되는것으로 설계하시는건가요?
→ 검색해서 나온 코드를 가지고 급하게 따라 만들다보니,
트랜잭션을 카이카스로 서명하기 위한 Caver instance가 되거든요.
→ 이 부분도 정확히 이해를 못하고 있었습니다. 말씀해주시니까 이제야 조금씩 이해가 가네요.

대단히 감사합니다!!

선생님 정말 고맙습니다!!

선생님 얘기해주신 것을 가지고 쭉 검토해서 바로 성공하였습니다!!

복기해보니 BigInteger를 올바르게 사용하는 방법을 몰랐고
수면 부족으로 인한 잘못된 판단으로 코드를 엉뚱하게 작성하고 있습니다.

선생님 너무 감사합니다!!

개인 메시지를 발송해주실 수 있을까요?
제가 소정의 선물을 드리고 싶습니다!!
다시 한 번 감사합니다!!

1 Like

아닙니다! 잘 해결되셨다니 다행이에요 ^^
커뮤니티 자주오셔서 정보많이 공유부탁드려요~