soroswap-utils
Version:
Utilities for interacting with Soroswap, the decentralized exchange (DEX) on Soroban, which is the smart contracts platform of the Stellar network.
116 lines (104 loc) • 3.96 kB
text/typescript
import type {
ExtendedPairEvent,
ExtendedTokenEventType,
PairDepositEvent,
PairProperEvent,
PairSkimEvent,
PairSwapEvent,
PairSyncEvent,
PairWithdrawEvent,
RawExtendedPairEvent,
RawPairDepositEvent,
RawPairProperEvent,
RawPairSkimEvent,
RawPairSwapEvent,
RawPairSyncEvent,
RawPairWithdrawEvent,
} from "../types";
import { parsePairProperties } from "./common";
import { parseSorobanTokenEvent } from "./token";
const parsePairDepositEvent = (rawEvent: RawPairDepositEvent): PairDepositEvent => ({
...parsePairProperties(rawEvent),
amountOfFirstTokenDeposited: BigInt(rawEvent.amount_0),
amountOfSecondTokenDeposited: BigInt(rawEvent.amount_1),
liquidityPoolTokensMinted: BigInt(rawEvent.liquidity),
newReserveOfFirstToken: BigInt(rawEvent.new_reserve_0),
newReserveOfSecondToken: BigInt(rawEvent.new_reserve_1),
recipientAddress: rawEvent.to,
});
const parsePairSwapEvent = (rawEvent: RawPairSwapEvent): PairSwapEvent => ({
...parsePairProperties(rawEvent),
amountOfFirstTokenIncoming: BigInt(rawEvent.amount_0_in),
amountOfFirstTokenOutgoing: BigInt(rawEvent.amount_0_out),
amountOfSecondTokenIncoming: BigInt(rawEvent.amount_1_in),
amountOfSecondTokenOutgoing: BigInt(rawEvent.amount_1_out),
recipientAddress: rawEvent.to,
});
const parsePairSyncEvent = (rawEvent: RawPairSyncEvent): PairSyncEvent => ({
...parsePairProperties(rawEvent),
newReserveOfFirstToken: BigInt(rawEvent.new_reserve_0),
newReserveOfSecondToken: BigInt(rawEvent.new_reserve_1),
});
const parsePairSkimEvent = (rawEvent: RawPairSkimEvent): PairSkimEvent => ({
...parsePairProperties(rawEvent),
amountOfFirstTokenSkimmed: BigInt(rawEvent.skimmed_0),
amountOfSecondTokenSkimmed: BigInt(rawEvent.skimmed_1),
});
const parsePairWithdrawEvent = (rawEvent: RawPairWithdrawEvent): PairWithdrawEvent => ({
...parsePairProperties(rawEvent),
amountOfFirstTokenWithdrawn: BigInt(rawEvent.amount_0),
amountOfSecondTokenWithdrawn: BigInt(rawEvent.amount_1),
liquidityPoolTokensBurned: BigInt(rawEvent.liquidity),
newReserveOfFirstToken: BigInt(rawEvent.new_reserve_0),
newReserveOfSecondToken: BigInt(rawEvent.new_reserve_1),
recipientAddress: rawEvent.to,
});
const parseSoroswapPairEvent = (rawEvent: RawPairProperEvent): PairProperEvent => {
// SoroswapPair events "proper" have topic2 as the event type.
// We handle separately events that implement the SorobanToken interface;
// those have topic1 as the event type.
switch (rawEvent.topic2) {
case "deposit": {
return parsePairDepositEvent(rawEvent);
}
case "swap": {
return parsePairSwapEvent(rawEvent);
}
case "sync": {
return parsePairSyncEvent(rawEvent);
}
case "skim": {
return parsePairSkimEvent(rawEvent);
}
case "withdraw": {
return parsePairWithdrawEvent(rawEvent);
}
default: {
// This should be unreachable, as the cases above are exhaustive.
throw new Error("Unknown SoroswapPair event type.");
}
}
};
const parsePairEvent = (rawEvent: RawExtendedPairEvent): ExtendedPairEvent => {
if (rawEvent.topic1 === "SoroswapPair") {
return parseSoroswapPairEvent(rawEvent);
}
if (
(
[
"approve",
"burn",
"clawback",
"mint",
"set_admin",
"set_authorized",
"transfer",
] as const satisfies readonly ExtendedTokenEventType[]
).includes(rawEvent.topic1)
) {
return parseSorobanTokenEvent(rawEvent);
}
// This should be unreachable, as the cases above are exhaustive.
throw new Error(`Unknown event type: ${rawEvent.topic1}/${rawEvent.topic2}`);
};
export { parsePairEvent };