assembly/composables/useStrategy.ts

154 lines
4.1 KiB
TypeScript
Raw Permalink Normal View History

2021-08-25 19:42:41 +00:00
import {
nextTick,
onMounted,
ref,
watch,
watchEffect
} from "@nuxtjs/composition-api";
2021-08-22 19:34:59 +00:00
import tokens from "~/constant/tokens";
2021-08-25 19:42:41 +00:00
import {
buildStrategy,
DefineStrategy,
StrategyProtocol
} from "~/core/strategies";
import { position as aaveV2Position } from "./protocols/useAaveV2Position";
import { position as compoundPosition } from "./protocols/useCompoundPosition";
import { vault as makerPosition } from "./protocols/useMakerdaoPosition";
2021-09-05 15:28:08 +00:00
import {
trove as liquityPosition,
troveTypes,
troveOverallDetails
} from "./protocols/useLiquityPosition";
2021-08-22 17:35:46 +00:00
import { useBalances } from "./useBalances";
import { useDSA } from "./useDSA";
2021-08-25 11:13:23 +00:00
import useEventBus from "./useEventBus";
2021-08-22 18:32:28 +00:00
import { useNotification } from "./useNotification";
import { useSidebar } from "./useSidebar";
2021-08-25 11:13:23 +00:00
import { useToken } from "./useToken";
2021-09-05 22:40:07 +00:00
import { useWeb3 } from "@instadapp/vue-web3";
2021-08-26 18:34:27 +00:00
import { useBigNumber } from "./useBigNumber";
2021-09-04 17:39:05 +00:00
import tokenIdMapping from "~/constant/tokenIdMapping";
2021-09-05 11:01:19 +00:00
import { useFormatting } from "./useFormatting";
2021-09-05 22:40:07 +00:00
import { useNetwork } from "./useNetwork";
2021-08-26 18:34:27 +00:00
2021-08-22 17:35:46 +00:00
export function useStrategy(defineStrategy: DefineStrategy) {
2021-09-05 22:40:07 +00:00
const { library, account } = useWeb3();
const { activeNetworkId } = useNetwork()
2021-08-22 17:35:46 +00:00
const { dsa } = useDSA();
2021-08-22 18:32:28 +00:00
const { prices, balances, fetchBalances } = useBalances();
const { close } = useSidebar();
2021-08-25 11:13:23 +00:00
const { valInt, getTokenByKey } = useToken();
const { emitEvent } = useEventBus();
2021-08-26 18:34:27 +00:00
const { toBN } = useBigNumber();
2021-09-05 11:01:19 +00:00
const formatting = useFormatting();
2021-08-22 18:32:28 +00:00
const {
showPendingTransaction,
showConfirmedTransaction
} = useNotification();
2021-08-22 17:35:46 +00:00
const strategy = buildStrategy(defineStrategy);
2021-09-05 11:46:39 +00:00
const components = ref(strategy.components);
2021-08-22 17:35:46 +00:00
const error = ref("");
2021-08-25 11:13:23 +00:00
const pending = ref(false);
2021-08-22 17:35:46 +00:00
2021-09-04 16:50:56 +00:00
// strategy.onUpdated(async () => {
// await nextTick();
// });
2021-08-22 17:35:46 +00:00
const submit = async () => {
2021-08-22 18:32:28 +00:00
error.value = "";
2021-08-25 11:13:23 +00:00
pending.value = true;
2021-08-22 17:35:46 +00:00
try {
2021-08-22 18:32:28 +00:00
const tx = await strategy.submit({
onReceipt: async () => {
showConfirmedTransaction(tx);
await fetchBalances(true);
2021-08-25 11:13:23 +00:00
2021-08-25 19:42:41 +00:00
emitEvent(`protocol::${strategy.schema.protocol}::refresh`, {});
2021-08-22 18:32:28 +00:00
},
from: account.value
});
showPendingTransaction(tx);
close();
2021-08-22 17:35:46 +00:00
} catch (e) {
error.value = e.message;
}
2021-08-25 11:13:23 +00:00
pending.value = false;
2021-08-22 17:35:46 +00:00
};
2021-09-05 15:28:08 +00:00
watch(
() => [
aaveV2Position,
makerPosition,
compoundPosition,
liquityPosition,
troveTypes,
troveOverallDetails
],
() => {
let position = null;
let positionExtra = {};
if (strategy.schema.protocol == StrategyProtocol.AAVE_V2) {
position = aaveV2Position.value;
} else if (strategy.schema.protocol == StrategyProtocol.MAKERDAO) {
position = makerPosition.value;
} else if (strategy.schema.protocol == StrategyProtocol.COMPOUND) {
position = compoundPosition.value;
} else if (strategy.schema.protocol == StrategyProtocol.LIQUITY) {
position = liquityPosition.value;
2021-08-25 19:42:41 +00:00
2021-09-05 15:28:08 +00:00
positionExtra["troveTypes"] = troveTypes.value;
positionExtra["troveOverallDetails"] = troveOverallDetails.value;
}
2021-08-25 19:42:41 +00:00
2021-09-05 15:28:08 +00:00
strategy.setProps({
convertTokenAmountToWei: valInt,
getTokenByKey,
toBN,
position,
positionExtra,
tokenIdMapping,
formatting
});
},
{ immediate: true }
);
2021-08-25 11:13:23 +00:00
2021-09-05 22:40:07 +00:00
watch(library, () => strategy.setWeb3(library.value), { immediate: true });
2021-08-22 17:35:46 +00:00
watch(dsa, () => strategy.setDSA(dsa.value), { immediate: true });
watch(
prices,
2021-09-05 22:40:07 +00:00
() => strategy.setProps({ prices: prices[activeNetworkId.value] }),
2021-08-22 17:35:46 +00:00
{ immediate: true }
);
watch(
balances,
() => {
strategy.setProps({
2021-09-05 22:40:07 +00:00
dsaBalances: balances.dsa[activeNetworkId.value],
userBalances: balances.user[activeNetworkId.value]
2021-08-22 17:35:46 +00:00
});
},
{ immediate: true }
);
2021-08-22 19:34:59 +00:00
watch(
2021-09-05 22:40:07 +00:00
activeNetworkId,
2021-08-22 19:34:59 +00:00
() =>
strategy.setProps({
2021-09-05 22:40:07 +00:00
tokens: tokens[activeNetworkId.value].allTokens,
tokenKeys: tokens[activeNetworkId.value].tokenKeys
2021-08-22 19:34:59 +00:00
}),
{ immediate: true }
);
2021-08-22 17:35:46 +00:00
return {
strategy,
2021-09-05 11:46:39 +00:00
components,
2021-08-22 17:35:46 +00:00
submit,
2021-08-25 11:13:23 +00:00
error,
2021-08-25 19:42:41 +00:00
pending
2021-08-22 17:35:46 +00:00
};
}