한 트랙잭션에서 여러 유저에게 custom token transfer

안녕하세요. 아래와 같은 코드가 있습니다.

아래 컨트랙트를 배포한 account와 test함수를 호출한 account는 같습니다.

contract Test is KIP7 {
    
    constructor() public {
        _mint(msg.sender, 100000000000000000000);
    }

    function test(uint256 loopCnt) public {
        
        for (uint256 i = 0; i < loopCnt; i++) {
            transfer(address(i+1), 1);
        }
    }
}

위 solidity 코드에서 test 함수를 호출하려고 하는데 loopCnt 파라미터로 어떤 값을 넣어도 에러가 납니다. 아래와 같은 에러가 납니다.

image

호출하는 front-end 코드는 아래와 같습니다.

    const testData = App.testContract.methods.test(1).encodeABI();

    const setParams = {

      from: App.currentAccount,

      to: testContractAddress, // test contract address

      gas: '5000000',

      //gasPrice: '2500000000',

      value: '0x0', // 0x 붙여야됨

      data: testData,

    };

    App.kaiKasProvider.sendAsync({ method: 'klay_sendTransaction', params: [setParams] }, (err, result) => {
...
...
}

처음엔 loopCnt 파라미터로 1000을 넣어서 너무 커서 그런가 싶어서 1로 줄였는데도 마찬가지로 에러가 나고 있습니다. 무엇이 문제일까요??

실패한 트랜잭션은 아래에서 볼수 있습니다.

============================= 추가 ===============================

이더리움 KOVAN 네트웍크에서는 잘 작동합니다.

같은코드로 baobab에서 방금 다시 해보니까 잘됩니다. 뭐가 문제였을까요? ㅠㅠ

@Cocos_No 안녕하세요,

해당 트랜잭션확인결과 다음과 같은 이유로 reverted tx가 발생했습니다.
SafeMath: subtraction overflow
해당 에러가 발생할 만한 부분을 찾아보시길 바랍니다.

감사합니다.

{
  error: "execution reverted",
  from: "0x0e84ea1f4d4d15a43cd898c0d8fad018d2184292",
  gas: "0x4ff9fe8",
  gasUsed: "0x78c",
  input: "0x29e99f070000000000000000000000000000000000000000000000000000000000000001",
  reverted: {
    contract: "0xbd1c3b6d9ab124f82606998763bef932b7809bf7",
    message: "SafeMath: subtraction overflow"
  },
  time: "83.827µs",
  to: "0xbd1c3b6d9ab124f82606998763bef932b7809bf7",
  type: "CALL",
  value: "0x0"
}
2개의 좋아요

위 정보는 어떤 API로 받으신건가요?

아래 함수로 가져와 봤는데 다른 정보가 나오네요

caver.transaction.getTransactionByHash

알려주시면 감사하겠습니다.

@Cocos_No 안녕하세요,

해당 API는 debug namespace에 존재합니다.
debug namespace는 노드에 부담이 많이가서 퍼블릭하게 오픈해놓진 않습니다.
해당 API는 debug.traceTransaction(<txHash>, {tracer: "callTracer"})를 통해서 확인했습니다.

감사합니다.

1개의 좋아요

자꾸 질문드려 죄송합니다. 말씀해주신 API를 어떻게 해야 사용할수 있는지 방법을 못찾겠습니다.

저건 java script 코드인가요? 그럼 require는 어떻게 해야 될까요?

좀 더 자세히 알려주시면 감사하겠습니다.

@Cocos_No

debug namespace를 열어두셔야하고, RPC API를 통해서 사용가능합니다.
해당 문서를 참조해주세요.

감사합니다.

1개의 좋아요