-
[Intern] 트랜잭션 조회 로직 고도화 (안뜨는 token value 데이터 처리)Intern/Project 2024. 12. 19. 21:25
✏ 근무 내용
- 트랜잭션 조회 로직 고도화 (안뜨는 token value 데이터 처리)
⭐근무 결과
Squid - have a nice swap.
Get the tokens you want on any chain.
app.squidrouter.com
[예시로 조회되어야 할 해시값 목록]
- 이더리움↔아비트리움 간
- 이더리움 ↔ 베이스 간
- 베이스 ↔ 이더리움 간 / 아비트리움↔이더리움 간
예시 잘 안나옴
[기존 squid api 데이터에 value 값 뜨지 않는 문제 - 아래 api 사용해 구현하기 ]
[주소값도 정확하게 변경]
각각 squid api 데이터에서
- 보내는 주소는 fromChain.chainData.squidContracts.squidRouter에서 추출
- 받는 주소는 toChain.chainData.squidContracts.defaultCrosschainToken에서 추출
const formatTx = (chainData: any, txInfo: any, isSource: boolean) => ({ chain: chainData.chainName?.toLowerCase() || 'unknown', address: isSource ? chainData.squidContracts?.squidRouter || 'unknown' : chainData.squidContracts?.defaultCrosschainToken || 'unknown', value: txInfo.sendValue || txInfo.receiveValue || '0', hash: txInfo.hash, timestamp: txInfo.timestamp, id: 'USDC', }); return [ { protocol: 'Squid', sourceTx: formatTx(data.fromChain.chainData, fromChainInfo, true), destinationTx: formatTx(data.toChain.chainData, toChainInfo, false), }, ]; } catch (error) { console.error(`Error in fetchTransactionData for hash: ${txHash}`, error); throw error; } } private async getUsdcTransferLogsInSourceTest(chain: string, recipientAddress: string, depositorAddress: string, logs) { const transferCode = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'; const matchingLogs = logs.filter(log => log.topics[0] === transferCode); let sendValue = null; let receiveValue = null; for (const log of matchingLogs) { const sender = '0x' + log.topics[1].slice(-40).toLowerCase(); const receiver = '0x' + log.topics[2].slice(-40).toLowerCase(); if (sender === depositorAddress.toLowerCase()) { sendValue = BigInt(parseInt(log.data, 16)).toString(); // 송신 value } if (receiver === recipientAddress.toLowerCase()) { receiveValue = BigInt(parseInt(log.data, 16)).toString(); // 수신 value } } return { sendValue, receiveValue }; }
보내는 주소와 받는 주소 추출
메서드: getUsdcTransferLogs
- 필터링 기준:
- transferCode: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' (ERC-20 Transfer 이벤트의 식별 코드)
- 로그 데이터를 topics[0] 값으로 필터링하여 Transfer 이벤트만 가져옵니다.
- 추출 방식:
- topics[1]: 송신자 주소 (20바이트를 슬라이스하여 추출)
- topics[2]: 수신자 주소
- const sender = '0x' + log.topics[1].slice(-40).toLowerCase(); const receiver = '0x' + log.topics[2].slice(-40).toLowerCase();
- 조건부 저장:
- depositorAddress: 송신자 주소와 비교
- recipientAddress: 수신자 주소와 비교
- 조건에 맞으면 log.data 값을 16진수에서 숫자로 변환 후 저장.
- if (sender === depositorAddress.toLowerCase()) result.sendValue = BigInt(parseInt(log.data, 16)).toString(); if (receiver === recipientAddress.toLowerCase()) result.receiveValue = BigInt(parseInt(log.data, 16)).toString();
Value(송신 값 및 수신 값) 추출
메서드: fetchChainTransactionDetails
- 트랜잭션 영수증과 로그 데이터 요청:
- getTxReceipt: 트랜잭션 영수증과 로그 데이터를 반환.
- getUsdcTransferLogs: 위에서 설명한 방식으로 송수신 값을 추출.
- const receipt = await this.getTxReceipt(transactionId, chainName.toLowerCase()); const { sendValue, receiveValue } = await this.getUsdcTransferLogs( chainName.toLowerCase(), tx.to.toLowerCase(), tx.to.toLowerCase(), receipt.logs );
- 반환 데이터 구조:
- sendValue: 송신된 USDC 값.
- receiveValue: 수신된 USDC 값.
- hash: 트랜잭션 ID.
- timestamp: 블록 타임스탬프.
- return { sendValue, receiveValue, hash: transactionId, timestamp: blockTimestamp };
'Intern > Project' 카테고리의 다른 글
[Intern] Controller 부분 분기문 처리 수정 / 최종 코드 테스트 (1) 2024.12.29 [Intern] Squid api 연동 출발 및 도착 체인 트랜잭션 정보 조회 개발 (0) 2024.12.18 [Intern] Squid router API 데이터 분석 (0) 2024.12.17 [Intern] Squid 브리지 api 연동 및 데이터 확인 (0) 2024.12.13 [Intern] 캐싱 및 redis 사용 검색 속도 향상 적용 (0) 2024.12.12