코인이 들어오는 즉시 파는 프로그램을 먼저 만들었고, 이번에는 코인을 옮기는 출금을 맡았습니다.
메타마스크 지갑에서 보내는 프로그램과 거래소에서 보내는 프로그램 두 개입니다.
SEND를 눌러 두면 입금 전이거나 출금이 막혀 있는 동안은 기다리고, 보낼 수 있게 되는 순간 한 번 보낸 뒤 텔레그램으로 Txid를 알리고 멈춥니다.
출금은 되돌릴 수 없어서, 작업의 절반은 잘못 나가는 경우를 막는 데 들어갔습니다.
대상
EVM 7개 체인(직접 추가 가능) 국내외 거래소 11곳
특징
가능해지는 순간 1회 출금 텔레그램 Txid 알림
유형
코인 출금 자동화 Windows 실행 프로그램 2종
실행 환경
사용자 PC에서 단독 실행 키는 그 PC에만 암호화 저장
납품한 두 프로그램의 실제 화면. 지갑 주소, 컨트랙트, 수량, Txid는 모두 지어낸 예시 값입니다.
01배경과 요구사항
의뢰인은 여러 지갑과 여러 거래소에 나뉜 코인을 정해진 주소로 옮기는 일을 반복하고 있었습니다.
토큰이 지갑에 들어오는 시각이나 거래소가 출금을 여는 시각은 미리 알 수 없습니다.
그래서 화면을 켜 놓고 기다리다가, 열리는 순간 손으로 주소와 수량을 넣어 보내야 했습니다.
급하게 넣다 보면 네트워크나 주소를 틀리기 쉽고, 한 번 나간 출금은 돌아오지 않습니다.
요청은 이랬습니다.
메타마스크 출금봇은 지갑 여러 개를 등록해 두고 골라서 EVM 체인의 기본 코인이나 토큰을 보냅니다.
두 프로그램은 화면 구성과 흐름이 같습니다. 어디서 보낼지, 무엇을, 어느 네트워크로, 어느 주소로, 얼마나 보낼지를 정하고 SEND를 누릅니다.
그 뒤로는 프로그램이 정해진 간격으로 상태를 다시 확인합니다.
보낼 수 없는 동안은 기다립니다. 입금 전이라 잔고가 0이거나, 가스비가 모자라거나, 토큰 전송이 아직 잠겨 있거나, 거래소가 그 네트워크 출금을 막아 둔 경우입니다. 보내지 않은 사유는 로그에 남습니다.
거래소 출금봇은 요청을 보내기 직전마다 그 네트워크로 출금이 되는지 다시 조회합니다.
보낸 뒤에는 결과를 따라갑니다. 메타마스크 쪽은 블록에 포함될 때까지, 거래소 쪽은 거래소가 Txid를 만들 때까지 기다립니다.
출금 수량, 수신 주소, Txid를 로그와 텔레그램에 남기고 작업을 끝냅니다. STOP은 대기 중 언제든 누를 수 있습니다.
메타마스크 출금봇. 잔고가 0인 동안과 토큰 전송이 잠겨 있는 동안은 대기하고, 풀리는 순간 전송합니다. 값은 예시입니다.
전량 출금의 계산은 보내는 곳마다 다릅니다. 토큰은 잔고 전부를 보냅니다.
ETH 같은 기본 코인은 가스비만큼 남기고 보내는데, Base와 Optimism은 L1 수수료가 따로 붙어서 그 몫까지 남겨야 잔고 부족으로 거부되지 않습니다.
거래소는 네트워크마다 출금 수수료, 최소 수량, 허용 소수 자리가 다르므로 조회한 값에 맞춰 수량을 깎습니다.
거래소 출금봇. 코인을 조회하면 지금 출금이 열린 네트워크와 수수료, 최소 수량, 주소록 등록 여부가 함께 나옵니다. 값은 예시입니다.
03실제로 있었던 문제와 고친 내용
토큰을 보내려던 화면에서 기본 코인이 나간 일
배포 직후 사용 중에 생긴 일입니다. 컨트랙트 주소 칸에는 기본값으로 기본 코인 (ETH)라는 글자가 들어 있습니다.
이 글자를 지우지 않고 그 뒤에 토큰 컨트랙트 주소를 붙여넣으면, 칸에는 토큰 주소가 보이는데 프로그램은 칸이 기본 코인으로 시작한다는 이유로 ETH 전송으로 판단했습니다.
화면에 보이는 것과 실제로 나가는 것이 달랐던, 프로그램 쪽 잘못입니다.
같은 날 수정판을 냈습니다.
기본 코인으로 인정하는 경우를 그 글자만 있을 때로 좁혔고, 글자와 주소가 섞여 있으면 주소를 기준으로 삼습니다.
칸을 클릭하면 기존 글자가 전체 선택되어 붙여넣기가 곧바로 덮어씁니다.
기본 코인을 보낼 때는 토큰 말고 기본 코인이 나간다는 확인창이 매번 뜹니다.
컨트랙트 칸에 지갑 주소를 넣으면 토큰 컨트랙트 주소가 맞지 않다고 알려 줍니다.
바이낸스와 바이비트에는 여러 코인에 함께 쓰는 공용 주소가 있습니다. 주소록을 코인 이름으로만 걸러 조회하다 보니 이 주소들이 빠졌고, 등록해 둔 주소가 미등록으로 나왔습니다. 공용 주소까지 함께 조회하도록 고쳤습니다.
점검하다가 주소 칸에 64자리 Txid나 앞뒤에 글자가 붙은 값을 넣어 봤습니다. 프로그램이 그 안의 40자리만 잘라서, 형식은 멀쩡하지만 전혀 다른 주소로 받아들였습니다. 지금은 칸 전체가 주소 하나일 때만 주소로 인정합니다.
직전에 쓴 네트워크가 막혀 목록에서 빠졌을 때 목록의 첫 항목을 대신 골라 주면 다른 체인으로 출금될 수 있습니다. 이럴 때는 자동으로 고르지 않고 직접 선택하라고 안내합니다.
선택칸 위에서 마우스 휠을 굴리면 지갑이나 네트워크가 모르는 사이에 바뀝니다. 선택칸은 휠에 반응하지 않게 막았습니다.
다른 프로그램과 나란히 놓으려고 창을 줄이면 긴 잔고 문구가 SEND와 STOP 버튼을 밀어냈습니다. 문구와 버튼을 다른 줄로 나눴습니다.
04잘못 나가거나 두 번 나가지 않게 하는 장치
실제로 구현해 납품한 것만 적습니다. 출금 한도나 시간 제한 같은 기능은 의뢰 범위 밖이어서 넣지 않았습니다.
미등록 주소는 거래소에 따라 막거나 경고합니다. 업비트, 빗썸, 코인원, 코빗, 바이비트처럼 등록 주소로만 출금되고 주소록을 조회할 수 있는 거래소는 미등록 주소면 아예 보내지 않습니다. 바이낸스, 비트겟, 게이트는 미등록이면 주소를 다시 보여 주고 확인을 받습니다. OKX, 크립토닷컴, 코인베이스는 주소록 조회 API가 없어서, 프로그램이 미리 확인할 수 없다는 점을 확인창으로 알립니다.
조회한 뒤 코인이나 거래소를 바꾸면 이전 조회 결과를 비웁니다. 다시 조회하기 전에는 SEND가 눌리지 않습니다.
태그나 메모가 필요한 네트워크에서 태그 없이 보내려 하면 자산을 잃을 수 있다고 경고합니다.
출금 요청을 보낸 직후 통신이 끊기면 접수됐는지 알 수 없습니다. 이때는 같은 요청을 다시 보내지 않고 거래소 출금 내역에서 접수 여부를 먼저 확인합니다. 끝내 확인이 안 되면 결과 불명으로 멈추고 텔레그램으로 알립니다.
메타마스크 출금봇은 전송이 끊겼을 때 이미 서명한, Txid가 같은 거래만 다시 보냅니다. 같은 지갑의 앞선 거래가 아직 블록에 들어가지 않았으면 확정될 때까지 기다립니다.
거래소가 같은 이유로 5번 연속 거부하면 멈춥니다.
출금 요청을 보내는 몇 초 동안은 창을 닫아도 그 단계가 끝난 뒤에 닫힙니다. 기록과 알림이 빠지지 않게 하려는 것입니다.
개인키, API 키, 텔레그램 토큰은 프로그램 설정 화면에서 사용자가 직접 넣습니다.
암호화해서 그 PC에만 저장하고, 암호화 키는 Windows 계정에 묶어 두었습니다. 폴더를 통째로 다른 PC로 복사해도 열리지 않습니다.
화면에는 키의 앞뒤 몇 글자만 보이고, 로그 파일에는 키와 시크릿이 가려진 채로 남습니다.
설정 창의 API 키 탭. 거래소마다 다른 출금 주소 규칙을 한 표에 적어 두었습니다. 키는 예시 값입니다.
거래소 11곳은 인증 방식도 출금 절차도 서로 달랐습니다. 프로그램이 대신 처리하는 것과 사용자가 미리 해 둘 것을 나눴습니다.
OKX는 출금이 자금 계정에서만 나갑니다. 거래 계정에 있는 잔고는 출금 직전에 자금 계정으로 자동 이체합니다.
비트겟은 일반 계정인지 통합 계정인지 프로그램이 판별합니다.
빗썸은 트래블룰 때문에 수취 거래소와 수취인 정보가 필요합니다. 빗썸 주소록의 정보를 쓰거나 프로그램 주소록에 직접 넣습니다.
코인베이스는 출금 수수료를 미리 알려 주는 API가 없습니다. 화면에 수수료 사후 결정이라고 표시하고, 이 제약은 착수 전에 알린 뒤 진행했습니다.
출금 권한이 있는 키는 대부분 IP 등록이 필수입니다. 설정 화면에서 현재 공인 IP를 확인할 수 있고, 거래소별 키 발급과 IP 등록, 주소 등록 방법은 안내서로 따로 드렸습니다.
06한계와 남겨 둔 것
출금 수량에 수수료가 포함되는지 같은 세부는 거래소 문서만으로 단정할 수 없는 곳이 있습니다. 그런 항목은 설명서에 표로 적어 두었습니다. 사용자가 자기 키로 점검 보고서를 뽑고 소액 출금을 한 번 해 보며 확정하는 절차도 함께 드렸습니다. 개발자는 키를 받지 않습니다.
일부 해외 거래소는 계정의 국가나 법인에 따라 출금 요청에 수취인 정보를 더 요구합니다. 이번 버전은 지원하지 않습니다. 해당 계정이면 출금 전에 막거나 거래소가 거부합니다.
이메일 승인이나 2단계 인증처럼 사람이 해야 하는 단계는 프로그램이 대신할 수 없습니다. Txid가 30분 안에 생기지 않으면 Txid 미확정으로 알리고 종료합니다.
공용 RPC에는 속도 제한이 있습니다. 자주 쓰신다면 설정에서 개인 RPC 주소로 바꿀 수 있고, 막히면 예비 주소로 넘어갑니다.
07납품 결과물
실행 프로그램 2종 (메타마스크 출금봇, 거래소 출금봇)
사용설명서, 거래소별 출금 API 설정 안내서
소스 코드와 자동 테스트 약 90개. 수량 계산, 중복 출금 방지, 재시도, 화면 입력 해석을 확인합니다.
※ 본 사례는 과거 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 주소, 수량, Txid는 예시 값입니다. 수익률과 수익금은 공개하지 않습니다.
알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천, 투자 자문, 수익 보장 서비스가 아닙니다.
코인 출금은 되돌릴 수 없습니다. 주소, 네트워크, 수량의 최종 확인과 그 결과는 사용자의 책임이며, 가상자산 투자는 원금 손실 위험이 있습니다.
반복하는 출금 작업이 있으시다면
쓰시는 지갑과 거래소가 어디인지부터 알려 주세요.
되는 것과 안 되는 것을 먼저 확인해서 말씀드립니다.