Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ CONFIG_INDEXER_URL=https://dev.ponder.testnet.juicedollar.com/
CONFIG_INDEXER_FALLBACK_URL=https://dev.ponder.testnet.juicedollar.com/
CONFIG_CHAIN=testnet

RPC_URL_MAINNET=https://rpc.citrea.xyz
RPC_URL_TESTNET=https://rpc.testnet.citrea.xyz
RPC_URL_MAINNET=https://rpc.citreascan.com
RPC_URL_TESTNET=https://rpc.testnet.citreascan.com

COINGECKO_API_KEY=[API-KEY]

Expand Down
16 changes: 16 additions & 0 deletions bridge/bridge.enum.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
import { ADDRESS } from '@juicedollar/jusd';
import { CONFIG } from 'api.config';

export enum StablecoinEnum {
StartUSD = 'StartUSD',
USDCe = 'USDC.e',
USDTe = 'USDT.e',
ctUSD = 'ctUSD',
}

const ADDR = ADDRESS[CONFIG.chain.id];

// Map enum values to lowercased stablecoin token addresses (skipping undefined for testnet)
export const STABLECOIN_ADDRESS: Partial<Record<StablecoinEnum, string>> = {
...(ADDR?.startUSD ? { [StablecoinEnum.StartUSD]: ADDR.startUSD.toLowerCase() } : {}),
...(ADDR?.USDC ? { [StablecoinEnum.USDCe]: ADDR.USDC.toLowerCase() } : {}),
...(ADDR?.USDT ? { [StablecoinEnum.USDTe]: ADDR.USDT.toLowerCase() } : {}),
...(ADDR?.CTUSD ? { [StablecoinEnum.ctUSD]: ADDR.CTUSD.toLowerCase() } : {}),
};
48 changes: 26 additions & 22 deletions bridge/bridge.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,42 @@ import { gql } from '@apollo/client/core';
import { Injectable } from '@nestjs/common';
import { PONDER_CLIENT } from 'api.apollo.config';
import { StablecoinBridgeQuery } from './bridge.types';

import { StablecoinEnum } from './bridge.enum';
import { StablecoinEnum, STABLECOIN_ADDRESS } from './bridge.enum';

@Injectable()
export class BridgeService {
async getBridgedStables(stablecoin: StablecoinEnum, timestamp: Date, minAmount: bigint): Promise<StablecoinBridgeQuery[]> {
const address = STABLECOIN_ADDRESS[stablecoin];
if (!address) return [];

const checkTimestamp = Math.trunc(timestamp.getTime() / 1000);

const bridgeFetched = await PONDER_CLIENT.query({
fetchPolicy: 'no-cache',
query: gql`
query GetBridge${stablecoin} {
bridge${stablecoin}s(
orderBy: "timestamp", orderDirection: "desc"
where: {
timestamp_gt: "${checkTimestamp}"
amount_gte: "${minAmount}"
isMint: true
}
) {
items {
swapper
txHash
amount
isMint
timestamp
}
}
}
`,
query GetBridgeTxs {
bridgeTxs(
orderBy: "timestamp", orderDirection: "desc"
where: {
stablecoinAddress: "${address}"
timestamp_gt: "${checkTimestamp}"
amount_gte: "${minAmount}"
isMint: true
}
) {
items {
stablecoinAddress
swapper
txHash
amount
isMint
timestamp
}
}
}
`,
});

return bridgeFetched?.data?.[`bridge${stablecoin}s`]?.items ?? [];
return bridgeFetched?.data?.bridgeTxs?.items ?? [];
}
}
1 change: 1 addition & 0 deletions bridge/bridge.types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Address } from 'viem';

export type StablecoinBridgeQuery = {
stablecoinAddress: string;
txHash: string;
swapper: Address;
amount: string;
Expand Down
Loading