From 2779f27c964dc653609b0366888cbd3dfe57c1eb Mon Sep 17 00:00:00 2001 From: William Poulin Date: Fri, 9 Dec 2022 11:57:40 -0500 Subject: [PATCH 1/5] fix(lemma-finance): Cleanup and renaming --- .../assets/LAAVE.png | Bin .../assets/LBTC.png | Bin .../assets/LCRV.png | Bin .../assets/LETH.png | Bin .../assets/LLink.png | Bin .../assets/LPERP.png | Bin .../assets/USDL.png | Bin .../assets/logo.png | Bin .../assets/xLBTC.png | Bin .../assets/xLETH.png | Bin .../assets/xLPERP.png | Bin .../assets/xUSDL.png | Bin .../contracts/abis/perp-lemma.json | 0 .../contracts/abis/synth.json} | 0 .../contracts/abis/usdl.json | 0 .../contracts/abis/x-synth.json} | 0 .../contracts/abis/x-usdl.json} | 0 .../contracts/ethers/PerpLemma.ts | 0 .../contracts/ethers/Synth.ts} | 6 +- .../contracts/ethers/Usdl.ts | 0 .../contracts/ethers/XSynth.ts} | 6 +- .../contracts/ethers/Xusdl.ts | 6 +- .../contracts/ethers/common.ts | 0 .../ethers/factories/PerpLemma__factory.ts | 0 .../ethers/factories/Synth__factory.ts} | 12 +- .../ethers/factories/Usdl__factory.ts | 0 .../ethers/factories/XSynth__factory.ts} | 12 +- .../ethers/factories/Xusdl__factory.ts | 12 +- .../contracts/ethers/factories/index.ts | 6 +- .../contracts/ethers/index.ts | 12 +- .../contracts/index.ts | 28 ++-- src/apps/lemma-finance/index.ts | 3 + .../lemma-finance.definition.ts} | 28 ++-- .../lemma-finance/lemma-finance.module.ts | 24 ++++ .../lemma-finance.balance-fetcher.ts} | 43 +++--- .../lemma-finance.synth.token-fetcher.ts | 120 +++++++++++++++++ .../lemma-finance.usdl.token-fetcher.ts} | 31 ++--- .../lemma-finance.x-synth.token-fetcher.ts | 127 ++++++++++++++++++ .../lemma-finance.xusdl.token-fetcher.ts} | 37 +++-- src/apps/lemmafinance/index.ts | 3 - src/apps/lemmafinance/lemmafinance.module.ts | 24 ---- .../lemmafinance.LemmaSynth.token-fetcher.ts | 123 ----------------- .../lemmafinance.xLemmaSynth.token-fetcher.ts | 119 ---------------- 43 files changed, 388 insertions(+), 394 deletions(-) rename src/apps/{lemmafinance => lemma-finance}/assets/LAAVE.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/LBTC.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/LCRV.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/LETH.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/LLink.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/LPERP.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/USDL.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/logo.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/xLBTC.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/xLETH.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/xLPERP.png (100%) rename src/apps/{lemmafinance => lemma-finance}/assets/xUSDL.png (100%) rename src/apps/{lemmafinance => lemma-finance}/contracts/abis/perp-lemma.json (100%) rename src/apps/{lemmafinance/contracts/abis/lemma-synth.json => lemma-finance/contracts/abis/synth.json} (100%) rename src/apps/{lemmafinance => lemma-finance}/contracts/abis/usdl.json (100%) rename src/apps/{lemmafinance/contracts/abis/x-lemma-synth.json => lemma-finance/contracts/abis/x-synth.json} (100%) rename src/apps/{lemmafinance/contracts/abis/xusdl.json => lemma-finance/contracts/abis/x-usdl.json} (100%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/PerpLemma.ts (100%) rename src/apps/{lemmafinance/contracts/ethers/LemmaSynth.ts => lemma-finance/contracts/ethers/Synth.ts} (99%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/Usdl.ts (100%) rename src/apps/{lemmafinance/contracts/ethers/XLemmaSynth.ts => lemma-finance/contracts/ethers/XSynth.ts} (99%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/Xusdl.ts (99%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/common.ts (100%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/factories/PerpLemma__factory.ts (100%) rename src/apps/{lemmafinance/contracts/ethers/factories/LemmaSynth__factory.ts => lemma-finance/contracts/ethers/factories/Synth__factory.ts} (98%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/factories/Usdl__factory.ts (100%) rename src/apps/{lemmafinance/contracts/ethers/factories/XLemmaSynth__factory.ts => lemma-finance/contracts/ethers/factories/XSynth__factory.ts} (98%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/factories/Xusdl__factory.ts (98%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/factories/index.ts (53%) rename src/apps/{lemmafinance => lemma-finance}/contracts/ethers/index.ts (50%) rename src/apps/{lemmafinance => lemma-finance}/contracts/index.ts (57%) create mode 100644 src/apps/lemma-finance/index.ts rename src/apps/{lemmafinance/lemmafinance.definition.ts => lemma-finance/lemma-finance.definition.ts} (64%) create mode 100644 src/apps/lemma-finance/lemma-finance.module.ts rename src/apps/{lemmafinance/optimism/lemmafinance.balance-fetcher.ts => lemma-finance/optimism/lemma-finance.balance-fetcher.ts} (62%) create mode 100644 src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts rename src/apps/{lemmafinance/optimism/lemmafinance.usdl.token-fetcher.ts => lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts} (75%) create mode 100644 src/apps/lemma-finance/optimism/lemma-finance.x-synth.token-fetcher.ts rename src/apps/{lemmafinance/optimism/lemmafinance.xusdl.token-fetcher.ts => lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts} (66%) delete mode 100644 src/apps/lemmafinance/index.ts delete mode 100644 src/apps/lemmafinance/lemmafinance.module.ts delete mode 100644 src/apps/lemmafinance/optimism/lemmafinance.LemmaSynth.token-fetcher.ts delete mode 100644 src/apps/lemmafinance/optimism/lemmafinance.xLemmaSynth.token-fetcher.ts diff --git a/src/apps/lemmafinance/assets/LAAVE.png b/src/apps/lemma-finance/assets/LAAVE.png similarity index 100% rename from src/apps/lemmafinance/assets/LAAVE.png rename to src/apps/lemma-finance/assets/LAAVE.png diff --git a/src/apps/lemmafinance/assets/LBTC.png b/src/apps/lemma-finance/assets/LBTC.png similarity index 100% rename from src/apps/lemmafinance/assets/LBTC.png rename to src/apps/lemma-finance/assets/LBTC.png diff --git a/src/apps/lemmafinance/assets/LCRV.png b/src/apps/lemma-finance/assets/LCRV.png similarity index 100% rename from src/apps/lemmafinance/assets/LCRV.png rename to src/apps/lemma-finance/assets/LCRV.png diff --git a/src/apps/lemmafinance/assets/LETH.png b/src/apps/lemma-finance/assets/LETH.png similarity index 100% rename from src/apps/lemmafinance/assets/LETH.png rename to src/apps/lemma-finance/assets/LETH.png diff --git a/src/apps/lemmafinance/assets/LLink.png b/src/apps/lemma-finance/assets/LLink.png similarity index 100% rename from src/apps/lemmafinance/assets/LLink.png rename to src/apps/lemma-finance/assets/LLink.png diff --git a/src/apps/lemmafinance/assets/LPERP.png b/src/apps/lemma-finance/assets/LPERP.png similarity index 100% rename from src/apps/lemmafinance/assets/LPERP.png rename to src/apps/lemma-finance/assets/LPERP.png diff --git a/src/apps/lemmafinance/assets/USDL.png b/src/apps/lemma-finance/assets/USDL.png similarity index 100% rename from src/apps/lemmafinance/assets/USDL.png rename to src/apps/lemma-finance/assets/USDL.png diff --git a/src/apps/lemmafinance/assets/logo.png b/src/apps/lemma-finance/assets/logo.png similarity index 100% rename from src/apps/lemmafinance/assets/logo.png rename to src/apps/lemma-finance/assets/logo.png diff --git a/src/apps/lemmafinance/assets/xLBTC.png b/src/apps/lemma-finance/assets/xLBTC.png similarity index 100% rename from src/apps/lemmafinance/assets/xLBTC.png rename to src/apps/lemma-finance/assets/xLBTC.png diff --git a/src/apps/lemmafinance/assets/xLETH.png b/src/apps/lemma-finance/assets/xLETH.png similarity index 100% rename from src/apps/lemmafinance/assets/xLETH.png rename to src/apps/lemma-finance/assets/xLETH.png diff --git a/src/apps/lemmafinance/assets/xLPERP.png b/src/apps/lemma-finance/assets/xLPERP.png similarity index 100% rename from src/apps/lemmafinance/assets/xLPERP.png rename to src/apps/lemma-finance/assets/xLPERP.png diff --git a/src/apps/lemmafinance/assets/xUSDL.png b/src/apps/lemma-finance/assets/xUSDL.png similarity index 100% rename from src/apps/lemmafinance/assets/xUSDL.png rename to src/apps/lemma-finance/assets/xUSDL.png diff --git a/src/apps/lemmafinance/contracts/abis/perp-lemma.json b/src/apps/lemma-finance/contracts/abis/perp-lemma.json similarity index 100% rename from src/apps/lemmafinance/contracts/abis/perp-lemma.json rename to src/apps/lemma-finance/contracts/abis/perp-lemma.json diff --git a/src/apps/lemmafinance/contracts/abis/lemma-synth.json b/src/apps/lemma-finance/contracts/abis/synth.json similarity index 100% rename from src/apps/lemmafinance/contracts/abis/lemma-synth.json rename to src/apps/lemma-finance/contracts/abis/synth.json diff --git a/src/apps/lemmafinance/contracts/abis/usdl.json b/src/apps/lemma-finance/contracts/abis/usdl.json similarity index 100% rename from src/apps/lemmafinance/contracts/abis/usdl.json rename to src/apps/lemma-finance/contracts/abis/usdl.json diff --git a/src/apps/lemmafinance/contracts/abis/x-lemma-synth.json b/src/apps/lemma-finance/contracts/abis/x-synth.json similarity index 100% rename from src/apps/lemmafinance/contracts/abis/x-lemma-synth.json rename to src/apps/lemma-finance/contracts/abis/x-synth.json diff --git a/src/apps/lemmafinance/contracts/abis/xusdl.json b/src/apps/lemma-finance/contracts/abis/x-usdl.json similarity index 100% rename from src/apps/lemmafinance/contracts/abis/xusdl.json rename to src/apps/lemma-finance/contracts/abis/x-usdl.json diff --git a/src/apps/lemmafinance/contracts/ethers/PerpLemma.ts b/src/apps/lemma-finance/contracts/ethers/PerpLemma.ts similarity index 100% rename from src/apps/lemmafinance/contracts/ethers/PerpLemma.ts rename to src/apps/lemma-finance/contracts/ethers/PerpLemma.ts diff --git a/src/apps/lemmafinance/contracts/ethers/LemmaSynth.ts b/src/apps/lemma-finance/contracts/ethers/Synth.ts similarity index 99% rename from src/apps/lemmafinance/contracts/ethers/LemmaSynth.ts rename to src/apps/lemma-finance/contracts/ethers/Synth.ts index 460d5fee6..f49543e6c 100644 --- a/src/apps/lemmafinance/contracts/ethers/LemmaSynth.ts +++ b/src/apps/lemma-finance/contracts/ethers/Synth.ts @@ -17,7 +17,7 @@ import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi import type { Listener, Provider } from '@ethersproject/providers'; import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common'; -export interface LemmaSynthInterface extends utils.Interface { +export interface SynthInterface extends utils.Interface { functions: { 'ADMIN_ROLE()': FunctionFragment; 'DEFAULT_ADMIN_ROLE()': FunctionFragment; @@ -433,12 +433,12 @@ export type WithdrawToEvent = TypedEvent<[string, string, string, BigNumber, Big export type WithdrawToEventFilter = TypedEventFilter; -export interface LemmaSynth extends BaseContract { +export interface Synth extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; - interface: LemmaSynthInterface; + interface: SynthInterface; queryFilter( event: TypedEventFilter, diff --git a/src/apps/lemmafinance/contracts/ethers/Usdl.ts b/src/apps/lemma-finance/contracts/ethers/Usdl.ts similarity index 100% rename from src/apps/lemmafinance/contracts/ethers/Usdl.ts rename to src/apps/lemma-finance/contracts/ethers/Usdl.ts diff --git a/src/apps/lemmafinance/contracts/ethers/XLemmaSynth.ts b/src/apps/lemma-finance/contracts/ethers/XSynth.ts similarity index 99% rename from src/apps/lemmafinance/contracts/ethers/XLemmaSynth.ts rename to src/apps/lemma-finance/contracts/ethers/XSynth.ts index a16ff52f2..70a52c9e8 100644 --- a/src/apps/lemmafinance/contracts/ethers/XLemmaSynth.ts +++ b/src/apps/lemma-finance/contracts/ethers/XSynth.ts @@ -17,7 +17,7 @@ import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi import type { Listener, Provider } from '@ethersproject/providers'; import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common'; -export interface XLemmaSynthInterface extends utils.Interface { +export interface XSynthInterface extends utils.Interface { functions: { 'DOMAIN_SEPARATOR()': FunctionFragment; 'allowance(address,address)': FunctionFragment; @@ -318,12 +318,12 @@ export type WithdrawEvent = TypedEvent<[string, string, BigNumber, BigNumber], W export type WithdrawEventFilter = TypedEventFilter; -export interface XLemmaSynth extends BaseContract { +export interface XSynth extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; - interface: XLemmaSynthInterface; + interface: XSynthInterface; queryFilter( event: TypedEventFilter, diff --git a/src/apps/lemmafinance/contracts/ethers/Xusdl.ts b/src/apps/lemma-finance/contracts/ethers/Xusdl.ts similarity index 99% rename from src/apps/lemmafinance/contracts/ethers/Xusdl.ts rename to src/apps/lemma-finance/contracts/ethers/Xusdl.ts index 722579f5f..7311a98b0 100644 --- a/src/apps/lemmafinance/contracts/ethers/Xusdl.ts +++ b/src/apps/lemma-finance/contracts/ethers/Xusdl.ts @@ -17,7 +17,7 @@ import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi import type { Listener, Provider } from '@ethersproject/providers'; import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common'; -export interface XusdlInterface extends utils.Interface { +export interface XUsdlInterface extends utils.Interface { functions: { 'DOMAIN_SEPARATOR()': FunctionFragment; 'allowance(address,address)': FunctionFragment; @@ -312,12 +312,12 @@ export type WithdrawEvent = TypedEvent<[string, string, BigNumber, BigNumber], W export type WithdrawEventFilter = TypedEventFilter; -export interface Xusdl extends BaseContract { +export interface XUsdl extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; - interface: XusdlInterface; + interface: XUsdlInterface; queryFilter( event: TypedEventFilter, diff --git a/src/apps/lemmafinance/contracts/ethers/common.ts b/src/apps/lemma-finance/contracts/ethers/common.ts similarity index 100% rename from src/apps/lemmafinance/contracts/ethers/common.ts rename to src/apps/lemma-finance/contracts/ethers/common.ts diff --git a/src/apps/lemmafinance/contracts/ethers/factories/PerpLemma__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/PerpLemma__factory.ts similarity index 100% rename from src/apps/lemmafinance/contracts/ethers/factories/PerpLemma__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/PerpLemma__factory.ts diff --git a/src/apps/lemmafinance/contracts/ethers/factories/LemmaSynth__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/Synth__factory.ts similarity index 98% rename from src/apps/lemmafinance/contracts/ethers/factories/LemmaSynth__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/Synth__factory.ts index edce4cfae..47e9df08e 100644 --- a/src/apps/lemmafinance/contracts/ethers/factories/LemmaSynth__factory.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/Synth__factory.ts @@ -4,7 +4,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { Provider } from '@ethersproject/providers'; -import type { LemmaSynth, LemmaSynthInterface } from '../LemmaSynth'; +import type { Synth, SynthInterface } from '../Synth'; const _abi = [ { @@ -1205,12 +1205,12 @@ const _abi = [ }, ]; -export class LemmaSynth__factory { +export class Synth__factory { static readonly abi = _abi; - static createInterface(): LemmaSynthInterface { - return new utils.Interface(_abi) as LemmaSynthInterface; + static createInterface(): SynthInterface { + return new utils.Interface(_abi) as SynthInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): LemmaSynth { - return new Contract(address, _abi, signerOrProvider) as LemmaSynth; + static connect(address: string, signerOrProvider: Signer | Provider): Synth { + return new Contract(address, _abi, signerOrProvider) as Synth; } } diff --git a/src/apps/lemmafinance/contracts/ethers/factories/Usdl__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/Usdl__factory.ts similarity index 100% rename from src/apps/lemmafinance/contracts/ethers/factories/Usdl__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/Usdl__factory.ts diff --git a/src/apps/lemmafinance/contracts/ethers/factories/XLemmaSynth__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/XSynth__factory.ts similarity index 98% rename from src/apps/lemmafinance/contracts/ethers/factories/XLemmaSynth__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/XSynth__factory.ts index 8a209cb29..154152ac4 100644 --- a/src/apps/lemmafinance/contracts/ethers/factories/XLemmaSynth__factory.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/XSynth__factory.ts @@ -4,7 +4,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { Provider } from '@ethersproject/providers'; -import type { XLemmaSynth, XLemmaSynthInterface } from '../XLemmaSynth'; +import type { XSynth, XSynthInterface } from '../XSynth'; const _abi = [ { @@ -929,12 +929,12 @@ const _abi = [ }, ]; -export class XLemmaSynth__factory { +export class XSynth__factory { static readonly abi = _abi; - static createInterface(): XLemmaSynthInterface { - return new utils.Interface(_abi) as XLemmaSynthInterface; + static createInterface(): XSynthInterface { + return new utils.Interface(_abi) as XSynthInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): XLemmaSynth { - return new Contract(address, _abi, signerOrProvider) as XLemmaSynth; + static connect(address: string, signerOrProvider: Signer | Provider): XSynth { + return new Contract(address, _abi, signerOrProvider) as XSynth; } } diff --git a/src/apps/lemmafinance/contracts/ethers/factories/Xusdl__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts similarity index 98% rename from src/apps/lemmafinance/contracts/ethers/factories/Xusdl__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts index ec920a062..39aa0a172 100644 --- a/src/apps/lemmafinance/contracts/ethers/factories/Xusdl__factory.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts @@ -4,7 +4,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { Provider } from '@ethersproject/providers'; -import type { Xusdl, XusdlInterface } from '../Xusdl'; +import type { XUsdl, XUsdlInterface } from '../XUsdl'; const _abi = [ { @@ -919,12 +919,12 @@ const _abi = [ }, ]; -export class Xusdl__factory { +export class XUsdl__factory { static readonly abi = _abi; - static createInterface(): XusdlInterface { - return new utils.Interface(_abi) as XusdlInterface; + static createInterface(): XUsdlInterface { + return new utils.Interface(_abi) as XUsdlInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): Xusdl { - return new Contract(address, _abi, signerOrProvider) as Xusdl; + static connect(address: string, signerOrProvider: Signer | Provider): XUsdl { + return new Contract(address, _abi, signerOrProvider) as XUsdl; } } diff --git a/src/apps/lemmafinance/contracts/ethers/factories/index.ts b/src/apps/lemma-finance/contracts/ethers/factories/index.ts similarity index 53% rename from src/apps/lemmafinance/contracts/ethers/factories/index.ts rename to src/apps/lemma-finance/contracts/ethers/factories/index.ts index 3dfd239e7..96608e02b 100644 --- a/src/apps/lemmafinance/contracts/ethers/factories/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/index.ts @@ -1,8 +1,8 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export { LemmaSynth__factory } from './LemmaSynth__factory'; export { PerpLemma__factory } from './PerpLemma__factory'; +export { Synth__factory } from './Synth__factory'; export { Usdl__factory } from './Usdl__factory'; -export { XLemmaSynth__factory } from './XLemmaSynth__factory'; -export { Xusdl__factory } from './Xusdl__factory'; +export { XSynth__factory } from './XSynth__factory'; +export { XUsdl__factory } from './XUsdl__factory'; diff --git a/src/apps/lemmafinance/contracts/ethers/index.ts b/src/apps/lemma-finance/contracts/ethers/index.ts similarity index 50% rename from src/apps/lemmafinance/contracts/ethers/index.ts rename to src/apps/lemma-finance/contracts/ethers/index.ts index ed297cb1a..cdd8fea8f 100644 --- a/src/apps/lemmafinance/contracts/ethers/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/index.ts @@ -1,14 +1,14 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export type { LemmaSynth } from './LemmaSynth'; export type { PerpLemma } from './PerpLemma'; +export type { Synth } from './Synth'; export type { Usdl } from './Usdl'; -export type { XLemmaSynth } from './XLemmaSynth'; -export type { Xusdl } from './Xusdl'; +export type { XSynth } from './XSynth'; +export type { XUsdl } from './XUsdl'; export * as factories from './factories'; -export { LemmaSynth__factory } from './factories/LemmaSynth__factory'; export { PerpLemma__factory } from './factories/PerpLemma__factory'; +export { Synth__factory } from './factories/Synth__factory'; export { Usdl__factory } from './factories/Usdl__factory'; -export { XLemmaSynth__factory } from './factories/XLemmaSynth__factory'; -export { Xusdl__factory } from './factories/Xusdl__factory'; +export { XSynth__factory } from './factories/XSynth__factory'; +export { XUsdl__factory } from './factories/XUsdl__factory'; diff --git a/src/apps/lemmafinance/contracts/index.ts b/src/apps/lemma-finance/contracts/index.ts similarity index 57% rename from src/apps/lemmafinance/contracts/index.ts rename to src/apps/lemma-finance/contracts/index.ts index 4c9b24152..94b6452c2 100644 --- a/src/apps/lemmafinance/contracts/index.ts +++ b/src/apps/lemma-finance/contracts/index.ts @@ -4,40 +4,40 @@ import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { ContractFactory } from '~contract/contracts'; import { Network } from '~types/network.interface'; -import { LemmaSynth__factory } from './ethers'; import { PerpLemma__factory } from './ethers'; +import { Synth__factory } from './ethers'; import { Usdl__factory } from './ethers'; -import { XLemmaSynth__factory } from './ethers'; -import { Xusdl__factory } from './ethers'; +import { XSynth__factory } from './ethers'; +import { XUsdl__factory } from './ethers'; // eslint-disable-next-line type ContractOpts = { address: string; network: Network }; @Injectable() -export class LemmafinanceContractFactory extends ContractFactory { +export class LemmaFinanceContractFactory extends ContractFactory { constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) { super((network: Network) => appToolkit.getNetworkProvider(network)); } - lemmaSynth({ address, network }: ContractOpts) { - return LemmaSynth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); - } perpLemma({ address, network }: ContractOpts) { return PerpLemma__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } + synth({ address, network }: ContractOpts) { + return Synth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } usdl({ address, network }: ContractOpts) { return Usdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } - xLemmaSynth({ address, network }: ContractOpts) { - return XLemmaSynth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + xSynth({ address, network }: ContractOpts) { + return XSynth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } - xusdl({ address, network }: ContractOpts) { - return Xusdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + xUsdl({ address, network }: ContractOpts) { + return XUsdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } } -export type { LemmaSynth } from './ethers'; export type { PerpLemma } from './ethers'; +export type { Synth } from './ethers'; export type { Usdl } from './ethers'; -export type { XLemmaSynth } from './ethers'; -export type { Xusdl } from './ethers'; +export type { XSynth } from './ethers'; +export type { XUsdl } from './ethers'; diff --git a/src/apps/lemma-finance/index.ts b/src/apps/lemma-finance/index.ts new file mode 100644 index 000000000..b151a403a --- /dev/null +++ b/src/apps/lemma-finance/index.ts @@ -0,0 +1,3 @@ +export { LEMMA_FINANCE_DEFINITION, LemmaFinanceAppDefinition } from './lemma-finance.definition'; +export { LemmaFinanceAppModule } from './lemma-finance.module'; +export { LemmaFinanceContractFactory } from './contracts'; diff --git a/src/apps/lemmafinance/lemmafinance.definition.ts b/src/apps/lemma-finance/lemma-finance.definition.ts similarity index 64% rename from src/apps/lemmafinance/lemmafinance.definition.ts rename to src/apps/lemma-finance/lemma-finance.definition.ts index f49f03015..690799843 100644 --- a/src/apps/lemmafinance/lemmafinance.definition.ts +++ b/src/apps/lemma-finance/lemma-finance.definition.ts @@ -3,9 +3,9 @@ import { appDefinition, AppDefinition } from '~app/app.definition'; import { AppAction, AppTag, GroupType } from '~app/app.interface'; import { Network } from '~types/network.interface'; -export const LEMMAFINANCE_DEFINITION = appDefinition({ - id: 'lemmafinance', - name: 'LemmaFinance', +export const LEMMA_FINANCE_DEFINITION = appDefinition({ + id: 'lemma-finance', + name: 'Lemma Finance', description: 'A basis trading stablecoin protocol.', url: 'https://v2.lemma.finance/', @@ -15,20 +15,20 @@ export const LEMMAFINANCE_DEFINITION = appDefinition({ type: GroupType.TOKEN, label: 'USDL', }, - xusdl: { - id: 'xusdl', + xUsdl: { + id: 'x-usdl', type: GroupType.TOKEN, label: 'xUSDL', }, - LemmaSynth: { - id: 'LemmaSynth', + synth: { + id: 'synth', type: GroupType.TOKEN, label: 'LemmaSynth', }, - xLemmaSynth: { - id: 'xLemmaSynth', + xSynth: { + id: 'x-synth', type: GroupType.TOKEN, - label: 'xLemmaSynth', + label: 'xSynth', }, }, @@ -43,11 +43,11 @@ export const LEMMAFINANCE_DEFINITION = appDefinition({ primaryColor: '#fff', }); -@Register.AppDefinition(LEMMAFINANCE_DEFINITION.id) -export class LemmafinanceAppDefinition extends AppDefinition { +@Register.AppDefinition(LEMMA_FINANCE_DEFINITION.id) +export class LemmaFinanceAppDefinition extends AppDefinition { constructor() { - super(LEMMAFINANCE_DEFINITION); + super(LEMMA_FINANCE_DEFINITION); } } -export default LEMMAFINANCE_DEFINITION; +export default LEMMA_FINANCE_DEFINITION; diff --git a/src/apps/lemma-finance/lemma-finance.module.ts b/src/apps/lemma-finance/lemma-finance.module.ts new file mode 100644 index 000000000..a666ae337 --- /dev/null +++ b/src/apps/lemma-finance/lemma-finance.module.ts @@ -0,0 +1,24 @@ +import { Register } from '~app-toolkit/decorators'; +import { AbstractApp } from '~app/app.dynamic-module'; + +import { LemmaFinanceContractFactory } from './contracts'; +import { LemmaFinanceAppDefinition, LEMMA_FINANCE_DEFINITION } from './lemma-finance.definition'; +import { OptimismLemmaFinanceBalanceFetcher } from './optimism/lemma-finance.balance-fetcher'; +import { OptimismLemmaFinanceLemmaSynthTokenFetcher } from './optimism/lemma-finance.synth.token-fetcher'; +import { OptimismLemmaFinanceUsdlTokenFetcher } from './optimism/lemma-finance.usdl.token-fetcher'; +import { OptimismLemmaFinanceXSynthTokenFetcher } from './optimism/lemma-finance.x-synth.token-fetcher'; +import { OptimismLemmaFinanceXusdlTokenFetcher } from './optimism/lemma-finance.xusdl.token-fetcher'; + +@Register.AppModule({ + appId: LEMMA_FINANCE_DEFINITION.id, + providers: [ + LemmaFinanceAppDefinition, + LemmaFinanceContractFactory, + OptimismLemmaFinanceBalanceFetcher, + OptimismLemmaFinanceLemmaSynthTokenFetcher, + OptimismLemmaFinanceUsdlTokenFetcher, + OptimismLemmaFinanceXSynthTokenFetcher, + OptimismLemmaFinanceXusdlTokenFetcher, + ], +}) +export class LemmaFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/lemmafinance/optimism/lemmafinance.balance-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts similarity index 62% rename from src/apps/lemmafinance/optimism/lemmafinance.balance-fetcher.ts rename to src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts index d3fd0ec1b..142618684 100644 --- a/src/apps/lemmafinance/optimism/lemmafinance.balance-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts @@ -6,47 +6,48 @@ import { presentBalanceFetcherResponse } from '~app-toolkit/helpers/presentation import { BalanceFetcher } from '~balance/balance-fetcher.interface'; import { Network } from '~types/network.interface'; -import { LEMMAFINANCE_DEFINITION } from '../lemmafinance.definition'; +import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; +const appId = LEMMA_FINANCE_DEFINITION.id; const network = Network.OPTIMISM_MAINNET; -@Register.BalanceFetcher(LEMMAFINANCE_DEFINITION.id, network) -export class OptimismLemmafinanceBalanceFetcher implements BalanceFetcher { +@Register.BalanceFetcher(LEMMA_FINANCE_DEFINITION.id, network) +export class OptimismLemmaFinanceBalanceFetcher implements BalanceFetcher { constructor(@Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit) {} async getUSDLTokenBalances(address: string) { return this.appToolkit.helpers.tokenBalanceHelper.getTokenBalances({ address, - appId: LEMMAFINANCE_DEFINITION.id, - groupId: LEMMAFINANCE_DEFINITION.groups.usdl.id, - network: Network.OPTIMISM_MAINNET, + appId, + groupId: LEMMA_FINANCE_DEFINITION.groups.usdl.id, + network, }); } async getXUSDLTokenBalances(address: string) { return this.appToolkit.helpers.tokenBalanceHelper.getTokenBalances({ address, - appId: LEMMAFINANCE_DEFINITION.id, - groupId: LEMMAFINANCE_DEFINITION.groups.xusdl.id, - network: Network.OPTIMISM_MAINNET, + appId, + groupId: LEMMA_FINANCE_DEFINITION.groups.xUsdl.id, + network, }); } - async getLemmaTokenBalances(address: string) { + async getSynthTokenBalances(address: string) { return this.appToolkit.helpers.tokenBalanceHelper.getTokenBalances({ address, - appId: LEMMAFINANCE_DEFINITION.id, - groupId: LEMMAFINANCE_DEFINITION.groups.LemmaSynth.id, - network: Network.OPTIMISM_MAINNET, + appId, + groupId: LEMMA_FINANCE_DEFINITION.groups.synth.id, + network, }); } - async getxLemmaTokenBalances(address: string) { + async getXSynthTokenBalances(address: string) { return this.appToolkit.helpers.tokenBalanceHelper.getTokenBalances({ address, - appId: LEMMAFINANCE_DEFINITION.id, - groupId: LEMMAFINANCE_DEFINITION.groups.xLemmaSynth.id, - network: Network.OPTIMISM_MAINNET, + appId, + groupId: LEMMA_FINANCE_DEFINITION.groups.xSynth.id, + network, }); } @@ -54,17 +55,17 @@ export class OptimismLemmafinanceBalanceFetcher implements BalanceFetcher { const [usdlTokenBalances, xusdlTokenBalances, lemmaSythTokenBalances, xlemmaSythTokenBalances] = await Promise.all([ this.getUSDLTokenBalances(address), this.getXUSDLTokenBalances(address), - this.getLemmaTokenBalances(address), - this.getxLemmaTokenBalances(address), + this.getSynthTokenBalances(address), + this.getXSynthTokenBalances(address), ]); return presentBalanceFetcherResponse([ { - label: 'usdl', + label: 'USDL', assets: usdlTokenBalances, }, { - label: 'xusdl', + label: 'xUSDL', assets: xusdlTokenBalances, }, { diff --git a/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts new file mode 100644 index 000000000..603abcef9 --- /dev/null +++ b/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts @@ -0,0 +1,120 @@ +import { Inject } from '@nestjs/common'; +import _ from 'lodash'; + +import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; +import { getAppAssetImage } from '~app-toolkit/helpers/presentation/image.present'; +import { ContractType } from '~position/contract.interface'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { LemmaFinanceContractFactory } from '../contracts'; +import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; + +const synthAddresses = [ + { + synthAddress: '0x3bc414fa971189783acee4dee281067c322e3412', + perpAddress: '0x29b159ae784accfa7fb9c7ba1de272bad75f5674', + }, + { + synthAddress: '0x8a641696caf0f59bb7a53cf8d2dc943ed95229a6', + perpAddress: '0xe161c6c9f2fc74ac97300e6f00648284d83cbd19', + }, + { + synthAddress: '0x5c39a4a368ab3c3239d20eb4219e0361bd2ad092', + perpAddress: '0xdd4d71d3563c24e38525661896e1d01fd8c2c9a5', + }, + { + synthAddress: '0x546ba811099883bef35fa360e7ded8af439831f3', + perpAddress: '0x119f85ecfcfbc1d7033d266192626202df7dbdf2', + }, + { + synthAddress: '0xd1a988b024c55d7baabb07fd531d63a4e19e3b4c', + perpAddress: '0x13c214b430fe304c4c6437f3564a690cd4e4f23b', + }, + { + synthAddress: '0xa7c657a94eb9571f4e94f49943af1130e6d7337c', + perpAddress: '0xfe1eb36d31ead771fd5e051ee8cc424db6416567', + }, +]; + +const appId = LEMMA_FINANCE_DEFINITION.id; +const groupId = LEMMA_FINANCE_DEFINITION.groups.synth.id; +const network = Network.OPTIMISM_MAINNET; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class OptimismLemmaFinanceLemmaSynthTokenFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, + ) {} + + async getPositions() { + const baseTokens = await this.appToolkit.getBaseTokenPrices(network); + + const multicall = this.appToolkit.getMulticall(network); + const tokens = await Promise.all( + synthAddresses.map(async position => { + const contract = this.contractFactory.synth({ + address: position.synthAddress, + network, + }); + + const perpContract = this.contractFactory.perpLemma({ + address: position.perpAddress, + network, + }); + + const [name, symbol, decimals, supplyRaw, collateral, usdc, indexPrice] = await Promise.all([ + multicall.wrap(contract).name(), + multicall.wrap(contract).symbol(), + multicall.wrap(contract).decimals(), + multicall.wrap(contract).totalSupply(), + multicall.wrap(contract).tailCollateral(), + multicall.wrap(perpContract).usdc(), + multicall.wrap(perpContract).getIndexPrice(), + ]); + + const supply = Number(supplyRaw) / 10 ** decimals; + const usdcToken = baseTokens.find(x => x.address.toLowerCase() === usdc.toLowerCase()); + const collateralToken = baseTokens.find(x => x.address.toLowerCase() === collateral.toLowerCase()); + if (!usdcToken || !collateralToken) return null; + + const tokens = [usdcToken, collateralToken]; + const price = Number(indexPrice) / 10 ** decimals; + const pricePerShare = 1; + + const label = `${name} (${symbol})`; + const images = [getAppAssetImage(appId, symbol)]; + const secondaryLabel = buildDollarDisplayItem(price); + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + appId, + groupId, + address: position.synthAddress, + network, + symbol, + decimals, + supply, + tokens, + price, + pricePerShare, + dataProps: { + liquidity: supply * price, + }, + displayProps: { + label, + images, + secondaryLabel, + }, + }; + return token; + }), + ); + + return _.compact(tokens); + } +} diff --git a/src/apps/lemmafinance/optimism/lemmafinance.usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts similarity index 75% rename from src/apps/lemmafinance/optimism/lemmafinance.usdl.token-fetcher.ts rename to src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts index ceff097e6..4dd7128cc 100644 --- a/src/apps/lemmafinance/optimism/lemmafinance.usdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts @@ -1,4 +1,3 @@ -import { Token } from '@kyberswap/ks-sdk-core'; import { Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; @@ -10,41 +9,38 @@ import { PositionFetcher } from '~position/position-fetcher.interface'; import { AppTokenPosition } from '~position/position.interface'; import { Network } from '~types/network.interface'; -import { LemmafinanceContractFactory, Xusdl } from '../contracts'; -import { LEMMAFINANCE_DEFINITION } from '../lemmafinance.definition'; +import { LemmaFinanceContractFactory } from '../contracts'; +import LEMMA_FINANCE_DEFINITION from '../lemma-finance.definition'; -const appId = LEMMAFINANCE_DEFINITION.id; -const groupId = LEMMAFINANCE_DEFINITION.groups.usdl.id; +const appId = LEMMA_FINANCE_DEFINITION.id; +const groupId = LEMMA_FINANCE_DEFINITION.groups.usdl.id; const network = Network.OPTIMISM_MAINNET; -export type USDLTokenDataProps = {}; - @Register.TokenPositionFetcher({ appId, groupId, network }) -export class OptimismLemmafinanceUsdlTokenFetcher implements PositionFetcher { +export class OptimismLemmaFinanceUsdlTokenFetcher implements PositionFetcher { constructor( @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(LemmafinanceContractFactory) private readonly lemmafinanceContractFactory: LemmafinanceContractFactory, + @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, ) {} async getPositions() { const BaseTokens = [ '0x4200000000000000000000000000000000000006', // WETH - '0x68f180fcCe6836688e9084f035309E29Bf0A2095', // Wbtc - '0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6', // Link - '0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53', // CRV - '0x9e1028F5F1D5eDE59748FFceE5532509976840E0', // Perp - '0x76FB31fb4af56892A25e32cFC43De717950c9278', // AAVE + '0x68f180fcce6836688e9084f035309e29bf0a2095', // Wbtc + '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6', // Link + '0x0994206dfe8de6ec6920ff4d779b0d950605fb53', // CRV + '0x9e1028f5f1d5ede59748ffcee5532509976840e0', // Perp + '0x76fb31fb4af56892a25e32cfc43de717950c9278', // AAVE ]; - const usdlAddresses = ['0x96F2539d3684dbde8B3242A51A73B66360a5B541']; - // const imageURL = 'src/apps/lemmafinance/assets/USDL.png'; + const usdlAddresses = ['0x96f2539d3684dbde8b3242a51a73b66360a5b541']; const imageURL = getAppAssetImage(appId, 'USDL'); const multicall = this.appToolkit.getMulticall(network); const tokens = await Promise.all( usdlAddresses.map(async usdlAddress => { // Instantiate a smart contract instance pointing to the jar token address - const contract = this.lemmafinanceContractFactory.usdl({ + const contract = this.contractFactory.usdl({ address: usdlAddress, network, }); @@ -98,7 +94,6 @@ export class OptimismLemmafinanceUsdlTokenFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, + ) {} + + async getPositions() { + const baseTokens = await this.appToolkit.getBaseTokenPrices(network); + + const multicall = this.appToolkit.getMulticall(network); + const tokens = await Promise.all( + xSynthAddresses.map(async position => { + const contract = this.contractFactory.xSynth({ + address: position.xSynthAddress, + network, + }); + + const perpLemmaContract = this.contractFactory.perpLemma({ + address: position.perpAddress, + network, + }); + + const [name, symbol, decimals, supplyRaw, collateral, usdc, assetsPerShare] = await Promise.all([ + multicall.wrap(contract).name(), + multicall.wrap(contract).symbol(), + multicall.wrap(contract).decimals(), + multicall.wrap(contract).totalSupply(), + multicall.wrap(perpLemmaContract).usdlCollateral(), + multicall.wrap(perpLemmaContract).usdc(), + multicall.wrap(contract).assetsPerShare(), + ]); + + const supply = Number(supplyRaw) / 10 ** decimals; + const usdcToken = baseTokens.find(x => x.address.toLowerCase() === usdc.toLowerCase()); + const collateralToken = baseTokens.find(x => x.address.toLowerCase() === collateral.toLowerCase()); + if (!usdcToken || !collateralToken) return null; + + const tokens = [usdcToken, collateralToken]; + const price = Number(assetsPerShare) / 10 ** decimals; + const pricePerShare = Number(assetsPerShare) / 10 ** decimals; + + const label = `${name} (${symbol})`; + const images = [getAppAssetImage(appId, position.imageName)]; + const secondaryLabel = buildDollarDisplayItem(price); + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + appId, + groupId, + address: position.xSynthAddress, + network, + symbol, + decimals, + supply, + tokens, + price, + pricePerShare, + dataProps: { + liquidity: supply * price, + }, + displayProps: { + label, + images, + secondaryLabel, + }, + }; + + return token; + }), + ); + + return _.compact(tokens); + } +} diff --git a/src/apps/lemmafinance/optimism/lemmafinance.xusdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts similarity index 66% rename from src/apps/lemmafinance/optimism/lemmafinance.xusdl.token-fetcher.ts rename to src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts index da31f9073..cfa2a4966 100644 --- a/src/apps/lemmafinance/optimism/lemmafinance.xusdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts @@ -3,44 +3,43 @@ import { Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Register } from '~app-toolkit/decorators'; import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; -import { getAppAssetImage, getImagesFromToken } from '~app-toolkit/helpers/presentation/image.present'; +import { getAppAssetImage } from '~app-toolkit/helpers/presentation/image.present'; import { ContractType } from '~position/contract.interface'; import { PositionFetcher } from '~position/position-fetcher.interface'; import { AppTokenPosition } from '~position/position.interface'; import { Network } from '~types/network.interface'; -import { LemmafinanceContractFactory } from '../contracts'; -import { LEMMAFINANCE_DEFINITION } from '../lemmafinance.definition'; +import { LemmaFinanceContractFactory } from '../contracts'; +import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; -const appId = LEMMAFINANCE_DEFINITION.id; -const groupId = LEMMAFINANCE_DEFINITION.groups.xusdl.id; +const appId = LEMMA_FINANCE_DEFINITION.id; +const groupId = LEMMA_FINANCE_DEFINITION.groups.xUsdl.id; const network = Network.OPTIMISM_MAINNET; @Register.TokenPositionFetcher({ appId, groupId, network }) -export class OptimismLemmafinanceXusdlTokenFetcher implements PositionFetcher { +export class OptimismLemmaFinanceXusdlTokenFetcher implements PositionFetcher { constructor( @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(LemmafinanceContractFactory) private readonly lemmafinanceContractFactory: LemmafinanceContractFactory, + @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, ) {} async getPositions() { const BaseTokens = [ '0x4200000000000000000000000000000000000006', // WETH - '0x68f180fcCe6836688e9084f035309E29Bf0A2095', // Wbtc - '0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6', // Link - '0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53', // CRV - '0x9e1028F5F1D5eDE59748FFceE5532509976840E0', // Perp - '0x76FB31fb4af56892A25e32cFC43De717950c9278', // AAVE + '0x68f180fcce6836688e9084f035309e29bf0a2095', // Wbtc + '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6', // Link + '0x0994206dfe8de6ec6920ff4d779b0d950605fb53', // CRV + '0x9e1028f5f1d5ede59748ffcee5532509976840e0', // Perp + '0x76fb31fb4af56892a25e32cfc43de717950c9278', // AAVE ]; - const xusdlAddresses = ['0x252Ea7E68a27390Ce0D53851192839A39Ab8B38C']; - // const imageURL = 'src/apps/lemmafinance/assets/xUSDL.png'; + const xusdlAddresses = ['0x252ea7e68a27390ce0d53851192839a39ab8b38c']; const imageURL = getAppAssetImage(appId, 'xUSDL'); const multicall = this.appToolkit.getMulticall(network); const tokens = await Promise.all( xusdlAddresses.map(async xusdlAddress => { // Instantiate a smart contract instance pointing to the jar token address - const contract = this.lemmafinanceContractFactory.xusdl({ + const contract = this.contractFactory.xUsdl({ address: xusdlAddress, network, }); @@ -61,19 +60,14 @@ export class OptimismLemmafinanceXusdlTokenFetcher implements PositionFetcher { - constructor( - @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(LemmafinanceContractFactory) private readonly lemmafinanceContractFactory: LemmafinanceContractFactory, - ) {} - - async getPositions() { - const LemmaSynths = [ - '0x3BC414FA971189783ACee4dEe281067C322E3412', // LemmaEth - '0x8A641696Caf0f59bB7a53CF8D2dc943ED95229A6', // LemmaWbtc - '0x5C39a4a368AB3c3239d20eb4219e0361Bd2ad092', // LemmaLink - '0x546ba811099883bEf35Fa360e7ded8Af439831f3', // LemmaCRV - '0xd1a988b024C55d7bAaBB07fD531d63A4E19e3B4C', // LemmaPerp - '0xA7C657a94Eb9571f4e94F49943Af1130e6D7337c', // LemmaAAVE - ]; - - const perpLemmas = [ - '0x29b159aE784Accfa7Fb9c7ba1De272bad75f5674', // PerpLemmaWeth - '0xe161C6c9F2fC74AC97300e6f00648284d83cBd19', // PerpLemmaWbtc - '0xdd4d71D3563C24E38525661896e1d01Fd8c2c9A5', // PerpLemmaLink - '0x119f85ECFcFBC1d7033d266192626202Df7dbDf2', // PerpLemmaCRV - '0x13c214b430fE304C4C6437F3564A690cd4e4f23B', // PerpLemmaPerp - '0xFE1EB36d31ead771Fd5E051ee8CC424dB6416567', // PerpLemmaAAVE - ]; - - const imageURL = 'src/apps/lemmafinance/assets/'; - const tokenImages = ['LETH', 'LBTC', 'LLink', 'LCRV', 'LPERP', 'LAAVE']; - - const baseTokens = await this.appToolkit.getBaseTokenPrices(network); - - const multicall = this.appToolkit.getMulticall(network); - const tokens = await Promise.all( - LemmaSynths.map(async (lemmaSynth, i) => { - // Instantiate a smart contract instance pointing to the jar token address - const contract = this.lemmafinanceContractFactory.lemmaSynth({ - address: lemmaSynth, - network, - }); - - const perpLemmaContract = this.lemmafinanceContractFactory.perpLemma({ - address: perpLemmas[i], - network, - }); - - // Request the symbol, decimals, ands supply for the jar token - const [name, symbol, decimals, supplyRaw, collateral, usdc, indexPrice] = await Promise.all([ - multicall.wrap(contract).name(), - multicall.wrap(contract).symbol(), - multicall.wrap(contract).decimals(), - multicall.wrap(contract).totalSupply(), - multicall.wrap(contract).tailCollateral(), - multicall.wrap(perpLemmaContract).usdc(), - multicall.wrap(perpLemmaContract).getIndexPrice(), - ]); - - // Denormalize the supply - const supply = Number(supplyRaw) / 10 ** decimals; - const usdcToken = baseTokens.find(x => x.address.toLowerCase() === usdc.toLowerCase()); - const collateralToken = baseTokens.find(x => x.address.toLowerCase() === collateral.toLowerCase()); - const tokens: any = [usdcToken, collateralToken]; - const price = Number(indexPrice) / 10 ** decimals; - const pricePerShare = Number(1); - - // // As a label, we'll use the underlying label (i.e.: 'LOOKS' or 'UNI-V2 LOOKS / ETH'), and suffix it with 'Jar' - const label = `${name} (${symbol})`; - // // For images, we'll use the underlying token images as well - const images = [getAppAssetImage(appId, tokenImages[i])]; - // // For the secondary label, we'll use the price of the jar token - const secondaryLabel = buildDollarDisplayItem(price); - // // And for a tertiary label, we'll use the APY - // const tertiaryLabel = `${(apy * 100).toFixed(3)}% APY`; - - // Create the token object - const token: AppTokenPosition = { - type: ContractType.APP_TOKEN, - appId, - groupId, - address: lemmaSynth, - network, - symbol, - decimals, - supply, - tokens, - price, - pricePerShare, - dataProps: { - liquidity: supply * price, - }, - displayProps: { - label, - images, - secondaryLabel, - tertiaryLabel: '', - }, - }; - return token; - }), - ); - - return tokens; - } -} diff --git a/src/apps/lemmafinance/optimism/lemmafinance.xLemmaSynth.token-fetcher.ts b/src/apps/lemmafinance/optimism/lemmafinance.xLemmaSynth.token-fetcher.ts deleted file mode 100644 index 8f4912fbc..000000000 --- a/src/apps/lemmafinance/optimism/lemmafinance.xLemmaSynth.token-fetcher.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Register } from '~app-toolkit/decorators'; -import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; -import { getAppAssetImage, getImagesFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { ContractType } from '~position/contract.interface'; -import { PositionFetcher } from '~position/position-fetcher.interface'; -import { AppTokenPosition } from '~position/position.interface'; -import { Network } from '~types/network.interface'; - -import { LemmafinanceContractFactory } from '../contracts'; -import { LEMMAFINANCE_DEFINITION } from '../lemmafinance.definition'; - -const appId = LEMMAFINANCE_DEFINITION.id; -const groupId = LEMMAFINANCE_DEFINITION.groups.xLemmaSynth.id; -const network = Network.OPTIMISM_MAINNET; - -@Register.TokenPositionFetcher({ appId, groupId, network }) -export class OptimismLemmafinanceXLemmaSynthTokenFetcher implements PositionFetcher { - constructor( - @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(LemmafinanceContractFactory) private readonly lemmafinanceContractFactory: LemmafinanceContractFactory, - ) {} - - async getPositions() { - const xLemmaSynths = [ - '0x89c4e9a23Db43641e1B3C5E0691b100E64b50E32', // xLemmaEth - '0x7D39583e262CBe75a1D698A6D79cd5a2958cb61d', // xLemmaWbtc - '0x823c55654d6E860F40070ee5625ff8b091df4269', // xLemmaLink - '0x754E6134872D7a501fFEbA6c186e187DBFdf6f4a', // xLemmaCRV - '0x3C7E63ba04FF4d5f0673bc93bBD9E73E9DD37Ed2', // xLemmaPerp - '0x90356c24c1F95CF29543D45122f2554b6A74f201', // xLemmaAAVE - ]; - - const perpLemmas = [ - '0x29b159aE784Accfa7Fb9c7ba1De272bad75f5674', // PerpLemmaWeth - '0xe161C6c9F2fC74AC97300e6f00648284d83cBd19', // PerpLemmaWbtc - '0xdd4d71D3563C24E38525661896e1d01Fd8c2c9A5', // PerpLemmaLink - '0x119f85ECFcFBC1d7033d266192626202Df7dbDf2', // PerpLemmaCRV - '0x13c214b430fE304C4C6437F3564A690cd4e4f23B', // PerpLemmaPerp - '0xFE1EB36d31ead771Fd5E051ee8CC424dB6416567', // PerpLemmaAAVE - ]; - - // const imageURL = 'src/apps/lemmafinance/assets/'; - const tokenImages = ['xLETH', 'xLBTC', 'xLPERP', 'xLPERP', 'xLPERP', 'xLPERP']; - const baseTokens = await this.appToolkit.getBaseTokenPrices(network); - - const multicall = this.appToolkit.getMulticall(network); - const tokens = await Promise.all( - xLemmaSynths.map(async (xlemmaSynth, i) => { - // Instantiate a smart contract instance pointing to the jar token address - const contract = this.lemmafinanceContractFactory.xLemmaSynth({ - address: xlemmaSynth, - network, - }); - - const perpLemmaContract = this.lemmafinanceContractFactory.perpLemma({ - address: perpLemmas[i], - network, - }); - - // Request the symbol, decimals, ands supply for the jar token - const [name, symbol, decimals, supplyRaw, collateral, usdc, assetsPerShare] = await Promise.all([ - multicall.wrap(contract).name(), - multicall.wrap(contract).symbol(), - multicall.wrap(contract).decimals(), - multicall.wrap(contract).totalSupply(), - multicall.wrap(perpLemmaContract).usdlCollateral(), - multicall.wrap(perpLemmaContract).usdc(), - multicall.wrap(contract).assetsPerShare(), - ]); - - // Denormalize the supply - const supply = Number(supplyRaw) / 10 ** decimals; - const usdcToken = baseTokens.find(x => x.address.toLowerCase() === usdc.toLowerCase()); - const collateralToken = baseTokens.find(x => x.address.toLowerCase() === collateral.toLowerCase()); - const tokens: any = [usdcToken, collateralToken]; - const price = Number(assetsPerShare) / 10 ** decimals; - const pricePerShare = Number(assetsPerShare) / 10 ** decimals; - - // // As a label, we'll use the underlying label (i.e.: 'LOOKS' or 'UNI-V2 LOOKS / ETH'), and suffix it with 'Jar' - const label = `${name} (${symbol})`; - // // For images, we'll use the underlying token images as well - const images = [getAppAssetImage(appId, tokenImages[i])]; - // // For the secondary label, we'll use the price of the jar token - const secondaryLabel = buildDollarDisplayItem(price); - // // And for a tertiary label, we'll use the APY - // const tertiaryLabel = `${(apy * 100).toFixed(3)}% APY`; - - // Create the token object - const token: AppTokenPosition = { - type: ContractType.APP_TOKEN, - appId, - groupId, - address: xlemmaSynth, - network, - symbol, - decimals, - supply, - tokens, - price, - pricePerShare, - dataProps: { - liquidity: supply * price, - }, - displayProps: { - label, - images, - secondaryLabel, - tertiaryLabel: '', - }, - }; - return token; - }), - ); - return tokens; - } -} From e8d91931bcd49dc675bf44ccdc869d5f64efbc80 Mon Sep 17 00:00:00 2001 From: William Poulin Date: Sat, 10 Dec 2022 16:27:02 -0500 Subject: [PATCH 2/5] fix(lemma-finance): Cleanup --- .../lemma-finance/lemma-finance.definition.ts | 7 +- .../lemma-finance/lemma-finance.module.ts | 5 +- .../optimism/lemma-finance.balance-fetcher.ts | 2 +- .../lemma-finance.synth.token-fetcher.ts | 2 +- .../lemma-finance.usdl.token-fetcher.ts | 113 ++++++++---------- .../lemma-finance.x-synth.token-fetcher.ts | 2 +- .../lemma-finance.x-usdl.token-fetcher.ts | 95 +++++++++++++++ .../lemma-finance.xusdl.token-fetcher.ts | 100 ---------------- 8 files changed, 158 insertions(+), 168 deletions(-) create mode 100644 src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts delete mode 100644 src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts diff --git a/src/apps/lemma-finance/lemma-finance.definition.ts b/src/apps/lemma-finance/lemma-finance.definition.ts index 690799843..ccf208f3f 100644 --- a/src/apps/lemma-finance/lemma-finance.definition.ts +++ b/src/apps/lemma-finance/lemma-finance.definition.ts @@ -23,7 +23,7 @@ export const LEMMA_FINANCE_DEFINITION = appDefinition({ synth: { id: 'synth', type: GroupType.TOKEN, - label: 'LemmaSynth', + label: 'Synth', }, xSynth: { id: 'x-synth', @@ -34,7 +34,10 @@ export const LEMMA_FINANCE_DEFINITION = appDefinition({ tags: [AppTag.ALGORITHMIC_STABLECOIN], keywords: [], - links: {}, + links: { + discord: 'https://discord.com/invite/AvCEkVbtQt', + twitter: 'https://twitter.com/LemmaFinance', + }, supportedNetworks: { [Network.OPTIMISM_MAINNET]: [AppAction.VIEW], diff --git a/src/apps/lemma-finance/lemma-finance.module.ts b/src/apps/lemma-finance/lemma-finance.module.ts index a666ae337..cfba4bd80 100644 --- a/src/apps/lemma-finance/lemma-finance.module.ts +++ b/src/apps/lemma-finance/lemma-finance.module.ts @@ -7,18 +7,19 @@ import { OptimismLemmaFinanceBalanceFetcher } from './optimism/lemma-finance.bal import { OptimismLemmaFinanceLemmaSynthTokenFetcher } from './optimism/lemma-finance.synth.token-fetcher'; import { OptimismLemmaFinanceUsdlTokenFetcher } from './optimism/lemma-finance.usdl.token-fetcher'; import { OptimismLemmaFinanceXSynthTokenFetcher } from './optimism/lemma-finance.x-synth.token-fetcher'; -import { OptimismLemmaFinanceXusdlTokenFetcher } from './optimism/lemma-finance.xusdl.token-fetcher'; +import { OptimismLemmaFinanceXUsdlTokenFetcher } from './optimism/lemma-finance.x-usdl.token-fetcher'; @Register.AppModule({ appId: LEMMA_FINANCE_DEFINITION.id, providers: [ LemmaFinanceAppDefinition, LemmaFinanceContractFactory, + // Optimism OptimismLemmaFinanceBalanceFetcher, OptimismLemmaFinanceLemmaSynthTokenFetcher, OptimismLemmaFinanceUsdlTokenFetcher, OptimismLemmaFinanceXSynthTokenFetcher, - OptimismLemmaFinanceXusdlTokenFetcher, + OptimismLemmaFinanceXUsdlTokenFetcher, ], }) export class LemmaFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts index 142618684..01b8db768 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.balance-fetcher.ts @@ -11,7 +11,7 @@ import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; const appId = LEMMA_FINANCE_DEFINITION.id; const network = Network.OPTIMISM_MAINNET; -@Register.BalanceFetcher(LEMMA_FINANCE_DEFINITION.id, network) +@Register.BalanceFetcher(appId, network) export class OptimismLemmaFinanceBalanceFetcher implements BalanceFetcher { constructor(@Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit) {} diff --git a/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts index 603abcef9..5a4719e3d 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.synth.token-fetcher.ts @@ -53,8 +53,8 @@ export class OptimismLemmaFinanceLemmaSynthTokenFetcher implements PositionFetch async getPositions() { const baseTokens = await this.appToolkit.getBaseTokenPrices(network); - const multicall = this.appToolkit.getMulticall(network); + const tokens = await Promise.all( synthAddresses.map(async position => { const contract = this.contractFactory.synth({ diff --git a/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts index 4dd7128cc..2007558f1 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.usdl.token-fetcher.ts @@ -1,4 +1,5 @@ import { Inject } from '@nestjs/common'; +import _ from 'lodash'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Register } from '~app-toolkit/decorators'; @@ -24,7 +25,7 @@ export class OptimismLemmaFinanceUsdlTokenFetcher implements PositionFetcher { - // Instantiate a smart contract instance pointing to the jar token address - const contract = this.contractFactory.usdl({ - address: usdlAddress, - network, - }); + const contract = this.contractFactory.usdl({ + address: usdlAddress, + network, + }); - // Request the symbol, decimals, ands supply for the jar token - const [name, symbol, decimals, supplyRaw] = await Promise.all([ - multicall.wrap(contract).name(), - multicall.wrap(contract).symbol(), - multicall.wrap(contract).decimals(), - multicall.wrap(contract).totalSupply(), - ]); + const [name, symbol, decimals, supplyRaw] = await Promise.all([ + multicall.wrap(contract).name(), + multicall.wrap(contract).symbol(), + multicall.wrap(contract).decimals(), + multicall.wrap(contract).totalSupply(), + ]); - const baseTokens = await this.appToolkit.getBaseTokenPrices(network); - let tokens: any[] = []; - BaseTokens.map(async address => { - const collateralToken = baseTokens.find(x => x.address.toLowerCase() === address.toLowerCase()); - tokens = [collateralToken, ...tokens]; - }); - tokens = tokens.reverse(); - // Denormalize the supply - const supply = Number(supplyRaw) / 10 ** decimals; - const price = Number(1); - const pricePerShare = Number(1); + const baseTokens = await this.appToolkit.getBaseTokenPrices(network); + const tokensRaw = await Promise.all( + underlyingTokenAddresses.map(async address => { + const underlyingToken = baseTokens.find(x => x.address.toLowerCase() === address); + if (!underlyingToken) return null; - // // As a label, we'll use the underlying label (i.e.: 'LOOKS' or 'UNI-V2 LOOKS / ETH'), and suffix it with 'Jar' - const label = `${name} (${symbol})`; - // // For images, we'll use the underlying token images as well - const images = [imageURL]; - // // For the secondary label, we'll use the price of the jar token - const secondaryLabel = buildDollarDisplayItem(price); - // // And for a tertiary label, we'll use the APY - // const tertiaryLabel = `${(apy * 100).toFixed(3)}% APY`; - - // Create the token object - const token: AppTokenPosition = { - type: ContractType.APP_TOKEN, - appId, - groupId, - address: usdlAddress, - network, - symbol, - decimals, - supply, - tokens, - price, - pricePerShare, - dataProps: { - liquidity: supply * price, - }, - displayProps: { - label, - images, - secondaryLabel, - }, - }; - return token; + return underlyingToken; }), ); - return tokens; + const tokens = _.compact(tokensRaw); + + const supply = Number(supplyRaw) / 10 ** decimals; + const price = 1; + const pricePerShare = 1; + + const label = `${name} (${symbol})`; + const images = [getAppAssetImage(appId, 'USDL')]; + const secondaryLabel = buildDollarDisplayItem(price); + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + appId, + groupId, + address: usdlAddress, + network, + symbol, + decimals, + supply, + tokens, + price, + pricePerShare, + dataProps: { + liquidity: supply * price, + }, + displayProps: { + label, + images, + secondaryLabel, + }, + }; + + return [token]; } } diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-synth.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-synth.token-fetcher.ts index 1a4a0a048..c6a90245d 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.x-synth.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.x-synth.token-fetcher.ts @@ -59,8 +59,8 @@ export class OptimismLemmaFinanceXSynthTokenFetcher implements PositionFetcher { const contract = this.contractFactory.xSynth({ diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts new file mode 100644 index 000000000..d8d33737f --- /dev/null +++ b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts @@ -0,0 +1,95 @@ +import { Inject } from '@nestjs/common'; +import _ from 'lodash'; + +import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; +import { getAppAssetImage } from '~app-toolkit/helpers/presentation/image.present'; +import { ContractType } from '~position/contract.interface'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { AppTokenPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { LemmaFinanceContractFactory } from '../contracts'; +import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; + +const appId = LEMMA_FINANCE_DEFINITION.id; +const groupId = LEMMA_FINANCE_DEFINITION.groups.xUsdl.id; +const network = Network.OPTIMISM_MAINNET; + +@Register.TokenPositionFetcher({ appId, groupId, network }) +export class OptimismLemmaFinanceXUsdlTokenFetcher implements PositionFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, + ) {} + + async getPositions() { + const underlyingTokenAddresses = [ + '0x4200000000000000000000000000000000000006', // WETH + '0x68f180fcce6836688e9084f035309e29bf0a2095', // Wbtc + '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6', // Link + '0x0994206dfe8de6ec6920ff4d779b0d950605fb53', // CRV + '0x9e1028f5f1d5ede59748ffcee5532509976840e0', // Perp + '0x76fb31fb4af56892a25e32cfc43de717950c9278', // AAVE + ]; + + const xusdlAddress = '0x252ea7e68a27390ce0d53851192839a39ab8b38c'; + const multicall = this.appToolkit.getMulticall(network); + const contract = this.contractFactory.xUsdl({ + address: xusdlAddress, + network, + }); + + const [name, symbol, decimals, supplyRaw, assetsPerShare] = await Promise.all([ + multicall.wrap(contract).name(), + multicall.wrap(contract).symbol(), + multicall.wrap(contract).decimals(), + multicall.wrap(contract).totalSupply(), + multicall.wrap(contract).assetsPerShare(), + ]); + + const baseTokens = await this.appToolkit.getBaseTokenPrices(network); + const tokensRaw = await Promise.all( + underlyingTokenAddresses.map(async address => { + const underlyingToken = baseTokens.find(x => x.address.toLowerCase() === address); + if (!underlyingToken) return null; + + return underlyingToken; + }), + ); + const tokens = _.compact(tokensRaw); + + const supply = Number(supplyRaw) / 10 ** decimals; + const price = Number(assetsPerShare) / 10 ** decimals; + const pricePerShare = 1; + + const label = `${name} (${symbol})`; + const images = [getAppAssetImage(appId, 'xUSDL')]; + const secondaryLabel = buildDollarDisplayItem(price); + + const token: AppTokenPosition = { + type: ContractType.APP_TOKEN, + appId, + groupId, + address: xusdlAddress, + network, + symbol, + decimals, + supply, + tokens, + price, + pricePerShare, + dataProps: { + liquidity: supply * price, + }, + displayProps: { + label, + images, + secondaryLabel, + }, + }; + + return [token]; + } +} diff --git a/src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts deleted file mode 100644 index cfa2a4966..000000000 --- a/src/apps/lemma-finance/optimism/lemma-finance.xusdl.token-fetcher.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Register } from '~app-toolkit/decorators'; -import { buildDollarDisplayItem } from '~app-toolkit/helpers/presentation/display-item.present'; -import { getAppAssetImage } from '~app-toolkit/helpers/presentation/image.present'; -import { ContractType } from '~position/contract.interface'; -import { PositionFetcher } from '~position/position-fetcher.interface'; -import { AppTokenPosition } from '~position/position.interface'; -import { Network } from '~types/network.interface'; - -import { LemmaFinanceContractFactory } from '../contracts'; -import { LEMMA_FINANCE_DEFINITION } from '../lemma-finance.definition'; - -const appId = LEMMA_FINANCE_DEFINITION.id; -const groupId = LEMMA_FINANCE_DEFINITION.groups.xUsdl.id; -const network = Network.OPTIMISM_MAINNET; - -@Register.TokenPositionFetcher({ appId, groupId, network }) -export class OptimismLemmaFinanceXusdlTokenFetcher implements PositionFetcher { - constructor( - @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, - @Inject(LemmaFinanceContractFactory) private readonly contractFactory: LemmaFinanceContractFactory, - ) {} - - async getPositions() { - const BaseTokens = [ - '0x4200000000000000000000000000000000000006', // WETH - '0x68f180fcce6836688e9084f035309e29bf0a2095', // Wbtc - '0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6', // Link - '0x0994206dfe8de6ec6920ff4d779b0d950605fb53', // CRV - '0x9e1028f5f1d5ede59748ffcee5532509976840e0', // Perp - '0x76fb31fb4af56892a25e32cfc43de717950c9278', // AAVE - ]; - - const xusdlAddresses = ['0x252ea7e68a27390ce0d53851192839a39ab8b38c']; - const imageURL = getAppAssetImage(appId, 'xUSDL'); - const multicall = this.appToolkit.getMulticall(network); - const tokens = await Promise.all( - xusdlAddresses.map(async xusdlAddress => { - // Instantiate a smart contract instance pointing to the jar token address - const contract = this.contractFactory.xUsdl({ - address: xusdlAddress, - network, - }); - - // Request the symbol, decimals, ands supply for the jar token - const [name, symbol, decimals, supplyRaw, assetsPerShare] = await Promise.all([ - multicall.wrap(contract).name(), - multicall.wrap(contract).symbol(), - multicall.wrap(contract).decimals(), - multicall.wrap(contract).totalSupply(), - multicall.wrap(contract).assetsPerShare(), - ]); - - const baseTokens = await this.appToolkit.getBaseTokenPrices(network); - let tokens: any[] = []; - BaseTokens.map(async address => { - const collateralToken = baseTokens.find(x => x.address.toLowerCase() === address.toLowerCase()); - tokens = [collateralToken, ...tokens]; - }); - tokens = tokens.reverse(); - - const supply = Number(supplyRaw) / 10 ** decimals; - const price = Number(assetsPerShare); - const pricePerShare = Number(assetsPerShare) / 10 ** decimals; - - const label = `${name} (${symbol})`; - const images = [imageURL]; - const secondaryLabel = buildDollarDisplayItem(price); - - // Create the token object - const token: AppTokenPosition = { - type: ContractType.APP_TOKEN, - appId, - groupId, - address: xusdlAddress, - network, - symbol, - decimals, - supply, - tokens, - price, - pricePerShare, - dataProps: { - liquidity: supply * price, - }, - displayProps: { - label, - images, - secondaryLabel, - }, - }; - return token; - }), - ); - - return tokens; - } -} From f9588eb7d3e667ad682e31d4e6d036627d8b6c68 Mon Sep 17 00:00:00 2001 From: William Poulin Date: Sat, 10 Dec 2022 21:26:03 -0500 Subject: [PATCH 3/5] fix(lemma-finance): Fix xUSDL underlying token and price --- .../lemma-finance.x-usdl.token-fetcher.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts index d8d33737f..2146a8d84 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts @@ -25,14 +25,13 @@ export class OptimismLemmaFinanceXUsdlTokenFetcher implements PositionFetcher { - const underlyingToken = baseTokens.find(x => x.address.toLowerCase() === address); - if (!underlyingToken) return null; + underlyingTokenAddresses.map(underlyingTokenAddress => { + const underlyingToken = appTokens.find(x => x.address === underlyingTokenAddress); + if (!underlyingToken) null; return underlyingToken; }), ); + const tokens = _.compact(tokensRaw); const supply = Number(supplyRaw) / 10 ** decimals; - const price = Number(assetsPerShare) / 10 ** decimals; + const assetPerShare = Number(assetsPerShareRaw) / 10 ** decimals; + const price = 1 / assetPerShare; const pricePerShare = 1; const label = `${name} (${symbol})`; From dab758d6bd7555c34788326d5c4754b1a68cd56a Mon Sep 17 00:00:00 2001 From: William Poulin Date: Sat, 10 Dec 2022 21:50:25 -0500 Subject: [PATCH 4/5] chore(lemma-finance): Fix xUSDL ABI filename --- .../contracts/abis/{x-usdl.json => staked-usdl.json} | 0 .../contracts/ethers/{Xusdl.ts => StakedUsdl.ts} | 6 +++--- .../{Xusdl__factory.ts => StakedUsdl__factory.ts} | 12 ++++++------ .../contracts/ethers/factories/index.ts | 2 +- src/apps/lemma-finance/contracts/ethers/index.ts | 4 ++-- src/apps/lemma-finance/contracts/index.ts | 10 +++++----- .../optimism/lemma-finance.x-usdl.token-fetcher.ts | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) rename src/apps/lemma-finance/contracts/abis/{x-usdl.json => staked-usdl.json} (100%) rename src/apps/lemma-finance/contracts/ethers/{Xusdl.ts => StakedUsdl.ts} (99%) rename src/apps/lemma-finance/contracts/ethers/factories/{Xusdl__factory.ts => StakedUsdl__factory.ts} (98%) diff --git a/src/apps/lemma-finance/contracts/abis/x-usdl.json b/src/apps/lemma-finance/contracts/abis/staked-usdl.json similarity index 100% rename from src/apps/lemma-finance/contracts/abis/x-usdl.json rename to src/apps/lemma-finance/contracts/abis/staked-usdl.json diff --git a/src/apps/lemma-finance/contracts/ethers/Xusdl.ts b/src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts similarity index 99% rename from src/apps/lemma-finance/contracts/ethers/Xusdl.ts rename to src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts index 7311a98b0..96da8e3ec 100644 --- a/src/apps/lemma-finance/contracts/ethers/Xusdl.ts +++ b/src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts @@ -17,7 +17,7 @@ import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi import type { Listener, Provider } from '@ethersproject/providers'; import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common'; -export interface XUsdlInterface extends utils.Interface { +export interface StakedUsdlInterface extends utils.Interface { functions: { 'DOMAIN_SEPARATOR()': FunctionFragment; 'allowance(address,address)': FunctionFragment; @@ -312,12 +312,12 @@ export type WithdrawEvent = TypedEvent<[string, string, BigNumber, BigNumber], W export type WithdrawEventFilter = TypedEventFilter; -export interface XUsdl extends BaseContract { +export interface StakedUsdl extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; - interface: XUsdlInterface; + interface: StakedUsdlInterface; queryFilter( event: TypedEventFilter, diff --git a/src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts similarity index 98% rename from src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts index 39aa0a172..f7f7924de 100644 --- a/src/apps/lemma-finance/contracts/ethers/factories/Xusdl__factory.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts @@ -4,7 +4,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { Provider } from '@ethersproject/providers'; -import type { XUsdl, XUsdlInterface } from '../XUsdl'; +import type { StakedUsdl, StakedUsdlInterface } from '../StakedUsdl'; const _abi = [ { @@ -919,12 +919,12 @@ const _abi = [ }, ]; -export class XUsdl__factory { +export class StakedUsdl__factory { static readonly abi = _abi; - static createInterface(): XUsdlInterface { - return new utils.Interface(_abi) as XUsdlInterface; + static createInterface(): StakedUsdlInterface { + return new utils.Interface(_abi) as StakedUsdlInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): XUsdl { - return new Contract(address, _abi, signerOrProvider) as XUsdl; + static connect(address: string, signerOrProvider: Signer | Provider): StakedUsdl { + return new Contract(address, _abi, signerOrProvider) as StakedUsdl; } } diff --git a/src/apps/lemma-finance/contracts/ethers/factories/index.ts b/src/apps/lemma-finance/contracts/ethers/factories/index.ts index 96608e02b..ed7e42d7e 100644 --- a/src/apps/lemma-finance/contracts/ethers/factories/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/index.ts @@ -2,7 +2,7 @@ /* tslint:disable */ /* eslint-disable */ export { PerpLemma__factory } from './PerpLemma__factory'; +export { StakedUsdl__factory } from './StakedUsdl__factory'; export { Synth__factory } from './Synth__factory'; export { Usdl__factory } from './Usdl__factory'; export { XSynth__factory } from './XSynth__factory'; -export { XUsdl__factory } from './XUsdl__factory'; diff --git a/src/apps/lemma-finance/contracts/ethers/index.ts b/src/apps/lemma-finance/contracts/ethers/index.ts index cdd8fea8f..bbac4191e 100644 --- a/src/apps/lemma-finance/contracts/ethers/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/index.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ export type { PerpLemma } from './PerpLemma'; +export type { StakedUsdl } from './StakedUsdl'; export type { Synth } from './Synth'; export type { Usdl } from './Usdl'; export type { XSynth } from './XSynth'; -export type { XUsdl } from './XUsdl'; export * as factories from './factories'; export { PerpLemma__factory } from './factories/PerpLemma__factory'; +export { StakedUsdl__factory } from './factories/StakedUsdl__factory'; export { Synth__factory } from './factories/Synth__factory'; export { Usdl__factory } from './factories/Usdl__factory'; export { XSynth__factory } from './factories/XSynth__factory'; -export { XUsdl__factory } from './factories/XUsdl__factory'; diff --git a/src/apps/lemma-finance/contracts/index.ts b/src/apps/lemma-finance/contracts/index.ts index 94b6452c2..200bc094e 100644 --- a/src/apps/lemma-finance/contracts/index.ts +++ b/src/apps/lemma-finance/contracts/index.ts @@ -5,10 +5,10 @@ import { ContractFactory } from '~contract/contracts'; import { Network } from '~types/network.interface'; import { PerpLemma__factory } from './ethers'; +import { StakedUsdl__factory } from './ethers'; import { Synth__factory } from './ethers'; import { Usdl__factory } from './ethers'; import { XSynth__factory } from './ethers'; -import { XUsdl__factory } from './ethers'; // eslint-disable-next-line type ContractOpts = { address: string; network: Network }; @@ -22,6 +22,9 @@ export class LemmaFinanceContractFactory extends ContractFactory { perpLemma({ address, network }: ContractOpts) { return PerpLemma__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } + stakedUsdl({ address, network }: ContractOpts) { + return StakedUsdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } synth({ address, network }: ContractOpts) { return Synth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } @@ -31,13 +34,10 @@ export class LemmaFinanceContractFactory extends ContractFactory { xSynth({ address, network }: ContractOpts) { return XSynth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } - xUsdl({ address, network }: ContractOpts) { - return XUsdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); - } } export type { PerpLemma } from './ethers'; +export type { StakedUsdl } from './ethers'; export type { Synth } from './ethers'; export type { Usdl } from './ethers'; export type { XSynth } from './ethers'; -export type { XUsdl } from './ethers'; diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts index 2146a8d84..3251e93ef 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts @@ -35,7 +35,7 @@ export class OptimismLemmaFinanceXUsdlTokenFetcher implements PositionFetcher Date: Sat, 10 Dec 2022 21:53:43 -0500 Subject: [PATCH 5/5] fix(lemma-finance): Fix xUSDL ABI filename --- .../contracts/abis/{staked-usdl.json => x-usdl.json} | 0 .../contracts/ethers/{StakedUsdl.ts => XUsdl.ts} | 6 +++--- .../{StakedUsdl__factory.ts => XUsdl__factory.ts} | 12 ++++++------ .../contracts/ethers/factories/index.ts | 2 +- src/apps/lemma-finance/contracts/ethers/index.ts | 4 ++-- src/apps/lemma-finance/contracts/index.ts | 10 +++++----- .../optimism/lemma-finance.x-usdl.token-fetcher.ts | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) rename src/apps/lemma-finance/contracts/abis/{staked-usdl.json => x-usdl.json} (100%) rename src/apps/lemma-finance/contracts/ethers/{StakedUsdl.ts => XUsdl.ts} (99%) rename src/apps/lemma-finance/contracts/ethers/factories/{StakedUsdl__factory.ts => XUsdl__factory.ts} (98%) diff --git a/src/apps/lemma-finance/contracts/abis/staked-usdl.json b/src/apps/lemma-finance/contracts/abis/x-usdl.json similarity index 100% rename from src/apps/lemma-finance/contracts/abis/staked-usdl.json rename to src/apps/lemma-finance/contracts/abis/x-usdl.json diff --git a/src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts b/src/apps/lemma-finance/contracts/ethers/XUsdl.ts similarity index 99% rename from src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts rename to src/apps/lemma-finance/contracts/ethers/XUsdl.ts index 96da8e3ec..7311a98b0 100644 --- a/src/apps/lemma-finance/contracts/ethers/StakedUsdl.ts +++ b/src/apps/lemma-finance/contracts/ethers/XUsdl.ts @@ -17,7 +17,7 @@ import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi import type { Listener, Provider } from '@ethersproject/providers'; import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common'; -export interface StakedUsdlInterface extends utils.Interface { +export interface XUsdlInterface extends utils.Interface { functions: { 'DOMAIN_SEPARATOR()': FunctionFragment; 'allowance(address,address)': FunctionFragment; @@ -312,12 +312,12 @@ export type WithdrawEvent = TypedEvent<[string, string, BigNumber, BigNumber], W export type WithdrawEventFilter = TypedEventFilter; -export interface StakedUsdl extends BaseContract { +export interface XUsdl extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; - interface: StakedUsdlInterface; + interface: XUsdlInterface; queryFilter( event: TypedEventFilter, diff --git a/src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts b/src/apps/lemma-finance/contracts/ethers/factories/XUsdl__factory.ts similarity index 98% rename from src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts rename to src/apps/lemma-finance/contracts/ethers/factories/XUsdl__factory.ts index f7f7924de..39aa0a172 100644 --- a/src/apps/lemma-finance/contracts/ethers/factories/StakedUsdl__factory.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/XUsdl__factory.ts @@ -4,7 +4,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { Provider } from '@ethersproject/providers'; -import type { StakedUsdl, StakedUsdlInterface } from '../StakedUsdl'; +import type { XUsdl, XUsdlInterface } from '../XUsdl'; const _abi = [ { @@ -919,12 +919,12 @@ const _abi = [ }, ]; -export class StakedUsdl__factory { +export class XUsdl__factory { static readonly abi = _abi; - static createInterface(): StakedUsdlInterface { - return new utils.Interface(_abi) as StakedUsdlInterface; + static createInterface(): XUsdlInterface { + return new utils.Interface(_abi) as XUsdlInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): StakedUsdl { - return new Contract(address, _abi, signerOrProvider) as StakedUsdl; + static connect(address: string, signerOrProvider: Signer | Provider): XUsdl { + return new Contract(address, _abi, signerOrProvider) as XUsdl; } } diff --git a/src/apps/lemma-finance/contracts/ethers/factories/index.ts b/src/apps/lemma-finance/contracts/ethers/factories/index.ts index ed7e42d7e..96608e02b 100644 --- a/src/apps/lemma-finance/contracts/ethers/factories/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/factories/index.ts @@ -2,7 +2,7 @@ /* tslint:disable */ /* eslint-disable */ export { PerpLemma__factory } from './PerpLemma__factory'; -export { StakedUsdl__factory } from './StakedUsdl__factory'; export { Synth__factory } from './Synth__factory'; export { Usdl__factory } from './Usdl__factory'; export { XSynth__factory } from './XSynth__factory'; +export { XUsdl__factory } from './XUsdl__factory'; diff --git a/src/apps/lemma-finance/contracts/ethers/index.ts b/src/apps/lemma-finance/contracts/ethers/index.ts index bbac4191e..cdd8fea8f 100644 --- a/src/apps/lemma-finance/contracts/ethers/index.ts +++ b/src/apps/lemma-finance/contracts/ethers/index.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ export type { PerpLemma } from './PerpLemma'; -export type { StakedUsdl } from './StakedUsdl'; export type { Synth } from './Synth'; export type { Usdl } from './Usdl'; export type { XSynth } from './XSynth'; +export type { XUsdl } from './XUsdl'; export * as factories from './factories'; export { PerpLemma__factory } from './factories/PerpLemma__factory'; -export { StakedUsdl__factory } from './factories/StakedUsdl__factory'; export { Synth__factory } from './factories/Synth__factory'; export { Usdl__factory } from './factories/Usdl__factory'; export { XSynth__factory } from './factories/XSynth__factory'; +export { XUsdl__factory } from './factories/XUsdl__factory'; diff --git a/src/apps/lemma-finance/contracts/index.ts b/src/apps/lemma-finance/contracts/index.ts index 200bc094e..94b6452c2 100644 --- a/src/apps/lemma-finance/contracts/index.ts +++ b/src/apps/lemma-finance/contracts/index.ts @@ -5,10 +5,10 @@ import { ContractFactory } from '~contract/contracts'; import { Network } from '~types/network.interface'; import { PerpLemma__factory } from './ethers'; -import { StakedUsdl__factory } from './ethers'; import { Synth__factory } from './ethers'; import { Usdl__factory } from './ethers'; import { XSynth__factory } from './ethers'; +import { XUsdl__factory } from './ethers'; // eslint-disable-next-line type ContractOpts = { address: string; network: Network }; @@ -22,9 +22,6 @@ export class LemmaFinanceContractFactory extends ContractFactory { perpLemma({ address, network }: ContractOpts) { return PerpLemma__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } - stakedUsdl({ address, network }: ContractOpts) { - return StakedUsdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); - } synth({ address, network }: ContractOpts) { return Synth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } @@ -34,10 +31,13 @@ export class LemmaFinanceContractFactory extends ContractFactory { xSynth({ address, network }: ContractOpts) { return XSynth__factory.connect(address, this.appToolkit.getNetworkProvider(network)); } + xUsdl({ address, network }: ContractOpts) { + return XUsdl__factory.connect(address, this.appToolkit.getNetworkProvider(network)); + } } export type { PerpLemma } from './ethers'; -export type { StakedUsdl } from './ethers'; export type { Synth } from './ethers'; export type { Usdl } from './ethers'; export type { XSynth } from './ethers'; +export type { XUsdl } from './ethers'; diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts index 3251e93ef..2146a8d84 100644 --- a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts +++ b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts @@ -35,7 +35,7 @@ export class OptimismLemmaFinanceXUsdlTokenFetcher implements PositionFetcher