ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Intern] Moralis api로 조회 안되는 데이터들 조회되도록 구현 (토큰의 양)
    Intern/Project 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개 불러오기
    • 로그 분석해서 사용할 수 있는 정보있나 확인
    반응형
Designed by Tistory.