Intern/Project

[Intern] Moralis api로 조회 안되는 데이터들 조회되도록 구현 (토큰의 양)

dbfl9911 2024. 12. 8. 21:57
반응형

근무 내용

  • moralis api로 조회 안되는 데이터들 조회되도록 구현 (토큰의 양)

근무 결과

  • hash, chain 정보로 sender, destination 정보 불러오는 url

http://localhost:3000/api/transaction?transactionHash=0x4e5972ad123350b0511141deb2985a87a58423253694742ede6cc3be093e052c&chain=0x1

[ 체인 정보 안넣고 해시값만 넣었을 때 데이터 조회되게 하기 ]

⭕moralis api로 조회 되는 데이터들

: 체인 종류(원래 조회x) /출발,도착 체인 주소값(정확x) / 출발 시간

moralis api로 조회 안되는 데이터들

: 도착체인 해시값 / 도착날짜및시간 /보낸 토큰과 받는 토큰의 양 (이건 뜨긴하는데 정확도 떨어짐)

-moralis api 이용해 보낸 토큰과 받는 토큰의 양 데이터 가져오기

// 토큰 전송 정보 조회
  async getTokenTransferDetails(transactionHash: string): Promise<any> {
    // 트랜잭션 해시를 기반으로 트랜잭션이 발생한 체인을 감지
    const chain = await this.detectTransactionChain(transactionHash);
  
    try {
      const response = await Moralis.EvmApi.transaction.getTransactionVerbose({
        transactionHash, // 입력 트랜잭션 해시
        chain, // 감지된 체인 ID
      });
  
      if (!response?.raw?.logs) {
        throw new Error("Transaction logs not found.");
      }
  
      // 트랜잭션 로그를 추출
      const logs = response.raw.logs;
      // ERC-20 Transfer 이벤트에 대한 토픽 식별자
      const transferTopic = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
  
      let sentTokenAmountRaw = "0";
      let receivedTokenAmountRaw = "0";
  
      // 트랜잭션 로그를 순회하며 Transfer 이벤트를 필터링
      for (const log of logs) {
        if (log.topic0 === transferTopic) {
          // 로그의 `topic1`은 전송자의 주소, `topic2`는 수신자의 주소를 나타냄
          const fromAddress = `0x${log.topic1.slice(-40)}`;
          const toAddress = `0x${log.topic2.slice(-40)}`;
  
          // 전송자의 주소와 트랜잭션 발신자의 주소가 일치하면 보낸 토큰 양을 기록
          if (fromAddress.toLowerCase() === response.raw.from_address.toLowerCase()) {
            sentTokenAmountRaw = BigInt(log.data).toString();
          }
  
          // 수신자의 주소와 트랜잭션 수신자의 주소가 일치하면 받은 토큰 양을 기록
          if (toAddress.toLowerCase() === response.raw.to_address.toLowerCase()) {
            receivedTokenAmountRaw = BigInt(log.data).toString();
          }
        }
      }
  
      // 토큰의 소수점 자리수(USDC는 6자리)로 나눠 실제 토큰 양을 계산
      const decimals = 6;
      const sentTokenAmount = parseInt(sentTokenAmountRaw) / 10 ** decimals;
      const receivedTokenAmount = parseInt(receivedTokenAmountRaw) / 10 ** decimals;
  
      // 체인 ID와 토큰 전송 정보를 반환
      return {
        chain,
        sentTokenAmount: `${sentTokenAmount.toFixed(2)} USDC`,
        receivedTokenAmount: `${receivedTokenAmount.toFixed(2)} USDC`,
      };
    } catch (error) {
      console.error("Error fetching token transfer details:", error);
      throw error;
    }
  }

위 코드 실행시 아래와 같이 체인 종류 정보, 보낸 토큰과 받는 토큰 양 결과 확인 가능!

{
  "chain": "0x2105",
  "sentTokenAmount": "64076.01 USDC",
  "receivedTokenAmount": "64076.01 USDC"
}

위 방식의 단점 : 각 세개의 체인이 조회될 때까지 서버 왔다갔다 해야하므로 효율성 떨어지므로 개선이 필요하다.


-moralis api의 한계점 및 다른 api를 찾아야 할것 같은 이유

  • 받는 체인 기준이 불명확:
    • Range 사이트처럼 특정 프로토콜(CCTP 등)이나 토큰 트랜스퍼 흐름에 따라 받는 데이터를 구성하려면, 수신 데이터를 단순히 "주소값"만으로 찾는 것이 아닌, 특정 계약 주소나 트랜잭션과 연결된 이벤트를 확인해야 합니다.
  • Moralis API의 한계:
    • Moralis API는 특정 체인에서 발생한 트랜잭션을 반환하지만, Cross-Chain과 같이 서로 연결된 송/수신 트랜잭션 데이터를 명확히 매핑하지 않습니다.
  • 사진 속 데이터:
    • Range는 USDC 토큰의 Cross-Chain Transfer Protocol(CCTP)을 기반으로 데이터를 시각화합니다. 여기에는 Circle이나 특정 브릿지 프로토콜을 통해 두 체인 간 연결을 매핑합니다.
    • 사진 속 데이터를 구성하려면 해당 트랜잭션에서 Cross-Chain 관련 이벤트 로그를 확인해야 합니다.

🚩인사이트

다음에 할거

  • 도착 체인 해시값 불러오는 방법 생각해보기 …
  • 이후 5개 트랜잭션 보여주기
  • Get native transactions by wallet api 이용해 Transaction 5개 불러오기
  • 로그 분석해서 사용할 수 있는 정보있나 확인
반응형