UNPKG

@citizenwallet/sdk

Version:

An sdk to easily work with citizen wallet.

191 lines (154 loc) 4.36 kB
import type { CommunityConfig } from "../index"; import { keccak256, toUtf8Bytes } from "ethers"; import { ERC20TransferLogData } from "./transfer"; import { MessageExtraData } from "./extra"; export interface Log<D = LogData, E = unknown> { hash: string; tx_hash: string; created_at: string; // ISO 8601 date string updated_at: string; // ISO 8601 date string nonce: number; sender: string; to: string; value: string; // BigInt as string data: D | null; // Assuming this could be any JSON object or null extra_data: E | null; // Assuming this could be any JSON object or null status: LogStatus; } export type ERC20TransferLog = Log< ERC20TransferLogData, MessageExtraData | null >; // Enum for LogStatus export enum LogStatus { Unknown = "", Sending = "sending", Pending = "pending", Success = "success", Fail = "fail", } export interface ResponsePaginationMetadata { limit: number; offset: number; total: number; } export interface ObjectResponse<T, M> { object: T; meta: M; } export interface ArrayResponse<T, M> { array: T[]; meta: M; } export interface PaginationParams { limit: number; offset: number; } export interface LogData { [key: string]: string; } export interface LogQueryParams { maxDate: string; data?: LogData; orData?: LogData; } export interface NewLogQueryParams { fromDate: string; data?: LogData; orData?: LogData; } export function logDataToQueryString( data: LogData, prefix: string = "data" ): string { return Object.entries(data) .map(([key, value]) => `&${prefix}.${key}=${encodeURIComponent(value)}`) .join(""); } export class LogsService<D = LogData, E = unknown> { private url: string; constructor(config: CommunityConfig) { const network = config.primaryNetwork; this.url = `${network.node.url}/v1/logs`; } async getLog( tokenAddress: string, hash: string ): Promise<ObjectResponse<Log<D, E>, undefined>> { const url = `${this.url}/${tokenAddress}/tx/${hash}`; const resp = await fetch(url); return resp.json(); } async getLogs( tokenAddress: string, topic: string, params?: PaginationParams & LogQueryParams ): Promise<ArrayResponse<Log<D, E>, ResponsePaginationMetadata>> { let url = `${this.url}/${tokenAddress}/${topic}`; if (params) { url += `?limit=${params.limit}&offset=${params.offset}`; if (params.maxDate) { url += `&maxDate=${params.maxDate}`; } if (params.data) { url += logDataToQueryString(params.data); } if (params.orData) { url += logDataToQueryString(params.orData, "data2"); } } const resp = await fetch(url); return resp.json(); } async getAllLogs( tokenAddress: string, topic: string, params?: PaginationParams & LogQueryParams ): Promise<ArrayResponse<Log<D, E>, ResponsePaginationMetadata>> { let url = `${this.url}/${tokenAddress}/${topic}/all`; if (params) { url += `?limit=${params.limit}&offset=${params.offset}`; if (params.maxDate) { url += `&maxDate=${params.maxDate}`; } } const resp = await fetch(url); return resp.json(); } async getNewLogs( tokenAddress: string, topic: string, params?: PaginationParams & NewLogQueryParams ): Promise<ArrayResponse<Log<D, E>, ResponsePaginationMetadata>> { let url = `${this.url}/${tokenAddress}/${topic}/new`; if (params) { url += `?limit=${params.limit}&offset=${params.offset}`; if (params.fromDate) { url += `&fromDate=${params.fromDate}`; } if (params.data) { url += logDataToQueryString(params.data); } if (params.orData) { url += logDataToQueryString(params.orData, "data2"); } } const resp = await fetch(url); return resp.json(); } async getAllNewLogs( tokenAddress: string, topic: string, params?: PaginationParams & NewLogQueryParams ): Promise<ArrayResponse<Log<D, E>, ResponsePaginationMetadata>> { let url = `${this.url}/${tokenAddress}/${topic}/new/all`; if (params) { url += `?limit=${params.limit}&offset=${params.offset}`; if (params.fromDate) { url += `&fromDate=${params.fromDate}`; } } const resp = await fetch(url); return resp.json(); } }