UNPKG

soroswap-utils

Version:

Utilities for interacting with Soroswap, the decentralized exchange (DEX) on Soroban, which is the smart contracts platform of the Stellar network.

100 lines (89 loc) 3.12 kB
import type { RawTokenAdminEvent, RawTokenEvent, TokenAdminEvent, TokenApproveEvent, TokenBurnEvent, TokenClawbackEvent, TokenEvent, TokenMintEvent, TokenSetAdminEvent, TokenSetAuthorizedEvent, TokenTransferEvent, } from "../types"; import { parseTokenProperties } from "./common"; const parseTokenApproveEvent = (rawEvent: RawTokenEvent): TokenApproveEvent => ({ ...parseTokenProperties(rawEvent), amount: BigInt(rawEvent.value), expirationLedger: Number(rawEvent.value), ownerAddress: rawEvent.topic2, spenderAddress: rawEvent.topic3, }); const parseTokenBurnEvent = (rawEvent: RawTokenEvent): TokenBurnEvent => ({ ...parseTokenProperties(rawEvent), amount: BigInt(rawEvent.value), ownerAddress: rawEvent.topic2, }); const parseTokenClawbackEvent = (rawEvent: RawTokenAdminEvent): TokenClawbackEvent => ({ ...parseTokenProperties(rawEvent), adminAddress: rawEvent.topic2, amount: BigInt(rawEvent.value), targetAddress: rawEvent.topic3, }); const parseTokenMintEvent = (rawEvent: RawTokenAdminEvent): TokenMintEvent => ({ ...parseTokenProperties(rawEvent), adminAddress: rawEvent.topic2, amount: BigInt(rawEvent.value), recipientAddress: rawEvent.topic3, }); const parseTokenSetAdminEvent = (rawEvent: RawTokenAdminEvent): TokenSetAdminEvent => ({ ...parseTokenProperties(rawEvent), adminAddress: rawEvent.topic2, newAdminAddress: rawEvent.value, }); const parseTokenSetAuthorizedEvent = (rawEvent: RawTokenAdminEvent): TokenSetAuthorizedEvent => ({ ...parseTokenProperties(rawEvent), adminAddress: rawEvent.topic2, isAuthorized: Boolean(rawEvent.value), targetAddress: rawEvent.topic3, }); const parseTokenTransferEvent = (rawEvent: RawTokenEvent): TokenTransferEvent => ({ ...parseTokenProperties(rawEvent), amount: BigInt(rawEvent.value), recipientAddress: rawEvent.topic3, senderAddress: rawEvent.topic2, }); const parseSorobanTokenEvent = ( rawEvent: RawTokenEvent | RawTokenAdminEvent, ): TokenEvent | TokenAdminEvent => { // These are emitted by SoroswapPair contracts but their shape is determined // by the SorobanToken interface, with topic1 as the event type. switch (rawEvent.topic1) { case "approve": { return parseTokenApproveEvent(rawEvent); } case "burn": { return parseTokenBurnEvent(rawEvent); } case "clawback": { return parseTokenClawbackEvent(rawEvent); } case "mint": { return parseTokenMintEvent(rawEvent); } case "set_admin": { return parseTokenSetAdminEvent(rawEvent); } case "set_authorized": { return parseTokenSetAuthorizedEvent(rawEvent); } case "transfer": { return parseTokenTransferEvent(rawEvent); } default: { // This should be unreachable, as the cases above are exhaustive. throw new Error("Unknown token event type."); } } }; export { parseSorobanTokenEvent };