컨트랙트 배포 후 테스트 시 오류가 발생하여 문의드립니다

테스트넷(Baobab)에서 하나의 블록에 여러 Tx를 담아 토큰전송을 하여 가스비를 줄이고 싶어서 컨트랙트를 배포했습니다.

비슷한 질문을 드린 적이 있는데

답변을 받고 컨트랙트를 Baobab에 배포하였습니다.

배포한 컨트랙트의 주소는 0x632d333f6090a489e8296dc091689ebb21491abc 이고 소스는 아래처럼 배포했습니다.

contract MCCBroker {

    /**
     * @dev transferMulti 
     * @param _tokenAddr ERC20 Token Address
     */
    function transferMulti(address _tokenAddr, address[] memory targets, uint256[] memory values) public {
        ERC20 tokenAddr = ERC20(_tokenAddr);

        for( uint i = 0 ; i < targets.length ; i++ ) {
            tokenAddr.transfer(targets[i], values[i]);
        }
    }

    function transferFromMulti(address _tokenAddr, address fromAddr, address[] memory targets, uint256[] memory values) public {
        ERC20 tokenAddr = ERC20(_tokenAddr);

        for( uint i = 0 ; i < targets.length ; i++ ) {
            tokenAddr.transferFrom(fromAddr, targets[i], values[i]);
        }
    }
}

해당 컨트랙트의 transferMulti를 Klaytn IDE에서 실행을 했을 때
“Error encoding arguments: Error: expected array value (arg=”“, coderType=“array”, type=“string”, value=“1”)” 라는 에러가 발생했습니다.

스크린샷 2021-08-25 오후 3.47.45
Input값은 이렇게 되는데 오류내용을 잘 이해하지 못해서 질문드립니다.

안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.

일단 해당 에러는 values 필드에 아래처럼 입력을 해야 한다는 에러입니다.

["1", "2"]

확인 부탁드리겠습니다.

감사합니다.

감사합니다

알려주신대로
_tokenAddr 계정을 KAS Console에서 생성 후 클레이를 9.222899994998999995개 가지고 있어서
[“1”, "1]로 보냈습니다.

transactionHash(0x6f95cb75116501f3e6b8b783e098cb5d5150b310d26f1a488bd27bee6fd68b0a)를 scope에서 검색했을 때 “Fail : ErrExecutionReverted - uint(0x09)” 이런 오류가 발생하였습니다.

구글링한 결과를 보니

From: 0x87ee3337108a31ab539e244f3d22f4070f03d12a
To: Contract 0x812a27078f0644b5bb88d5c0b9d616eb3550bcec

Function: transferFrom(address _from, address _to, uint256 _value)

[0]:  00000000000000000000000018c7abf493c747f39ce006abeb9bd6d2592e833e
[1]:  000000000000000000000000b7a5329bcb48308e3fba671dfe7e0f6477b1f759
[2]:  00000000000000000000000000000000000000000000000000000000000186a0

주소가 이런식으로 되어 있던데
제가 입력한 16진수의 주소를 Uint256으로 변경해줘야할까요??

“0x18c7abf493c747f39ce006abeb9bd6d2592e833e”
이 주소에는 클레이가 아니고 해당 컨트랙트 토큰이 충분히 있어야 합니다. 그 부분 먼저 확인 부탁드립니다.

또한 이 컨트랙트 실행 주체와 from에 적힌 주소가 다른데, 그럴경우 approve를 통해 전송할 수 있는 권한이 먼저 확보되어야 합니다.

해당 컨트랙트가 ERC-20 컨트랙트가 맞다면, approve()함수가 어떻게 동작하는지 확인 부탁드립니다.

감사합니다.

아… 클레이가 아니라 토큰이 있어야 하는거였군요
감사합니다

approve() 함수 동작도 같이 확인해보겠습니다

=============================================
@colin.kim
답변주신 내용을 확인하다가 궁금한게 생겨 문의드립니다.

0x18c7abf493c747f39ce006abeb9bd6d2592e833e 주소가 컨트랙트 주소인가요?
어제 제가 배포한 컨트랙트 주소는 "0x632d333f6090a489e8296dc091689ebb21491abc"인데
이 컨트랙트에 주소가 없어서 문의드립니다.

“0xb99d23a33f109345f9a565cdfd33496ccac3bdaa275d93a72d7d0d1e98346ae7”

확인해보니 제가 기존에 _tokenAddr에 토큰에대한 컨트랙트 주소를 넣어야했는데 제가 잘못넣었습니다.
다시 수정해서 전송한 트랜잭션해시값이 제일 위에 있는 해시값입니다.

_tokenAddr : "0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed",
targets : ["0x30f645dcce248679dbb51024c85865bcbed9b7f8", "0xb7cc824e26fea75cb930f1036d9159eb65f73f8d"],
values : ["1", "1"]

로 진행하였습니다.

그때도 동일하게 Fail : ErrExecutionReverted - uint(0x09) 에러가 발생했습니다.

from에 해당하는 계정에 Klay와 저희가 배포한 ERC20토큰 수량은


위와 같이 있습니다.

transferMulti()라는 함수 구현을 보면 결국 MCCBroker라는 계정에서 target address로 보내는데, 그럼 토큰을 보유하고 있는 계정 주소는 “0x632d333f6090a489e8296dc091689ebb21491abc” 이 주소여야 하는데, 맞나요?

@colin.kim
토큰을 보유하고 있는 계정주소는 “0x8dca68a7dc727a6ae623ad633efb720d966d4609” 입니다.
"0x632d333f6090a489e8296dc091689ebb21491abc"주소는 컨트랙트 주소입니다.

MCCBroker라는 함수에서 transferMulti()라는 함수를 사용하게 되면 transfer(recipient, amount)를 호출하게 됩니다. 여기에는 sender의 주소가 들어가지 않습니다. 즉, 해당 컨트랙트가 보유한 토큰을 전송한다는 의미입니다.

원하시는 기능은 "0x8dca68a7dc727a6ae623ad633efb720d966d4609"이 계정의 토큰을 전송하고 싶으신 것 같습니다.

그렇다면 transferFromMulti()라는 함수를 사용하시는 것이 맞을 것 같고, 실행하기 전에 approve()가 되어있어야 합니다.

1 Like

감사합니다!
다시 디버깅해보도록 하겠습니다