Skip to content

Commit

Permalink
Improve folder structure and name (#29)
Browse files Browse the repository at this point in the history
* rename model folder to contracts

* move models into entities

* - rename PositionModel to Position
- rename MarketModel to Market

* - move contracts into hooks, since they hooks to connects with contracts
- move tradeTypeMathOperation into trade file since it's not a hook, rename it to tradeValue
  • Loading branch information
Diogomartf authored May 16, 2024
1 parent f32ec63 commit a2ebade
Show file tree
Hide file tree
Showing 21 changed files with 61 additions and 42 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Next dapp starter kit

This is a template meant to kickstart dapps.

![Next dapp starter kit](/public/next-dapp-starter-kit.png)
Expand All @@ -25,3 +26,17 @@ Run the development server:
```bash
bun dev
```

## Folder structure

### Entities

Entities is where business logic lives. Instead of having that spread out on components we create classes with logic.

**Markets**

Logic associated with Omen markets like Outcome, Position and Market.

**Tokens**

Logic related to blockchain tokens like Token, Currency, NativeCurrency
13 changes: 6 additions & 7 deletions app/components/CardBet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ import { Card } from "@/app/components/ui";
import { UserPosition } from "@/queries/conditional-tokens/types";
import { getConditionMarket, getMarketUserTrades } from "@/queries/omen";
import { remainingTime } from "@/utils/dates";
import { MarketModel, PositionModel } from "@/models";
import { tradeTypeMathOperation } from "@/model/market";
import { Market, Position, valueByTrade } from "@/entities";
import { redeemPositions } from "@/hooks/contracts";
import { WXDAI } from "@/constants";
import { redeemPositions } from "@/model/conditionalTokens";
import { waitForTransactionReceipt } from "wagmi/actions";
import { useState } from "react";
import { ModalId, useModalContext } from "@/context/ModalContext";
Expand All @@ -26,7 +25,7 @@ interface BetProps {
}

export const CardBet = ({ userPosition }: BetProps) => {
const position = new PositionModel(userPosition.position);
const position = new Position(userPosition.position);

const config = useConfig();
const { address } = useAccount();
Expand All @@ -45,7 +44,7 @@ export const CardBet = ({ userPosition }: BetProps) => {

const market =
data?.conditions[0] &&
new MarketModel(data?.conditions[0]?.fixedProductMarketMakers[0]);
new Market(data?.conditions[0]?.fixedProductMarketMakers[0]);

const outcomeIndex = position.outcomeIndex - 1;

Expand All @@ -66,7 +65,7 @@ export const CardBet = ({ userPosition }: BetProps) => {
userTrades?.fpmmTrades.reduce((acc, trade) => {
const type = trade.type;
const collateralAmountUSD = parseFloat(trade.collateralAmountUSD);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
}, 0) ?? 0;

const outcomeBalance =
Expand All @@ -75,7 +74,7 @@ export const CardBet = ({ userPosition }: BetProps) => {
const collateralAmountUSD = parseFloat(
formatEther(trade.outcomeTokensTraded as bigint)
);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
}, 0) ?? 0;

const balance = outcomeBalance ? outcomeBalance.toFixed(2) : "-";
Expand Down
6 changes: 4 additions & 2 deletions app/components/ConfirmTrade.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ import { SLIPPAGE, SwapDirection, SwapState } from ".";
import { useState } from "react";
import { waitForTransactionReceipt, writeContract } from "wagmi/actions";
import MarketABI from "@/abi/market.json";
import { CONDITIONAL_TOKEN_CONTRACT_ADDRESS } from "@/model/conditionalTokens";
import {
CONDITIONAL_TOKEN_CONTRACT_ADDRESS,
useReadCalcSellAmount,
} from "@/hooks/contracts";
import ConditionalTokensABI from "@/abi/conditionalTokens.json";
import { addFraction, removeFraction } from "@/utils/price";
import { useConfig } from "wagmi";
import { Address, erc20Abi, formatEther, parseEther } from "viem";
import { useReadCalcSellAmount } from "@/model/market";
import { WXDAI } from "@/constants";
import { TransactionModal } from "./TransactionModal";

Expand Down
7 changes: 3 additions & 4 deletions app/components/Swapbox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import { useEffect, useState } from "react";
import { erc20Abi, formatEther, parseEther, Address } from "viem";
import { useAccount, useReadContract } from "wagmi";
import { ConnectButton } from ".";
import { useReadCalcBuyAmount } from "@/model/market";
import { Outcome, Token } from "@/entities";
import { FixedProductMarketMaker } from "@/queries/omen";
import {
CONDITIONAL_TOKEN_CONTRACT_ADDRESS,
useReadBalance,
} from "@/model/conditionalTokens";
useReadCalcBuyAmount,
} from "@/hooks/contracts";
import ConditionalTokensABI from "@/abi/conditionalTokens.json";
import {
calcSellAmountInCollateral,
Expand All @@ -22,7 +22,6 @@ import {
import { ConfirmTrade } from "./ConfirmTrade";
import { ModalId, useModalContext } from "@/context/ModalContext";
import { WXDAI } from "@/constants";
import { MarketModel } from "../../models";

export const SLIPPAGE = 0.01;
const ONE_UNIT = "1";
Expand Down Expand Up @@ -201,7 +200,7 @@ export const Swapbox = ({ market }: { market: FixedProductMarketMaker }) => {
<SwapInput
title="You Swap"
value={tokenAmountIn}
onChange={(event) => {
onChange={event => {
setTokenAmountIn(event.target.value);
}}
onClick={currentState.changeInToken}
Expand Down
19 changes: 9 additions & 10 deletions app/components/UserBets.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ import { useAccount } from "wagmi";
import { formatEther } from "viem";
import { cx } from "class-variance-authority";
import { waitForTransactionReceipt } from "wagmi/actions";
import { MarketModel } from "@/models";
import { Market, valueByTrade } from "@/entities";
import { useState } from "react";
import { Button, Icon, Logo, Tag } from "swapr-ui";
import { WXDAI } from "@/constants";
import { TransactionModal } from ".";
import { ModalId, useModalContext } from "@/context/ModalContext";
import { config } from "@/providers/config";
import { redeemPositions, useReadBalance } from "@/model/conditionalTokens";
import { tradeTypeMathOperation } from "@/model/market";
import { redeemPositions, useReadBalance } from "@/hooks/contracts";
import { getCondition } from "@/queries/conditional-tokens";
import { FixedProductMarketMaker, getMarketUserTrades } from "@/queries/omen";

Expand Down Expand Up @@ -53,15 +52,15 @@ export const UserBets = ({ market }: UserBets) => {
});

const [outcome0UserTrades, outcome1UserTrades] = [
userTrades?.fpmmTrades.filter((trade) => trade.outcomeIndex === "0") || [],
userTrades?.fpmmTrades.filter((trade) => trade.outcomeIndex === "1") || [],
userTrades?.fpmmTrades.filter(trade => trade.outcomeIndex === "0") || [],
userTrades?.fpmmTrades.filter(trade => trade.outcomeIndex === "1") || [],
];

const outcome0CollateralAmountUSDSpent = outcome0UserTrades.reduce(
(acc, trade) => {
const type = trade.type;
const collateralAmountUSD = parseFloat(trade.collateralAmountUSD);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
},
0
);
Expand All @@ -70,7 +69,7 @@ export const UserBets = ({ market }: UserBets) => {
(acc, trade) => {
const type = trade.type;
const collateralAmountUSD = parseFloat(trade.collateralAmountUSD);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
},
0
);
Expand All @@ -85,15 +84,15 @@ export const UserBets = ({ market }: UserBets) => {
const collateralAmountUSD = parseFloat(
formatEther(trade.outcomeTokensTraded as bigint)
);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
}, 0);

const outcome1TradedBalance = outcome1UserTrades.reduce((acc, trade) => {
const type = trade.type;
const collateralAmountUSD = parseFloat(
formatEther(trade.outcomeTokensTraded as bigint)
);
return tradeTypeMathOperation[type](acc, collateralAmountUSD);
return valueByTrade[type](acc, collateralAmountUSD);
}, 0);

const outcomesTradedBalance = [outcome0TradedBalance, outcome1TradedBalance];
Expand All @@ -119,7 +118,7 @@ export const UserBets = ({ market }: UserBets) => {
)
return null;

const marketModel = new MarketModel(market);
const marketModel = new Market(market);

const { condition } = conditionData;
const isResolved = condition.resolved;
Expand Down
4 changes: 2 additions & 2 deletions app/markets/MarketDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Button, IconButton, Tag } from "swapr-ui";
import { remainingTime } from "@/utils/dates";
import Link from "next/link";
import { Address } from "viem";
import { MarketModel } from "@/models";
import { Market } from "@/entities";
import { UserBets } from "../components/UserBets";

interface MarketDetailsProps {
Expand All @@ -25,7 +25,7 @@ export const MarketDetails = ({ id }: MarketDetailsProps) => {
return <LoadingMarketDetails />;

const market = data.fixedProductMarketMaker;
const marketModel = new MarketModel(market);
const marketModel = new Market(market);

const closingDate = new Date(+market.openingTimestamp * 1000);

Expand Down
5 changes: 2 additions & 3 deletions entities/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export * from "./token";
export * from "./outcome";
export * from "./nativeCurrency";
export * from "./tokens";
export * from "./markets";
4 changes: 4 additions & 0 deletions entities/markets/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from "./market";
export * from "./position";
export * from "./outcome";
export * from "./trade";
2 changes: 1 addition & 1 deletion models/Market.ts → entities/markets/market.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { FixedProductMarketMaker } from "@/queries/omen";
import { fromHex } from "viem";
import { Outcome } from "@/entities";

export class MarketModel {
export class Market {
data: FixedProductMarketMaker;
closingDate: Date;
answer: number | null;
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions models/Position.ts → entities/markets/position.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Position } from "@/queries/conditional-tokens/types";
import { Position as ConditionalTokenPosition } from "@/queries/conditional-tokens/types";

export class PositionModel {
export class Position {
conditionId: string;
outcomeIndex: number;
outcomes?: string[] | null;

constructor(position: Position) {
constructor(position: ConditionalTokenPosition) {
this.conditionId = position.conditionIdsStr;
this.outcomeIndex = position.indexSets[0];
this.outcomes = position.conditions?.[0]?.outcomes;
Expand Down
8 changes: 8 additions & 0 deletions entities/markets/trade.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { TradeType } from "@/queries/omen/types";

export const valueByTrade = {
[TradeType.Buy]: (previousValue: number, newValue: number) =>
previousValue + newValue,
[TradeType.Sell]: (previousValue: number, newValue: number) =>
previousValue - newValue,
};
File renamed without changes.
File renamed without changes.
2 changes: 2 additions & 0 deletions entities/tokens/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./token";
export * from "./nativeCurrency";
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 2 additions & 0 deletions hooks/contracts/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./conditionalTokens";
export * from "./market";
8 changes: 0 additions & 8 deletions model/market.ts → hooks/contracts/market.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import MarketABI from "@/abi/market.json";
import { Abi, Address, parseEther } from "viem";
import { UseReadContractParameters, useReadContract } from "wagmi";
import { TradeType } from "@/queries/omen";

export const useReadMarketContract = ({
address,
Expand Down Expand Up @@ -45,10 +44,3 @@ export const useReadCalcSellAmount = (
query: { enabled: !!tokenOutAmount },
});
};

export const tradeTypeMathOperation = {
[TradeType.Buy]: (previousValue: number, newValue: number) =>
previousValue + newValue,
[TradeType.Sell]: (previousValue: number, newValue: number) =>
previousValue - newValue,
};
2 changes: 0 additions & 2 deletions models/index.ts

This file was deleted.

0 comments on commit a2ebade

Please sign in to comment.