다른 contract의 함수를 쓸 때 abi가 없으면 어떻게 해야할까요..?

안녕하세요!

작업중인건 클레이스왑의 스왑을 하려합니다.

클레이스왑페이지에 나와있는 factory->state-Changing Functions->exchangeKctPos 함수를 사용하려 합니다.

클레이튼 스코프에서
0xC6a2Ad8cC6e4A7E08FC37cC5954be07d499E7654의 컨트랙트가 공개되어있고 abi까지 확인이 되는데, exchangeKctPos 이 함수의 abi부분이 보이지 않습니다.

그래서 klaytn ide에서

contract testContractCall {
address ksp;
constructor(address addressa)public {
ksp = addressa;
}

function exchangeKctPos(address tokenA, uint amountA,address tokenB, uint amountB) public

{

   ksp.call(abi.encodeWithSignature("exchangeKctPos(address,uint,address[]",tokenA,amountA));

     //ksp.call(abi.encodeWithSignature("exchangeKctPos(address,uint,address,uint,address[]",tokenA,amountA,tokenB,amountB));
}

}

이렇게 작성해서 컨트랙트를 생성하고 만든 함수를 호출해보니 결과조회가 되긴 하는데 원하는 결과는 아니라서 뭔가 중간에 막힌 그런 것 같습니다…

제가만든 컨트랙트 주소는
0xa825bcD07132b5718b1fd984b859D3f2F4b4567a 입니다.

0x4c1D4b59047b27a855E81f56F3646e0C31e2C886 지갑에서
0xa825bcD07132b5718b1fd984b859D3f2F4b4567a 컨트랙트를 통해서
0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654 컨트랙트의 함수를 접근하는 방식입니다.

근데 클레이스코프에서 보면 Internal Transactions 탭에서 보니 뭐가 일을 하다 만 것 같은데…
그리고 지갑의 잔고도 변화가 없습니다…

컨트렉트에서 호출할 때 쓴 값은
tokenA : 0x5096db80b21ef45230c9e423c373f1fc9c0198dd
amountA : 0x38D7EA4C68000
tokenB : 0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654
amountB : 0x360051c896000

접근이 잘못된걸까요…?ㅜㅜ 도와주세요…ㅜㅜ

exchangeKctPos 의 사용법이 잘못되셨습니다.

문서에 정의된 인풋값은 다음과 같습니다.
exchangeKctPos(address,uint256,address,uint256,address[])
사용하신 ABI string에서 위 정보가 빠져있는 경우 4bytes 값이 다르게 나오므로, 모든값을 제대로 넣고 입력해주시기 바랍니다.

각 항목은
첫번째는 스왑하기 위해 보유하고 계신 tokenA의 주소
두번째는 tokanA의 스왑에 사용할 수량
세번째는 스왑해서 구입하려고 하는 tokenB
네번째는 스왑해서 최소 구입할 tokanB의 수량 (슬리피지 개념 적용)

이고, 커멘트 제거하신 함수를 보면 잘못된 human readible ABI가 들어가있습니다.

또한 파라미터도 토큰 1개의 address와 수량만 입력하셨기 때문에, input값이 부족합니다.
커멘트 된 함수에 uint부분을 uint256으로 바꿔서 시도하시는게 더 적합한 함수로 생각되며, 이때 띄어쓰기 없이 넣으셔야합니다.

일단 해당 함수는
0x5096db80b21ef45230c9e423c373f1fc9c0198dd (Wemix) 라는 토큰 0.001개를
0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654 (KSP)로 0.00095고 변환하는 교환비로 넣으신것 같으니 아마도.

ksp.call(abi.encodeWithSigniture("exchangeKctPos(address,uint256,address,uint256,address[])", tokenA, amountA, tokenB, amountB));

를 넣으셔야 할 것으로 생각되고, 이방법보다 추천드리는 방법은.
블루웨일이라는 유저 편의 Bapp 서비스 팀에서 공개한 Interface를 이용해 접근하시는게 더 쉽지 않을까 생각됩니다. 인터페이스는 아래 링크에서 구하실 수 있습니다.

bluewhale-trust/IKSP.sol at master · bluewhale-protocol/bluewhale-trust (github.com)

참고로 해당 함수는 ABI가 공개되어있는 상태로 ABI가 없을때의 경우가 아니며,
ABI가 제공되지 않은 함수의 실행에 대한 접근은 input data에 나와있는 값으로 유추는 가능하지만,
목적에 맞도록 파라미터 값을 어떻게 넣을지 유추하지 못할경우에는 불가능하다고 생각합니다.

감사합니다.

1개의 좋아요

답변 다시한번 정말 감사합니다!
토큰을 한개만 넣은건 exchangeKlayPos를 사용하기 위함이었는데 잘못했었네요!
링크도 감사합니다. 참고해서 작업해봐야겠어요!

진심으로 감사드립니다!

제가 알게된 정보들 저도 열심히 공유하겠습니다! 감사합니다!

2개의 좋아요

선생님 혹시 스왑 성공 하셨나요??? 제가 딱 하고싶었던 상황이여서 질문드립니다!!