diff --git a/SIMPLE-INTEGRATION-README.md b/SIMPLE-INTEGRATION-README.md new file mode 100644 index 000000000..1a4a75850 --- /dev/null +++ b/SIMPLE-INTEGRATION-README.md @@ -0,0 +1,47 @@ + +# B.Protocol +The BAMM (bprotocol automatic market maker) +provides automatic rebalancing over Liquity's stability pool. + +it will swap your ETH with LUSD automaticly after the stabilty pool preforms a liquidation, +this will maximize your LQTY gains as the stability pool only rewards LUSD deposits + +## integrating the BAMM with existing Liquity frontends and interfaces +any existing LQTY front end can integrate the BAMM into their interface to gain extra fees from the rebalancing process, +read more to learn about the verious integration options + +1) integrating directly with the smart contract like [pickle.finance](https://app.pickle.finance/farms) did + +2) Front-End intgration using our widgets and snipets, +the quicker & simpler approch + +## BAMM front-end integration +there are sevral ways to integrate our front-end with your exsiting front end and we will demonstrate a few options. + +1) integrate our front end as a widget into an exsiting page or modal window. + 1) in this example our widget in red border inside the original liquity app [widget example](https://integration-example-3.bprotocol.workers.dev) + +1) integrate our front-end as a page in your exsiting app. + 1) click on the red B.PROTOCOL navigation link to see our widget in red border as a page of the original liquity app [page example](https://integration-example-1.bprotocol.workers.dev/) + +1) integrate our front-end as a separate single page application linked to your website + 1) click on the red B.PROTOCOL navigation link to see the SPA on the same domain using the same meta mask connection [seperate singel page application example](https://integration-example-2.bprotocol.workers.dev/) + +### steps to integrate our front-end in your exsiting app +1) git clone the repo +2) install and compile all TS files run ```yarn install``` +5) find mainnet.json addresses file change the BAMM address in to your version of the BAMM contract +6) ```cd packages/dev-frontend``` +6) run ```yarn start``` to test that the app is working as expected. +7) in package.json change "homepage" property to what ever directory name you wish to serve our widget from +8) ```yarn build``` +9) upload the contents of the build folder to your website/app hosting under the directory you chose as the "homepage" +10) use one of these snipets to embad in your website/app + + 1) page in app: `````` + 2) widget: `````` + 3) or a simple link: ```bamm``` + +for questions or other integration options please reach out on our [Discord channel](https://discord.com/invite/bJ4guuw) + + diff --git a/package.json b/package.json index d046dd94e..e80af426d 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,5 @@ { + "version": "1.1.1", "name": "liquity", "private": true, "workspaces": { diff --git a/packages/dev-frontend/src/LiquityFrontend.tsx b/packages/dev-frontend/src/LiquityFrontend.tsx index f79af3597..8614b8a8b 100644 --- a/packages/dev-frontend/src/LiquityFrontend.tsx +++ b/packages/dev-frontend/src/LiquityFrontend.tsx @@ -16,11 +16,24 @@ import { PageSwitcher } from "./pages/PageSwitcher"; import { Farm } from "./pages/Farm"; import { RiskyTrovesPage } from "./pages/RiskyTrovesPage"; import { RedemptionPage } from "./pages/RedemptionPage"; +import { JustSP } from "./pages/JustSP"; import { TroveViewProvider } from "./components/Trove/context/TroveViewProvider"; import { StabilityViewProvider } from "./components/Stability/context/StabilityViewProvider"; import { StakingViewProvider } from "./components/Staking/context/StakingViewProvider"; import { FarmViewProvider } from "./components/Farm/context/FarmViewProvider"; +import { ConnectPage } from "./components/ConnectPage" + +const fullPageStyle = { + position: "fixed", + margin: 0, + display: "block", + top: 0, + left: 0, + width: "100%", + height: "100%", + zIndex: 1 +} as React.CSSProperties; type LiquityFrontendProps = { loader?: React.ReactNode; @@ -68,6 +81,14 @@ export const LiquityFrontend: React.FC = ({ loader }) => { + + + + +
+ +
+
diff --git a/packages/dev-frontend/src/components/ConnectPage.tsx b/packages/dev-frontend/src/components/ConnectPage.tsx index 160d77518..257208dbf 100644 --- a/packages/dev-frontend/src/components/ConnectPage.tsx +++ b/packages/dev-frontend/src/components/ConnectPage.tsx @@ -38,7 +38,7 @@ const Item: React.FC = ({icon, title, text, link}) => { height: "73px", }, }}> - + = ({children}) => { }, }}> Stabilize
Liquity Protocol} text="B.Protocol v2 and its novel Backstop AMM (B.AMM) automates the rebalancing of Liquity Stability Pool to maintain its strength. Read more on how the Liquity @@ -226,7 +226,7 @@ export const ConnectPage: React.FC = ({children}) => { link="https://docs.liquity.org/faq/stability-pool-and-liquidations" /> Get Passive
Yield on Your LUSD} text="By using B.Protocol to deposit your LUSD into Liquity Stability Pool, you can save the manual operation of selling your accumulated ETH back to LUSD every time a liquidation is taking place. @@ -234,9 +234,9 @@ export const ConnectPage: React.FC = ({children}) => { link="https://medium.com/b-protocol/b-protocol-liquity-integration-is-live-1342605e7cfb" /> Using
- B.Protocl V2} + B.Protocol V2} text="The integration of Liqity with B.Protocol v2 is a step forward towards a more stabilized DeFi ecosystem. Read more about the novel B.AMM design that enables that" link="https://medium.com/b-protocol/b-amm-efficient-automated-market-maker-for-defi-liquidations-fea7b0fdc0c5" diff --git a/packages/dev-frontend/src/components/Header.tsx b/packages/dev-frontend/src/components/Header.tsx index 8c41528e2..6e83f2692 100644 --- a/packages/dev-frontend/src/components/Header.tsx +++ b/packages/dev-frontend/src/components/Header.tsx @@ -15,13 +15,24 @@ const select = ({ frontend }: LiquityStoreState) => ({ frontend }); +const shouldHideNav = () => { + const searchString = window.location.href.split("?")[1] + const urlParams = new URLSearchParams(searchString); + const hideNav = urlParams.get('hideNav'); + console.log("=============================") + console.log({hideNav}) + return !!hideNav +} + export const Header: React.FC = ({ children }) => { const { config: { frontendTag } } = useLiquity(); const { frontend } = useLiquitySelector(select); const isFrontendRegistered = frontendTag === AddressZero || frontend.status === "registered"; - + if(shouldHideNav()){ + return null + } return ( diff --git a/packages/dev-frontend/src/components/LiquityLogo.tsx b/packages/dev-frontend/src/components/LiquityLogo.tsx index 5fd835ad0..63cae1082 100644 --- a/packages/dev-frontend/src/components/LiquityLogo.tsx +++ b/packages/dev-frontend/src/components/LiquityLogo.tsx @@ -7,6 +7,6 @@ type LiquityLogoProps = React.ComponentProps & { export const LiquityLogo: React.FC = ({ height, ...boxProps }) => ( - + ); diff --git a/packages/dev-frontend/src/components/Stability/ActiveDeposit.tsx b/packages/dev-frontend/src/components/Stability/ActiveDeposit.tsx index fa604c91b..853a312b4 100644 --- a/packages/dev-frontend/src/components/Stability/ActiveDeposit.tsx +++ b/packages/dev-frontend/src/components/Stability/ActiveDeposit.tsx @@ -15,6 +15,7 @@ import { useStabilityView } from "./context/StabilityViewContext"; import { RemainingLQTY } from "./RemainingLQTY"; import { Yield } from "./Yield"; import { InfoIcon } from "../InfoIcon"; +import { justSpStyle, StabilityProps } from "./Stability" const selector = ({ stabilityDeposit, trove, lusdInStabilityPool }: LiquityStoreState) => ({ stabilityDeposit, @@ -22,7 +23,7 @@ const selector = ({ stabilityDeposit, trove, lusdInStabilityPool }: LiquityStore lusdInStabilityPool }); -export const ActiveDeposit: React.FC = () => { +export const ActiveDeposit: React.FC = ({justSP}) => { const { dispatchEvent } = useStabilityView(); const { stabilityDeposit, trove, lusdInStabilityPool } = useLiquitySelector(selector); @@ -50,8 +51,9 @@ export const ActiveDeposit: React.FC = () => { const ethDiffInUsd = stabilityDeposit.currentUSD.sub(stabilityDeposit.currentLUSD) const ethIsImportant = (ethDiffInUsd.div(stabilityDeposit.currentUSD)).gt(1/1000) + const style = justSP ? justSpStyle : {} return ( - + Stability Pool {!isWaitingForTransaction && ( diff --git a/packages/dev-frontend/src/components/Stability/NoDeposit.tsx b/packages/dev-frontend/src/components/Stability/NoDeposit.tsx index 11e0db2b8..d65c2ff6c 100644 --- a/packages/dev-frontend/src/components/Stability/NoDeposit.tsx +++ b/packages/dev-frontend/src/components/Stability/NoDeposit.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useState, useEffect } from "react"; -import { Card, Heading, Box, Flex, Button, Container, Close, Text } from "theme-ui"; +import { Card, Heading, Box, Flex, Button, Container, Close, Text, Paragraph } from "theme-ui"; import { InfoMessage } from "../InfoMessage"; import { useStabilityView } from "./context/StabilityViewContext"; import { RemainingLQTY } from "./RemainingLQTY"; @@ -7,10 +7,12 @@ import { Yield } from "./Yield"; import { useLiquitySelector } from "@liquity/lib-react"; import { useTransactionFunction } from "../Transaction"; import { useLiquity } from "./../../hooks/LiquityContext"; +import { justSpStyle, StabilityProps } from "./Stability"; +import { InfoIcon } from "../InfoIcon"; - -const selector = ( {bammAllowance}: any) => ({ - bammAllowance +const selector = ( {bammAllowance, lusdBalance}: any) => ({ + bammAllowance, + lusdBalance }); export const UnlockButton: React.FC = props => { @@ -33,17 +35,18 @@ export const UnlockButton: React.FC = props => { ) } -export const NoDeposit: React.FC = props => { +export const NoDeposit: React.FC = props => { const { liquity } = useLiquity(); - const { bammAllowance } = useLiquitySelector(selector); + const { bammAllowance, lusdBalance } = useLiquitySelector(selector); const { dispatchEvent } = useStabilityView(); const handleOpenTrove = useCallback(() => { dispatchEvent("DEPOSIT_PRESSED"); }, [dispatchEvent]); + const style = props.justSP ? justSpStyle : {} return ( - + Stability Pool @@ -53,6 +56,19 @@ export const NoDeposit: React.FC = props => { You can earn LUSD and LQTY rewards by depositing LUSD. +
+ {lusdBalance == '0' && + You can mint LUSD here + + + Deposit your LUSD only via B.Protocol for automated rebalancing. + +
+ } + > + } diff --git a/packages/dev-frontend/src/components/Stability/Stability.tsx b/packages/dev-frontend/src/components/Stability/Stability.tsx index 0951bbabe..277033a58 100644 --- a/packages/dev-frontend/src/components/Stability/Stability.tsx +++ b/packages/dev-frontend/src/components/Stability/Stability.tsx @@ -4,7 +4,22 @@ import { ActiveDeposit } from "./ActiveDeposit"; import { NoDeposit } from "./NoDeposit"; import { useStabilityView } from "./context/StabilityViewContext"; -export const Stability: React.FC = props => { +export type StabilityProps = { + justSP?: boolean, +}; + +export const justSpStyle = { + position: "fixed", + margin: [0, 0, 0], + display: "block", + top: "0", + left: "0", + width: "100%", + height: "100%", + zIndex: "1" +} + +export const Stability: React.FC = props => { const { view } = useStabilityView(); switch (view) { diff --git a/packages/dev-frontend/src/components/Stability/StabilityDepositEditor.tsx b/packages/dev-frontend/src/components/Stability/StabilityDepositEditor.tsx index f5e8d93ab..31ef34403 100644 --- a/packages/dev-frontend/src/components/Stability/StabilityDepositEditor.tsx +++ b/packages/dev-frontend/src/components/Stability/StabilityDepositEditor.tsx @@ -24,6 +24,7 @@ import { Icon } from "../Icon"; import { EditableRow, StaticRow } from "../Trove/Editor"; import { LoadingOverlay } from "../LoadingOverlay"; import { InfoIcon } from "../InfoIcon"; +import { justSpStyle } from "./Stability" const select = ({ lusdBalance, lusdInStabilityPool, stabilityDeposit }: LiquityStoreState) => ({ lusdBalance, @@ -36,6 +37,7 @@ type StabilityDepositEditorProps = { editedUSD: Decimal; changePending: boolean; dispatch: (action: { type: "setDeposit"; newValue: Decimalish } | { type: "revert" }) => void; + justSP?: boolean; }; const selectPrice = ({ price }: LiquityStoreState) => price; @@ -45,7 +47,8 @@ export const StabilityDepositEditor: React.FC = ({ editedUSD, changePending, dispatch, - children + children, + justSP }) => { const { lusdBalance, lusdInStabilityPool, stabilityDeposit } = useLiquitySelector(select); const editingState = useState(); @@ -128,8 +131,9 @@ export const StabilityDepositEditor: React.FC = ({ const showOverlay = changePending || waitingForTransaction const showResetButton = edited && !showOverlay + const style = justSP ? justSpStyle : {} return ( - + Stability Pool {showResetButton && ( diff --git a/packages/dev-frontend/src/components/Stability/StabilityDepositManager.tsx b/packages/dev-frontend/src/components/Stability/StabilityDepositManager.tsx index 2f703aab1..9dadce5f7 100644 --- a/packages/dev-frontend/src/components/Stability/StabilityDepositManager.tsx +++ b/packages/dev-frontend/src/components/Stability/StabilityDepositManager.tsx @@ -16,6 +16,7 @@ import { selectForStabilityDepositChangeValidation, validateStabilityDepositChange } from "./validation/validateStabilityDepositChange"; +import { StabilityProps } from "./Stability" const init = ({ stabilityDeposit }: LiquityStoreState) => ({ originalDeposit: stabilityDeposit, @@ -94,7 +95,7 @@ const reduce = ( const transactionId = "stability-deposit"; -export const StabilityDepositManager: React.FC = () => { +export const StabilityDepositManager: React.FC = ({justSP}) => { const [{ originalDeposit, editedUSD, changePending }, dispatch] = useLiquityReducer(reduce, init); const validationContext = useLiquitySelector(selectForStabilityDepositChangeValidation); const { dispatchEvent } = useStabilityView(); @@ -133,6 +134,7 @@ export const StabilityDepositManager: React.FC = () => { editedUSD={editedUSD} changePending={changePending} dispatch={dispatch} + justSP={justSP} > diff --git a/packages/dev-frontend/src/pages/JustSP.tsx b/packages/dev-frontend/src/pages/JustSP.tsx new file mode 100644 index 000000000..af1e1f908 --- /dev/null +++ b/packages/dev-frontend/src/pages/JustSP.tsx @@ -0,0 +1,8 @@ +import { Container } from "theme-ui"; + +import { Trove } from "../components/Trove/Trove"; +import { Stability } from "../components/Stability/Stability"; + +export const JustSP: React.FC = () => ( + +); \ No newline at end of file diff --git a/packages/lib-ethers/src/EthersLiquityConnection.ts b/packages/lib-ethers/src/EthersLiquityConnection.ts index ed25d99d7..9ffd3eb3a 100644 --- a/packages/lib-ethers/src/EthersLiquityConnection.ts +++ b/packages/lib-ethers/src/EthersLiquityConnection.ts @@ -41,6 +41,15 @@ declare const brand: unique symbol; const branded = (t: Omit): T => t as T; +const getExternalBamm = () => { + const searchString = window.location.href.split("?")[1] + const urlParams = new URLSearchParams(searchString); + const externalBammAddress = urlParams.get('bamm'); + console.log("=============================") + console.log({externalBammAddress}) + return externalBammAddress +} + /** * Information about a connection to the Liquity protocol. * @@ -309,6 +318,10 @@ export function _connectByChainId( ): EthersLiquityConnection { const deployment: _LiquityDeploymentJSON = deployments[chainId] ?? panic(new UnsupportedNetworkError(chainId)); + const externalBamm = getExternalBamm() + if(deployment.addresses.bamm && externalBamm){ + deployment.addresses.bamm = externalBamm; + } return connectionFrom( provider,