---
# System prepended metadata

title: Evaluation of adoption PancakeSwap for GoodDollar Protocol needs

---

# Evaluation of adoption PancakeSwap for GoodDollar Protocol needs

Repo to analyse: https://github.com/pancakeswap/pancake-swap-interface-v1

## Use fuse network (2 pt)

Chain connection: React hook [src/hooks/useAuth.ts](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/hooks/useAuth.ts).

App hard-bounded to work with one chain defined in REACT_APP_CHAIN_ID [src/connectors/index.ts](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/connectors/index.ts#L11) and addresses related to chain [src/hooks/useContract.ts]().
Tokens hardcoded for using wrapped BNB [src/hooks/useWrapCallback.ts](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/hooks/useWrapCallback.ts).

Contracts and other chain interactions relies on [ethersproject](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/6ffbc6ae1d16984772fc9859b63ac3dcc79afc29/src/utils/index.ts#L82) and [Web3React](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/6ffbc6ae1d16984772fc9859b63ac3dcc79afc29/src/hooks/index.ts#L12).

Need to walk through app to unbound hooks and logic from BNB.

## Use GD contracts ABI (1 pt)

Just add ABI definitions [src/constants/abis](https://github.com/pancakeswap/pancake-swap-interface-v1/tree/master/src/constants/abis) or add `@gooddollar/goodcontracts` as dependency and invoke via `useContract` hook with appropriate config payload.

## Swap (4 pt)

Interestingly that Swap initially (at least render function) [was decomposed](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/727d28941399b8ef20436babf8ea1d4a33971ce9/src/pages/Swap/index.js#L668) as we want to do in our ProtoUI, but then someone [refactored it](https://github.com/pancakeswap/pancake-swap-interface-v1/commit/e19e150f01077a8af26ed0b67928c2d0f98076f9#diff-3ac763163469bd6658b6eb71be59bef5c9f96c9dc2564184684f274d3b173e73), then after a year [rolled back](https://github.com/pancakeswap/pancake-swap-interface-v1/commit/095beae0c2219b2ddc20ffbaad395539e58b5691#diff-d2d2d34074b22ac06988a155c74cca892a97f5bb4e343d933a1a4f357d4bf888) and file starts acquire and more complicated cases and without good one original decomposition.

Nowadays it is sphaghetti one-filer component https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx
with a lot of problems:

1. render function as single return statement over 200 lines of code.
At least should split into smaller render function.

2. magic numbers even in translateable strings https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L380 and somewhere not translated at all https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L409

3. hack cases both in logic https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L296 and in markup https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L354 

4. mixing logic with presentation https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L508

5. still declaring styled components inside business-logic components https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L42

6. other extras that we won't need:
https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/pages/Swap/index.tsx#L107


Actions needed:
1. Reduce 570 lines into ~200 after throwing out non-needed features and hacks.
2. Split render function into smaller blocks.
3. Debug resulting hooks as whole logic layered on React hooks.

## Display balance in G$ (1 pt)

Provide G$ balance address for resolving `balanceOf` inside [useTokenBalances hooks](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/state/wallet/hooks.ts#L60).

`useInterval` used only on [token list updating](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/state/lists/updater.ts#L29) with interval of 10m.

Need to implement own background balance updater.

## Claim UI and action (3 pt)

1. Compose layout based on available components https://github.com/pancakeswap/pancake-toolkit.

2. Create confirmation/error modal like [Confirm Swap](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/components/swap/ConfirmSwapModal.tsx).

3. Write pre-claim and claim hooks, invoke with [useContract](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/hooks/useContract.ts#L15). 

5. Listen for event – does not found how to. [ApproveCallback](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/hooks/useApproveCallback.ts) not seems relevant.

## In doubt

1. States based on react-redux [src/state](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/state/index.ts). Luckily there are no saga, `yield`s and generators.

2. Business logic based on React hooks [src/hooks](https://github.com/pancakeswap/pancake-swap-interface-v1/tree/master/src/hooks). No pure js classes, binded with React forever.

3. Checking user logged state via [background hook](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/hooks/index.ts#L53).

4. Drop unnecessary menu items [here](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/components/Menu/config.ts).


Can not judge over rest of React code, but from my PoV:

1. codebase could be reduced on 30-40%;

2. mixing in-file css (like [this modal](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/components/TokenWarningModal/index.tsx#L23) or [this input](https://github.com/pancakeswap/pancake-swap-interface-v1/blob/master/src/components/NumericalInput/index.tsx)) when pre-ready uikit exists indicates problems or in uikit (not every possible) or in code quality (reinventing invented and DRY);

3. in-file css not support adaptivity – potential problems on mobile;

4. strange and still not fixed [layout/scroll bugs](https://monosnap.com/file/IzIuqUgYNCF3EOyCLT3utdLnCkpQAB).



## Good points

1. Settled tests for blockchain interactions. Based on Cypress.
    cypress/integration/remove-liquidity.test.ts.

2. Settled localisation workflow with Crowdin. But somewhere magic numbers in TranslateString instead of strings/t-wrappers as it done in [primary repo](https://github.com/pancakeswap/pancake-frontend/blob/develop/src/views/Home/components/CakeStats.tsx#L36).

3. Ready UI kit: https://github.com/pancakeswap/pancake-toolkit based on [React Storybook](https://storybook.js.org/docs/react/get-started/introduction). But not used in full.

4. Way clean file stucture. But [primary repo](https://github.com/pancakeswap/pancake-frontend/tree/develop/src/views/) got better organisation.
