From d15a28d9f92be31c635ec164daa3906dd13f989b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Sun, 24 Mar 2024 17:39:40 +0100 Subject: [PATCH] feat: add StackingDAO protocol (#12) --- .../stacking-dao-core-v1.deposit.json | 23 ++++++ .../stacking-dao-core-v1.withdraw.json | 23 ++++++ public/protocols/stackingdao.png | Bin 0 -> 69682 bytes .../chainhooks/stackingdao/deposit/route.ts | 72 ++++++++++++++++++ .../chainhooks/stackingdao/withdraw/route.ts | 72 ++++++++++++++++++ .../Transaction/Action/StackingDAO.tsx | 28 +++++++ src/components/Transaction/TransactionRow.tsx | 5 ++ src/db/schema.ts | 21 ++++- src/db/transactions.ts | 34 ++++++++- src/lib/actions.ts | 46 ++++++++++- src/lib/chainhooks.ts | 26 +++++++ src/lib/protocols.ts | 7 ++ 12 files changed, 353 insertions(+), 4 deletions(-) create mode 100644 chainhooks/stackingdao/stacking-dao-core-v1.deposit.json create mode 100644 chainhooks/stackingdao/stacking-dao-core-v1.withdraw.json create mode 100644 public/protocols/stackingdao.png create mode 100644 src/app/api/chainhooks/stackingdao/deposit/route.ts create mode 100644 src/app/api/chainhooks/stackingdao/withdraw/route.ts create mode 100644 src/components/Transaction/Action/StackingDAO.tsx diff --git a/chainhooks/stackingdao/stacking-dao-core-v1.deposit.json b/chainhooks/stackingdao/stacking-dao-core-v1.deposit.json new file mode 100644 index 0000000..9e138ff --- /dev/null +++ b/chainhooks/stackingdao/stacking-dao-core-v1.deposit.json @@ -0,0 +1,23 @@ +{ + "chain": "stacks", + "uuid": "1", + "name": "stacking-dao-core-v1.deposit", + "version": 1, + "networks": { + "mainnet": { + "if_this": { + "scope": "contract_call", + "contract_identifier": "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", + "method": "deposit" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/api/chainhooks/stackingdao/deposit", + "authorization_header": "Bearer dev-api-token" + } + }, + "start_block": 132118, + "decode_clarity_values": false + } + } +} diff --git a/chainhooks/stackingdao/stacking-dao-core-v1.withdraw.json b/chainhooks/stackingdao/stacking-dao-core-v1.withdraw.json new file mode 100644 index 0000000..221c6fd --- /dev/null +++ b/chainhooks/stackingdao/stacking-dao-core-v1.withdraw.json @@ -0,0 +1,23 @@ +{ + "chain": "stacks", + "uuid": "1", + "name": "stacking-dao-core-v1.withdraw", + "version": 1, + "networks": { + "mainnet": { + "if_this": { + "scope": "contract_call", + "contract_identifier": "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", + "method": "withdraw" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/api/chainhooks/stackingdao/withdraw", + "authorization_header": "Bearer dev-api-token" + } + }, + "start_block": 132118, + "decode_clarity_values": false + } + } +} diff --git a/public/protocols/stackingdao.png b/public/protocols/stackingdao.png new file mode 100644 index 0000000000000000000000000000000000000000..2c61dee642c8e959482d3182c64a03a13ecea5fd GIT binary patch literal 69682 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 z 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 literal 0 HcmV?d00001 diff --git a/src/app/api/chainhooks/stackingdao/deposit/route.ts b/src/app/api/chainhooks/stackingdao/deposit/route.ts new file mode 100644 index 0000000..9ba5530 --- /dev/null +++ b/src/app/api/chainhooks/stackingdao/deposit/route.ts @@ -0,0 +1,72 @@ +import { db } from "@/db/db"; +import { type InsertTransaction, transactionTable } from "@/db/schema"; +import { conflictUpdateSetAllColumns } from "@/db/utils"; +import type { + ChainhookPayload, + ChainhookReceiptEventFTMintEvent, + ChainhookReceiptEventSTXTransferEvent, +} from "@/lib/chainhooks"; +import { getOrInsertToken } from "@/lib/currencies"; + +export const dynamic = "force-dynamic"; + +export async function POST(request: Request) { + const data: ChainhookPayload = await request.json(); + + const transactionsToInsert = data.apply[0].transactions + .filter((transactionToProcess) => transactionToProcess.metadata.success) + .map((transactionToProcess) => { + const sender = transactionToProcess.metadata.sender; + const transferEvents = transactionToProcess.metadata.receipt.events + // Events are not always in order so we sort them by index + .sort((a, b) => a.position.index - b.position.index) + .filter( + ( + event, + ): event is + | ChainhookReceiptEventSTXTransferEvent + | ChainhookReceiptEventFTMintEvent => + event.type === "STXTransferEvent" || event.type === "FTMintEvent", + ); + const stxTransferEvent = transferEvents.filter( + (event) => + event.type === "STXTransferEvent" && event.data.sender === sender, + )[0]; + const stStxMintEvent = transferEvents.filter( + (event): event is ChainhookReceiptEventFTMintEvent => + event.type === "FTMintEvent" && event.data.recipient === sender, + )[0]; + + return { + txId: transactionToProcess.transaction_identifier.hash, + protocol: "stackingdao", + blockHeight: BigInt(data.apply[0].block_identifier.index), + timestamp: new Date(data.apply[0].timestamp * 1000), + sender, + action: "stackingdao-deposit", + data: { + outAmount: BigInt(stxTransferEvent.data.amount), + outToken: "STX", + inAmount: BigInt(stStxMintEvent.data.amount), + inToken: stStxMintEvent.data.asset_identifier, + }, + } satisfies InsertTransaction; + }); + + for (const transaction of transactionsToInsert) { + await getOrInsertToken(transaction.data.inToken); + await getOrInsertToken(transaction.data.outToken); + } + + if (transactionsToInsert.length > 0) { + await db + .insert(transactionTable) + .values(transactionsToInsert) + .onConflictDoUpdate({ + target: transactionTable.txId, + set: conflictUpdateSetAllColumns(transactionTable), + }); + } + + return Response.json({ ok: true }); +} diff --git a/src/app/api/chainhooks/stackingdao/withdraw/route.ts b/src/app/api/chainhooks/stackingdao/withdraw/route.ts new file mode 100644 index 0000000..b628f17 --- /dev/null +++ b/src/app/api/chainhooks/stackingdao/withdraw/route.ts @@ -0,0 +1,72 @@ +import { db } from "@/db/db"; +import { type InsertTransaction, transactionTable } from "@/db/schema"; +import { conflictUpdateSetAllColumns } from "@/db/utils"; +import type { + ChainhookPayload, + ChainhookReceiptEventFTBurnEvent, + ChainhookReceiptEventSTXTransferEvent, +} from "@/lib/chainhooks"; +import { getOrInsertToken } from "@/lib/currencies"; + +export const dynamic = "force-dynamic"; + +export async function POST(request: Request) { + const data: ChainhookPayload = await request.json(); + + const transactionsToInsert = data.apply[0].transactions + .filter((transactionToProcess) => transactionToProcess.metadata.success) + .map((transactionToProcess) => { + const sender = transactionToProcess.metadata.sender; + const transferEvents = transactionToProcess.metadata.receipt.events + // Events are not always in order so we sort them by index + .sort((a, b) => a.position.index - b.position.index) + .filter( + ( + event, + ): event is + | ChainhookReceiptEventSTXTransferEvent + | ChainhookReceiptEventFTBurnEvent => + event.type === "STXTransferEvent" || event.type === "FTBurnEvent", + ); + const stxTransferEvent = transferEvents.filter( + (event) => + event.type === "STXTransferEvent" && event.data.recipient === sender, + )[0]; + const stStxBurnEvent = transferEvents.filter( + (event): event is ChainhookReceiptEventFTBurnEvent => + event.type === "FTBurnEvent", + )[0]; + + return { + txId: transactionToProcess.transaction_identifier.hash, + protocol: "stackingdao", + blockHeight: BigInt(data.apply[0].block_identifier.index), + timestamp: new Date(data.apply[0].timestamp * 1000), + sender, + action: "stackingdao-withdraw", + data: { + inAmount: BigInt(stxTransferEvent.data.amount), + inToken: "STX", + outAmount: BigInt(stStxBurnEvent.data.amount), + outToken: stStxBurnEvent.data.asset_identifier, + }, + } satisfies InsertTransaction; + }); + + for (const transaction of transactionsToInsert) { + await getOrInsertToken(transaction.data.inToken); + await getOrInsertToken(transaction.data.outToken); + } + + if (transactionsToInsert.length > 0) { + await db + .insert(transactionTable) + .values(transactionsToInsert) + .onConflictDoUpdate({ + target: transactionTable.txId, + set: conflictUpdateSetAllColumns(transactionTable), + }); + } + + return Response.json({ ok: true }); +} diff --git a/src/components/Transaction/Action/StackingDAO.tsx b/src/components/Transaction/Action/StackingDAO.tsx new file mode 100644 index 0000000..ca051bd --- /dev/null +++ b/src/components/Transaction/Action/StackingDAO.tsx @@ -0,0 +1,28 @@ +import type { + SelectTransactionActionStackingDAODeposit, + SelectTransactionActionStackingDAOWithdraw, +} from "@/db/transactions"; +import { displayPrice } from "@/lib/currencies"; +import { Text } from "@radix-ui/themes"; + +interface TransactionActionStackingDAOProps { + transaction: + | SelectTransactionActionStackingDAODeposit + | SelectTransactionActionStackingDAOWithdraw; +} + +export const TransactionActionStackingDAO = ({ + transaction, +}: TransactionActionStackingDAOProps) => { + return ( + <> + + {transaction.action === "stackingdao-deposit" ? "Deposit" : "Withdraw"} + {" "} + {displayPrice(transaction.data.outAmount, transaction.outToken.decimals)}{" "} + {transaction.outToken.symbol} for{" "} + {displayPrice(transaction.data.inAmount, transaction.inToken.decimals)}{" "} + {transaction.inToken.symbol} + + ); +}; diff --git a/src/components/Transaction/TransactionRow.tsx b/src/components/Transaction/TransactionRow.tsx index ddbdd9c..0b000fa 100644 --- a/src/components/Transaction/TransactionRow.tsx +++ b/src/components/Transaction/TransactionRow.tsx @@ -6,6 +6,7 @@ import Link from "next/link"; import { TimeAgo } from "../Shared/TimeAgo"; import { TransactionActionAddLiquidity } from "./Action/AddLiquidity"; import { TransactionActionRemoveLiquidity } from "./Action/RemoveLiquidity"; +import { TransactionActionStackingDAO } from "./Action/StackingDAO"; import { TransactionActionSwap } from "./Action/Swap"; interface TransactionRowProps { @@ -86,6 +87,10 @@ export const TransactionRow = ({ transaction }: TransactionRowProps) => { {transaction.action === "remove-liquidity" ? ( ) : null} + {transaction.action === "stackingdao-deposit" || + transaction.action === "stackingdao-withdraw" ? ( + + ) : null} ); diff --git a/src/db/schema.ts b/src/db/schema.ts index 993b38a..5ce31ae 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -3,6 +3,8 @@ import type { ActionData, ActionDataAddLiquidity, ActionDataRemoveLiquidity, + ActionDataStackingDAODeposit, + ActionDataStackingDAOWithdraw, ActionDataSwap, } from "@/lib/actions"; import type { Protocol } from "@/lib/protocols"; @@ -55,10 +57,27 @@ export type SelectTransactionActionRemoveLiquidityTyped = SelectTransaction & { action: "remove-liquidity"; data: ActionDataRemoveLiquidity; }; + +/** + * StackingDAO + */ +export type SelectTransactionActionStackingDAODepositTyped = + SelectTransaction & { + action: "stackingdao-deposit"; + data: ActionDataStackingDAODeposit; + }; +export type SelectTransactionActionStackingDAOWithdrawTyped = + SelectTransaction & { + action: "stackingdao-withdraw"; + data: ActionDataStackingDAOWithdraw; + }; + export type SelectTransactionTyped = | SelectTransactionActionSwapTyped | SelectTransactionActionAddLiquidityTyped - | SelectTransactionActionRemoveLiquidityTyped; + | SelectTransactionActionRemoveLiquidityTyped + | SelectTransactionActionStackingDAODepositTyped + | SelectTransactionActionStackingDAOWithdrawTyped; export const tokenTable = sqliteTable("token", { /** diff --git a/src/db/transactions.ts b/src/db/transactions.ts index 122b58e..7b06e33 100644 --- a/src/db/transactions.ts +++ b/src/db/transactions.ts @@ -15,6 +15,8 @@ import { type SelectToken, type SelectTransactionActionAddLiquidityTyped, type SelectTransactionActionRemoveLiquidityTyped, + type SelectTransactionActionStackingDAODepositTyped, + type SelectTransactionActionStackingDAOWithdrawTyped, type SelectTransactionActionSwapTyped, type SelectTransactionTyped, tokenTable, @@ -38,10 +40,24 @@ export type SelectTransactionActionRemoveLiquidity = tokenY: SelectToken; }; +export type SelectTransactionActionStackingDAODeposit = + SelectTransactionActionStackingDAODepositTyped & { + inToken: SelectToken; + outToken: SelectToken; + }; + +export type SelectTransactionActionStackingDAOWithdraw = + SelectTransactionActionStackingDAOWithdrawTyped & { + inToken: SelectToken; + outToken: SelectToken; + }; + export type SelectTransactionAction = | SelectTransactionActionSwap | SelectTransactionActionAddLiquidity - | SelectTransactionActionRemoveLiquidity; + | SelectTransactionActionRemoveLiquidity + | SelectTransactionActionStackingDAODeposit + | SelectTransactionActionStackingDAOWithdraw; export const getTransactions = async ({ protocol, @@ -74,6 +90,10 @@ export const getTransactions = async ({ tokenIds.push(transaction.data.tokenX, transaction.data.tokenY); } else if (transaction.action === "remove-liquidity") { tokenIds.push(transaction.data.tokenX, transaction.data.tokenY); + } else if (transaction.action === "stackingdao-deposit") { + tokenIds.push(transaction.data.inToken, transaction.data.outToken); + } else if (transaction.action === "stackingdao-withdraw") { + tokenIds.push(transaction.data.inToken, transaction.data.outToken); } }); const uniqueTokenIds = Array.from(new Set([...tokenIds])); @@ -113,6 +133,18 @@ export const getTransactions = async ({ tokenX: tokenMap[transaction.data.tokenX], tokenY: tokenMap[transaction.data.tokenY], }; + } else if (transaction.action === "stackingdao-deposit") { + return { + ...transaction, + inToken: tokenMap[transaction.data.inToken], + outToken: tokenMap[transaction.data.outToken], + }; + } else if (transaction.action === "stackingdao-withdraw") { + return { + ...transaction, + inToken: tokenMap[transaction.data.inToken], + outToken: tokenMap[transaction.data.outToken], + }; } return transaction; }); diff --git a/src/lib/actions.ts b/src/lib/actions.ts index 4bed9a1..f19383f 100644 --- a/src/lib/actions.ts +++ b/src/lib/actions.ts @@ -1,7 +1,15 @@ import { IconMinus, IconPlus } from "@tabler/icons-react"; import type { Protocol } from "./protocols"; -export const actions = ["swap", "add-liquidity", "remove-liquidity"] as const; +export const actions = [ + // common + "swap", + "add-liquidity", + "remove-liquidity", + // StackingDAO + "stackingdao-deposit", + "stackingdao-withdraw", +] as const; export type Action = (typeof actions)[number]; @@ -25,10 +33,34 @@ export interface ActionDataRemoveLiquidity { tokenY: string; } +/** + * StackingDAO + */ + +export interface ActionDataStackingDAODeposit { + // in always STX + outAmount: bigint; + outToken: string; + // out always stSTX + inAmount: bigint; + inToken: string; +} + +export interface ActionDataStackingDAOWithdraw { + // out always stSTX + outAmount: bigint; + outToken: string; + // in always STX + inAmount: bigint; + inToken: string; +} + export type ActionData = | ActionDataSwap | ActionDataAddLiquidity - | ActionDataRemoveLiquidity; + | ActionDataRemoveLiquidity + | ActionDataStackingDAODeposit + | ActionDataStackingDAOWithdraw; export const actionInfo: { [key in Action]: { label: string; icon?: any }; @@ -44,6 +76,15 @@ export const actionInfo: { label: "Liquidity", icon: IconMinus, }, + /** + * StackingDAO + */ + "stackingdao-deposit": { + label: "Deposit", + }, + "stackingdao-withdraw": { + label: "Withdraw", + }, } as const; export const protocolsActions: { @@ -52,6 +93,7 @@ export const protocolsActions: { alex: ["swap"], arkadiko: ["swap", "add-liquidity", "remove-liquidity"], bitflow: ["swap"], + stackingdao: ["stackingdao-deposit", "stackingdao-withdraw"], stackswap: ["swap"], velar: ["swap"], } as const; diff --git a/src/lib/chainhooks.ts b/src/lib/chainhooks.ts index 3714487..f160afd 100644 --- a/src/lib/chainhooks.ts +++ b/src/lib/chainhooks.ts @@ -53,6 +53,8 @@ export interface ChainhookPayload { type ChainhookReceiptEvent = | ChainhookReceiptEventSTXTransferEvent | ChainhookReceiptEventFTTransferEvent + | ChainhookReceiptEventFTMintEvent + | ChainhookReceiptEventFTBurnEvent | ChainhookReceiptEventSmartContractEvent; export interface ChainhookReceiptEventSTXTransferEvent { @@ -80,6 +82,30 @@ export interface ChainhookReceiptEventFTTransferEvent { type: "FTTransferEvent"; } +export interface ChainhookReceiptEventFTMintEvent { + data: { + amount: string; + asset_identifier: string; + recipient: string; + }; + position: { + index: number; + }; + type: "FTMintEvent"; +} + +export interface ChainhookReceiptEventFTBurnEvent { + data: { + amount: string; + asset_identifier: string; + recipient: string; + }; + position: { + index: number; + }; + type: "FTBurnEvent"; +} + export interface ChainhookReceiptEventSmartContractEvent { data: unknown; position: { diff --git a/src/lib/protocols.ts b/src/lib/protocols.ts index 6f524c2..a330b28 100644 --- a/src/lib/protocols.ts +++ b/src/lib/protocols.ts @@ -4,6 +4,7 @@ export const protocols = [ "stackswap", "velar", "bitflow", + "stackingdao", ] as const; export type Protocol = (typeof protocols)[number]; @@ -32,6 +33,12 @@ export const protocolsInfo = { website: "https://www.bitflow.finance/", x: "https://twitter.com/Bitflow_Finance", }, + stackingdao: { + name: "StackingDAO", + description: "Liquid stacking on Stacks.", + website: "https://www.stackingdao.com/", + x: "https://twitter.com/StackingDao", + }, stackswap: { name: "StackSwap", description: