Liquidity swap이 실패하는 이유 - feat 명절

예상 가능한 모든 경우의 수를 밤새 테스트해봤는대 여전히 되지 않네요.

성공할때도 있고 실패할때도 있으나, 어제 테스트에서는 계속 실패하고 있습니다.

approve는 일단 1회이상 이미 처리했으니 추가로 호출하지 않고 완전 배제했습니다.
이미 approve시 최대가격을 지정했기 때문에 승인 수량에 대한 문제도 아닌것 같습니다.

실시간으로 교환가능한 수량과 슬리피지 계산은 이루어지고 있고,
아래 답변주신것처럼 최대 전송수량을 기준으로 abi를 전송시킨것이 맞습니다.

성공했을때와 실패했을때 차이라고 하는 부분은 문제가 없는것 같습니다.
cypress이고 본의아니게 어제 토큰가격이 크게 하락하여 수량이 많이 다른 차이가 발생 한 것이네요.

이와 동일한 로직을 거쳐 kaikas contract execute 전송시킨면 정상 처리가 됩니다.
'전송수량이 실제전송수량을 넘어서서 revert가 발생한 것이다’는 아무리 검토해봐도 아닌것 같습니다…
이미 관련하여 서비스를 하고 있기 때문에
소스코드상의 문제는 아닌것 같다라고 생각하고 있고… 이 상황은 맞지 않습니다.
( swap 요청할때 abi 역시 klayswap에서 같은 슬리피지로 설정해 확인해보면 완전 동일한 값입니다. )

굳이 차이라고 한다면…
kaikas 계정에서 kaikas로 contract를 발동했느냐,
kas 계정에서 kas wallet api로 발동했느냐 뿐이네요…

klayswap측에도 이메일로 문의를 남기긴 했지만 kaikas에서는 정상이고 kas 계정으로 wallet api 발동 했을때만 문제가 있기 때문에 여기에 문의를 남겼습니다…

api로 contract execute 발동시키는 내용자체가 어려운것도 없고 관련서비스를 이미 하고 있기 때문에 별로 걱정하지 않고 있었는대 난감하네요…

어떤부분을 놓치고 있는건가요…

별도로 kas php 샘플코드로 따로 만들어서 아래처럼 post 해봤는대 문제는 동일합니다…
( input은 임의로 *표시했습니다. 실제전송시 정상값으로 넣습니다. )
{\n
“from”: “0x768Be32c294C885E2F9855787E3160D621A9c015”,\n
“value”: “0x00”,\n
“to”: “0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654”,\n
“input”: “********”,\n
“nonce”: 0,\n
“gas”: 0,\n
“submit”: true\n
}",

그런대… 같은 로직을 태우는 반대로
klay로 토큰을 swap하는 contract execute도 있는대 이부분은 정상적으로 작동됩니다.
approve 문제인지 다시 검증해보는것이 좋을까요…가장 의심가는 부분입니다…

( 명절인대 고향갈 수 있게 해주세요… )

안녕하세요,
실행하시는 코드 없이 어떤부분에서 문제가 되었는지 파악하기 어려울것 같습니다.
해당 소스코드 공유 가능하신가요? 일단 제가 확인한 바로는

0x5a3acc50 //	exchangeKctNeg(address,uint256,address,uint256,address[])
000000000000000000000000d742b1a5af898bcb4b6aff5027e6ab9adee97412 // TURNUP token
000000000000000000000000000000000000000000000000000000000000a52b // 0.00042283
0000000000000000000000000000000000000000000000000000000000000000 // Klay address
000000000000000000000000000000000000000000000000002386f26fc10000 // 0.01 Klay 
00000000000000000000000000000000000000000000000000000000000000a0
0000000000000000000000000000000000000000000000000000000000000000

해당 컨트랙트 method가 Klay 수량을 일정하게 두고 TURNUP token을 slipage를 넣고 스왑이 이루어지는 함수인데, TURNUP token의 '최소수량’이 실제 교환 가능한 수량보다 높게 나와서 revert가 발생한 것으로 보입니다.

아래는 해당 지갑에서 과거 성공했던 트랜잭션입니다. 확인하시면

0x5a3acc50
000000000000000000000000d742b1a5af898bcb4b6aff5027e6ab9adee97412
000000000000000000000000000000000000000000000000000000000000840b // 0.00033803 Turnup
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000002386f26fc10000  // 0.01 Klay
00000000000000000000000000000000000000000000000000000000000000a0
0000000000000000000000000000000000000000000000000000000000000000

상기 제시하신 가격보다 낮은값으로 책정되어있는 것을 볼 수 있습니다. 기본적으로 estimateKlayNeg 등의 함수를 통해 현재 스왑비를 먼저 산출 하시고, 슬리피지를 적용하여 시도해보시는 것을 권장드립니다.
해당 컨트랙트는 KlaySwap에서 제공하시는 것이므로, 컨트랙트 사용에 대한 정확한 방법은, support@klayswap.com으로 문의드리시는 것도 좋을 것 같습니다.

일단 제 생각에는, approve의 순서 문제가 아니고 (approve 한번 진행되면 approve된 최대치까지는 지속되는 것으로 알고있습니다., 해당 제시하신 코드 보면 MAX값으로 approve하셨으려나요?), 단순히 슬리피지 계산 오류로 발생한것같습니다.

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

1 Like

늦은 시간에 고생많으십니다. 전송시도한 가격은 스왑비와 슬리피지가 적용된 가격을 전송한것입니다.
이상하게도 approve를 다시 승인한 이후에 전송을 시도하면 정상적인 swap이 이루어집니다.
( 코드상으로 연속으로 approve와 swap을 각각 호출하면 실패를 해버립니다… )
스왑이 성공한것과 실패한것의 차이가 코드상 변경된 내용이 없이 이거뿐입니다.
별로 어려운 코드도 아니고 코드상의 문제는 없을것으로 생각합니다.
scope에 확인하니 SafeMath: subtraction overflow라고 표시가 나오네요. 좀더 알아봐야겠습니다…

아… 토큰 잔고부족으로 실패한것으로 확인되었습니다.
이런거에 48시간 소비해버렸네요…

명절 고향앞으로 갈 수 있겠네요… 도움주셔서 감사합니다.

아 해결되셨다니 다행입니다. 가족 분들과 마음편하게 즐거운 명절 보내시기 바랍니다!
Klaytn 디스코드 체널도 열려있으니, 관심있으시면 참여해주세요.

1 Like