Skip to content
53 changes: 53 additions & 0 deletions fees/boson/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { Adapter, FetchOptions, FetchResultV2 } from "../../adapters/types";
import { CHAIN } from "../../helpers/chains";

const ProtocolFeeCollectedEvent =
"event ProtocolFeeCollected(uint256 indexed exchangeId, address indexed exchangeToken, uint256 amount, address indexed executedBy)";
const protocolFeeCollectedTopic =
"0x9399ed37d26489264206ddf87ad81aaa13557b4e56b5443503a2b64a24ec42db";
const protocolDiamondAddress = "0x59A4C19b55193D5a2EAD0065c54af4d516E18Cb5";

async function getProtocolFees(options: FetchOptions): Promise<FetchResultV2> {
const { getLogs, createBalances } = options;
const dailyFees = createBalances();

const logs = await getLogs({
target: protocolDiamondAddress,
topics: [protocolFeeCollectedTopic],
eventAbi: ProtocolFeeCollectedEvent,
});

const collectedByToken: Record<string, bigint> = {};
for (const log of logs) {
const token = log.exchangeToken;
const amount = BigInt(log.amount);
collectedByToken[token] = (collectedByToken[token] || 0n) + amount;
}

for (const [token, amount] of Object.entries(collectedByToken)) {
dailyFees.add(token, amount);
}

return {
dailyFees,
dailyRevenue: dailyFees,
dailyProtocolRevenue: dailyFees,
};
}

const adapter: Adapter = {
fetch: getProtocolFees,
adapter: {
[CHAIN.POLYGON]: { start: "2022-10-12" },
[CHAIN.ETHEREUM]: { start: "2023-09-29" },
[CHAIN.BASE]: { start: "2025-01-31" },
[CHAIN.ARBITRUM]: { start: "2025-04-01" },
[CHAIN.OPTIMISM]: { start: "2025-03-10" },
},
version: 2,
methodology: {
Fees: "A fee is charged on every successful trade executed on the Boson Protocol.",
},
};

export default adapter;
Loading