From b5c6f8af33ab2593cb16f2ed9765179d117626ff Mon Sep 17 00:00:00 2001 From: EmberSpirit Date: Thu, 12 Oct 2023 20:01:11 +0200 Subject: [PATCH] comments + contract update + smaller design issues --- README.md | 12 - public/assets/img/token/elonvamp.png | Bin 7307 -> 6017 bytes public/assets/img/token/pepevamp.png | Bin 11945 -> 9152 bytes public/assets/img/token/shibvamp.png | Bin 13677 -> 11490 bytes src/App.vue | 83 +----- src/assets/contracts/Bloodline.json | 2 +- src/assets/contracts/LiquidityOwner.json | 59 +++-- src/assets/contracts/MemeAltar.json | 151 ++++++----- src/assets/contracts/RewardLocker.json | 234 +++++++++-------- src/assets/contracts/UniswapPool.json | 2 +- src/assets/sass/variables.sass | 4 +- src/components/BloodChart.vue | 47 +--- src/components/CardComponent.vue | 25 +- src/components/ClaimComponent.vue | 59 +---- src/components/ConnectWallet.vue | 21 +- src/components/Navbar.vue | 10 +- src/components/SacrificeToken.vue | 311 ++++++----------------- src/components/StakeComponentV1.vue | 83 +++--- src/components/StakeMenu.vue | 67 ++--- src/components/TokenClaim.vue | 119 ++++++--- src/components/TokenInput.vue | 4 - src/components/TokenLogo.vue | 8 +- src/components/transitionTest.vue | 88 ------- src/helper/helper.js | 34 +++ src/main.js | 62 +---- src/stores/contracts.js | 12 - src/stores/memeburner.js | 27 +- src/stores/rewardlocker.js | 114 +++------ src/stores/rounds.js | 206 --------------- src/stores/tokens.js | 40 ++- src/stores/uniswap.js | 4 +- src/stores/walletV2.js | 29 +-- src/utils/helper.js | 22 -- src/views/CycleView.vue | 105 ++++---- src/views/HomeView.vue | 7 +- src/views/ProfileView.vue | 141 +--------- src/views/TestView.vue | 2 +- 37 files changed, 714 insertions(+), 1480 deletions(-) delete mode 100644 src/components/transitionTest.vue delete mode 100644 src/stores/contracts.js delete mode 100644 src/stores/rounds.js delete mode 100644 src/utils/helper.js diff --git a/README.md b/README.md index d8921a8..be1dc00 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,3 @@ -# vue-ethereum2 - -This template should help get you started developing with Vue 3 in Vite. - -## Recommended IDE Setup - -[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). - -## Customize configuration - -See [Vite Configuration Reference](https://vitejs.dev/config/). - ## Project Setup ```sh diff --git a/public/assets/img/token/elonvamp.png b/public/assets/img/token/elonvamp.png index baf384636107b2f06e303960f101b3c168a02a5a..f4800a951d92d91b8d62e3254136722317c6651f 100644 GIT binary patch literal 6017 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 IM6N<$g3p~DBLDyZ literal 13677 zcmV-zHImASP)wH-#sPme9v%Y@Fiv1FX}~r{ z1PKWVWt4?->YQ^|Rd?n4);_nYy1FHSz<9p*<6XN{)fMhNXP+I`UVER5Hn(i<409Ya z@c)m0=!l!K*J6%pAA_ddhyMo;eZ=3|$PYDqw1@US19*?a9M$i$;G;aW4>o{dhx|_0 zp~v`~;2#N|j($xVZ z5r_jJ9h%z=lRc>++Q{WpIweY{-q)ji5!R6i#i1oqpQpwy+Gc{yX@$e(;Ij=D3xz}# zq_`1_#Sj^YATk(2XfQ&}GL{0TJ& zQ&ws<^wgKmSwB9!FlF&VoFe6^_s5Xn1VpGxJJMQ_{HkbSm;)Z*i+F-U(9$AwcpR8C zdjhIwRAa)-YK)sQ8hJ%tIGuLb9ELFEtFjo0L>!TD6v4nCI$L{i>R>I7>^iERPadp6 zUwfZ?2|C9G8Jn!H!)ypvv{%a*6jve8IlwOTM37=XW{A3ZJI zICbh626}=R^oJ0O#te5rjkVe>aAi5+^16{zn1gu>r(@YQ7r^dzARdcj|Mr8}_{vu7 zTDu!357Z#R_jFl6USFqBHCIxoJQ5t2?l-I>n-(y-(2ad{JxD}!YN+<10^EleW<=R2 zK0B)nV@BuUf!9u8->FXM0Yh6gIWygWo-lOKYPVtfMbmK2?N{N#%jPSM>uK)Aw&ypY zcIQbn9Iiu8V;9Xa$yc6-qA?{XpFRqcFP?_4 z{^$;bzaPQgE&H+h`E^+H%sRxwaiy&yKsb|DK_ScYxYBIgy`mbHKp3~zbwiVR(cG0R zKVU4=78K6A_X9&CUL@Wdg((WWc-u^r<~R|~a^c|(b@-o6C&d#ff24*@jk@Hfi}CR< zUxUfBCL%-)-1a{kvH$hGXgSf0MATRmadk=qlNw>j)1=OoNL~{e3S-s{)7NRb2~Bxr zn0c*&szS`Td=6$`GatTUA6gpP@cb|Tf|vjJ8iKt63}FM{+6yM)jyc8f#lz^P55D1v z-53z}m22qO2U1L3zt3FmE?YujF2M&nIP_ow`7SFyIlWi{DXftw&Yx5SZ&5aOAMZqr zf^p|~aNi%kjhnxAJ@mmCR{i`%Jb&*qIJWr+{9S##zMhV}aTTNz%C8C9F)2an>TfN1 zP0>o_2gTnRYk&k-LAgTBi1+~t?8J^^*!0wT)b2Tj@(JZwdFv%Of8}iK*szD!4Z>zM z~3J9Gh#p(M6Y_+`%xobxz0n4<$^2G5TNv(@L{Yp_{R#wGY*~ zPM9MxOsViy@qUCrKg%C4vVhX;b^zRm8+T#vrh~B3z5Mhui*fbXY)U?e z2>t3)yH3H<7eg0+f1-0hnR&{$W(@Itg=xZvIg;i$I?o9=pM#ANJh<^B212y^-XJb0 zcH{of&Vz$0yZ*0R@W!f*gp%>(;D!rOOJYieijo1>q-4lIU@@d8?}<#+1eInQzc&qA zlqAScUScS4C-C;_ckspw8{l?W@uOSjV^JZ^xZjV#Xb8XAd=gq)0&cpS@+`Xn;o^qc ze^B`Up@gZ&jms2ytQeqqR52R*0%rVh{RukxI7~eOEG%^5fzQu{!w$6c^`W`HO9=!? z0a_T0-;(`W@FRR}r5{4;@hN=hBFVy*<0+UI-r|HI7d;ET!>};iJ zn{dzdvv6UR2U@Qm1Hl12u;wVNy$OtUx)G#?=D8F=Qcx~E*Yw!%(F;>eCZ?tVAHlWE zAjHQ^`bU#r$9-=eL#StvHWtL9QC{4!ViFZOhMLX}^oIwOAXSX!>RT)(^(-2trED`p zuzJ#TMX9ya4@W%IldO_J8j4brg=pz?_FM$|!Gx(iJU!K5LcMg^EX24v0>pwMjTHsC=%MfV z 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 LNkvXXu0mjf=gyML diff --git a/src/App.vue b/src/App.vue index 339d3b6..75f7985 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,59 +6,30 @@ import { useRoute, useRouter } from "vue-router"; import Navbar from "./components/Navbar.vue"; import { useWalletStoreV2 } from "@/stores/walletV2"; import { useTokenStore } from "@/stores/tokens"; -import { useContractStore } from "@/stores/contracts"; +import { useSacrificeStore } from "@/stores/sacrifice"; import { useMemeburnerStore } from "@/stores/memeburner"; import { useRewardLockerStore } from "@/stores/rewardlocker"; -import { useRoundsStore } from "@/stores/rounds"; +import { useCycleStore } from "@/stores/cycles"; import SlideoutPanel from "./components/SlideoutPanel.vue"; import ConnectWallet from "./components/ConnectWallet.vue"; -import CardComponent from "@/components/CardComponent.vue"; -import { - watchAccount, - watchNetwork, - watchContractEvent, - watchWalletClient, - watchPublicClient, - getAccount, - getNetwork, - getPublicClient, - getWalletClient, -} from "@wagmi/core"; +import { getNetwork } from "@wagmi/core"; -const tokenStore = useTokenStore(); -const contractStore = useContractStore(); -const memeBurnerStore = useMemeburnerStore(); -const rewardLockerStore = useRewardLockerStore(); -const roundsStore = useRoundsStore(); -const walletStore = useWalletStoreV2(); -const { memeBurner, token } = storeToRefs(tokenStore); -const { list } = storeToRefs(contractStore); const isMobile = ref(false); const showPanel = ref(false); -const eventWatch = ref(null); -const netWorkEvent = ref(null); -const memeSacrificedEvent = ref(null); -const clientClientEvent = ref(null); const router = useRouter(); const route = useRoute(); isMobile.value = isMobileFunc(); + onUnmounted(() => { window.removeEventListener("resize", handleWindowSizeChange); - - eventWatch.value(); - netWorkEvent.value(); - memeSacrificedEvent.value(); - clientClientEvent.value(); - console.log("unsubscribe"); }); watch(showPanel, (newValue, oldValue) => { console.log("document.body", document.body); - console.log("newValue", newValue); if (newValue) { document.body.classList.add("sideoutpanel-open"); } else { @@ -71,10 +42,7 @@ const handleWindowSizeChange = () => { // your code }; -function showPanelTest(bla) { - console.log("bla", bla); -} - +//to have mobile breakpoint not only on sass side function isMobileFunc() { if (screen.width <= 760) { return true; @@ -84,8 +52,6 @@ function isMobileFunc() { } function changeRoute(name) { - console.log("route", route); - console.log("router", router); router.push({ name: name, }); @@ -94,44 +60,23 @@ provide("isMobile", isMobile); provide("showPanel", showPanel); onMounted(async () => { - console.log("onmounted"); window.addEventListener("resize", handleWindowSizeChange); handleWindowSizeChange(); - const showPanel = ref(false); - const eventWatch = ref(null); - const netWorkEvent = ref(null); - const memeSacrificedEvent = ref(null); - const clientClientEvent = ref(null); console.log("beforeEach"); - const tokenStore = useTokenStore(); const memeBurnerStore = useMemeburnerStore(); - const rewardLockerStore = useRewardLockerStore(); - const roundsStore = useRoundsStore(); + const cycleStore = useCycleStore(); const walletStore = useWalletStoreV2(); walletStore.initialized = true; - // await walletStore.init(); - // await tokenStore.initV2(); - // await memeBurnerStore.init(); - // await rewardLockerStore.init(); - // await memeBurnerStore.init(); console.log("init router"); - console.log("roundsStore.currentRound", roundsStore.currentRound); - if (!roundsStore.currentRound) { - roundsStore.currentRound = parseInt(await memeBurnerStore.getCurrentRound()); - console.log("roundsStore.currentRound", roundsStore.currentRound); - roundsStore.activeRound = roundsStore.currentRound; + //check if it is necessary + if (!cycleStore.currentCycle) { + cycleStore.currentCycle = parseInt(await memeBurnerStore.getCurrentCycle()); + console.log("cycleStore.currentCycle", cycleStore.currentCycle); + cycleStore.activeCycle = cycleStore.currentCycle; } - const { chain, chains } = getNetwork(); - console.log("chain", chain?.id); - console.log("chains", chains); - - await roundsStore.fillRound(roundsStore.activeRound); - // await walletStore.loadWalletData(); - - // initContracts - //Memeburner Contract + await cycleStore.fillCycle(cycleStore.activeCycle); }); @@ -221,7 +166,7 @@ onMounted(async () => { margin-top: 82px padding: 24px 0 @media (min-width: 992px) - margin-top: 96px + margin-top: 80px padding: 80px 0 &.mobile &.no-scroll @@ -295,7 +240,7 @@ body::-webkit-scrollbar-track background: #202020 body::-webkit-scrollbar-thumb - background: #202020 + background: grey body:hover::-webkit-scrollbar-thumb background: grey diff --git a/src/assets/contracts/Bloodline.json b/src/assets/contracts/Bloodline.json index e4a7386..e60ecfb 100644 --- a/src/assets/contracts/Bloodline.json +++ b/src/assets/contracts/Bloodline.json @@ -1,6 +1,6 @@ { "contractName": "Bloodline", - "contractAddress": "0xBd6bB82108D5F27E8A8f081723408bF26d665a8c", + "contractAddress": "0xB7d11da1922328A10cCb357F571125151e558aFe", "abi": [ { "inputs": [ diff --git a/src/assets/contracts/LiquidityOwner.json b/src/assets/contracts/LiquidityOwner.json index 0917e82..b5ecdd6 100644 --- a/src/assets/contracts/LiquidityOwner.json +++ b/src/assets/contracts/LiquidityOwner.json @@ -1,6 +1,6 @@ { "contractName": "LiquidityOwner", - "contractAddress": "0xEb898F92F7db3bbF807513C847bfDeE846E1b5Ff", + "contractAddress": "0x6AE9254705216A0d96A4A8d601a9DDB94C234859", "abi": [ { "inputs": [ @@ -28,6 +28,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "CallbackCanBeCalledOnlyByPool", + "type": "error" + }, { "inputs": [], "name": "CurrentPriceDisallowsToProvide", @@ -38,11 +43,21 @@ "name": "NothingToProvide", "type": "error" }, + { + "inputs": [], + "name": "OnlyMemeAltar", + "type": "error" + }, { "inputs": [], "name": "ProjectAlive", "type": "error" }, + { + "inputs": [], + "name": "WrongSideOfPrice", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -167,7 +182,7 @@ "type": "int24" } ], - "name": "collectDeveloperFees", + "name": "collectPositionFees", "outputs": [ { "internalType": "uint128", @@ -255,7 +270,7 @@ }, { "inputs": [], - "name": "previousBLDTotalSupply", + "name": "previousBDLTotalSupply", "outputs": [ { "internalType": "uint128", @@ -266,6 +281,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint112", + "name": "collectedEthInCycle", + "type": "uint112" + } + ], + "name": "provideLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "issuancePrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -313,25 +347,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint112", - "name": "collectedEthInRound", - "type": "uint112" - } - ], - "name": "triggerRoundCompleted", - "outputs": [ - { - "internalType": "uint256", - "name": "issuancePrice", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/src/assets/contracts/MemeAltar.json b/src/assets/contracts/MemeAltar.json index 147fee4..3c6797f 100644 --- a/src/assets/contracts/MemeAltar.json +++ b/src/assets/contracts/MemeAltar.json @@ -1,6 +1,6 @@ { "contractName": "MemeAltar", - "contractAddress": "0x9fA80C0A942016A0a246402e97d30562CF93f5AE", + "contractAddress": "0x9612054A85502f2484c93C84eeCd14F65C6E4941", "abi": [ { "inputs": [ @@ -48,6 +48,11 @@ "name": "ArraysHaveDifferentLength", "type": "error" }, + { + "inputs": [], + "name": "CycleCompletedRegistrationFailed", + "type": "error" + }, { "inputs": [], "name": "InsufficientOutputAmount", @@ -65,7 +70,17 @@ }, { "inputs": [], - "name": "NextRoundRegistrationFailed", + "name": "NextCycleRegistrationFailed", + "type": "error" + }, + { + "inputs": [], + "name": "NotAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "NotExactInput", "type": "error" }, { @@ -80,7 +95,12 @@ }, { "inputs": [], - "name": "RoundCompletedRegistrationFailed", + "name": "SwapCallbackCanBeCalledOnlyByPool", + "type": "error" + }, + { + "inputs": [], + "name": "SwapWithinZeroLiquidity", "type": "error" }, { @@ -93,6 +113,11 @@ "name": "TokenIsNotInSacrificableList", "type": "error" }, + { + "inputs": [], + "name": "TooLittleReceived", + "type": "error" + }, { "inputs": [ { @@ -110,7 +135,7 @@ { "indexed": true, "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -135,7 +160,7 @@ { "indexed": true, "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -237,11 +262,11 @@ { "indexed": true, "internalType": "uint256", - "name": "newDefaultGoal", + "name": "newDurationLimit", "type": "uint256" } ], - "name": "NewDefaultRoundGoal", + "name": "NewCycleDurationLimit", "type": "event" }, { @@ -250,11 +275,11 @@ { "indexed": true, "internalType": "uint256", - "name": "newDurationLimit", + "name": "newDefaultGoal", "type": "uint256" } ], - "name": "NewRoundDurationLimit", + "name": "NewDefaultCycleGoal", "type": "event" }, { @@ -335,12 +360,12 @@ { "inputs": [ { - "internalType": "uint112", - "name": "newDefaultGoal", - "type": "uint112" + "internalType": "uint32", + "name": "newDurationLimit", + "type": "uint32" } ], - "name": "adjustDefaultGoal", + "name": "adjustCycleDurationLimit", "outputs": [ { "internalType": "bool", @@ -354,12 +379,12 @@ { "inputs": [ { - "internalType": "uint32", - "name": "newDurationLimit", - "type": "uint32" + "internalType": "uint112", + "name": "newDefaultGoal", + "type": "uint112" } ], - "name": "adjustRoundDurationLimit", + "name": "adjustDefaultGoal", "outputs": [ { "internalType": "bool", @@ -436,7 +461,7 @@ }, { "inputs": [], - "name": "currentRound", + "name": "currentCycle", "outputs": [ { "internalType": "uint112", @@ -447,6 +472,48 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "cycleDurationLimit", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint112", + "name": "", + "type": "uint112" + } + ], + "name": "cycles", + "outputs": [ + { + "internalType": "uint112", + "name": "goal", + "type": "uint112" + }, + { + "internalType": "uint112", + "name": "ethUsedToBuy", + "type": "uint112" + }, + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "defaultGoal", @@ -474,7 +541,7 @@ }, { "internalType": "bool", - "name": "roundParticipant", + "name": "cycleParticipant", "type": "bool" } ], @@ -517,7 +584,7 @@ "inputs": [ { "internalType": "uint112", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint112" } ], @@ -565,7 +632,7 @@ "inputs": [ { "internalType": "uint112", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint112" }, { @@ -686,48 +753,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "roundDurationLimit", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint112", - "name": "", - "type": "uint112" - } - ], - "name": "rounds", - "outputs": [ - { - "internalType": "uint112", - "name": "goal", - "type": "uint112" - }, - { - "internalType": "uint112", - "name": "ethUsedToBuy", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "expirationTimestamp", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { diff --git a/src/assets/contracts/RewardLocker.json b/src/assets/contracts/RewardLocker.json index 611fb30..a8218e6 100644 --- a/src/assets/contracts/RewardLocker.json +++ b/src/assets/contracts/RewardLocker.json @@ -1,6 +1,6 @@ { "contractName": "RewardLocker", - "contractAddress": "0xC21568120adc35AB0aA7460A4A5E1C3D4f845269", + "contractAddress": "0x216d1477B7686a0388A8881061FAc9c66469fC9c", "abi": [ { "inputs": [ @@ -20,7 +20,17 @@ }, { "inputs": [], - "name": "RoundIsNotCompletedYet", + "name": "CycleIsNotCompletedYet", + "type": "error" + }, + { + "inputs": [], + "name": "NotMemeAltar", + "type": "error" + }, + { + "inputs": [], + "name": "StakePartMoreThan100Percent", "type": "error" }, { @@ -52,6 +62,44 @@ "name": "ClaimedReward", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "winnerToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "totalCycleRewards", + "type": "uint256" + } + ], + "name": "CycleCompleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "CycleStarted", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -64,7 +112,7 @@ { "indexed": true, "internalType": "uint256", - "name": "stakedRound", + "name": "stakedCycle", "type": "uint256" }, { @@ -89,7 +137,7 @@ { "indexed": true, "internalType": "uint256", - "name": "unstakeRound", + "name": "unstakeCycle", "type": "uint256" }, { @@ -114,7 +162,7 @@ { "indexed": true, "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -133,44 +181,6 @@ "name": "Rewarded", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "winnerToken", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "totalRoundRewards", - "type": "uint256" - } - ], - "name": "RoundCompleted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "RoundStarted", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -183,7 +193,7 @@ { "indexed": true, "internalType": "uint256", - "name": "unstakeRound", + "name": "unstakeCycle", "type": "uint256" }, { @@ -213,7 +223,7 @@ "inputs": [ { "internalType": "uint256[]", - "name": "_rounds", + "name": "_cycles", "type": "uint256[]" }, { @@ -237,7 +247,7 @@ "inputs": [ { "internalType": "uint256[]", - "name": "_rounds", + "name": "_cycles", "type": "uint256[]" } ], @@ -256,7 +266,7 @@ "inputs": [ { "internalType": "uint256[]", - "name": "_rounds", + "name": "_cycles", "type": "uint256[]" }, { @@ -276,6 +286,35 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "cycles", + "outputs": [ + { + "internalType": "uint32", + "name": "cycleCompletedTimestamp", + "type": "uint32" + }, + { + "internalType": "uint224", + "name": "totalSacrificeCompetitionRewards", + "type": "uint224" + }, + { + "internalType": "uint256", + "name": "totalStakeRewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -285,7 +324,7 @@ }, { "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -314,7 +353,7 @@ "inputs": [ { "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" } ], @@ -333,7 +372,7 @@ "inputs": [ { "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -362,7 +401,7 @@ }, { "internalType": "uint256[]", - "name": "roundNumbers", + "name": "cycleNumbers", "type": "uint256[]" } ], @@ -386,7 +425,7 @@ "inputs": [ { "internalType": "uint256", - "name": "roundNumber", + "name": "cycleNumber", "type": "uint256" }, { @@ -426,7 +465,7 @@ }, { "inputs": [], - "name": "lastCompletedRound", + "name": "lastCompletedCycle", "outputs": [ { "internalType": "uint256", @@ -456,7 +495,7 @@ "outputs": [ { "internalType": "uint256", - "name": "unstakeRound", + "name": "unstakeCycle", "type": "uint256" } ], @@ -467,7 +506,31 @@ "inputs": [ { "internalType": "uint256", - "name": "roundIndex", + "name": "cycleIndex", + "type": "uint256" + }, + { + "internalType": "address", + "name": "winnerToken", + "type": "address" + } + ], + "name": "registerCycleCompleted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "cycleIndex", "type": "uint256" }, { @@ -476,7 +539,7 @@ "type": "address[]" } ], - "name": "registerNextRound", + "name": "registerNextCycle", "outputs": [ { "internalType": "bool", @@ -516,59 +579,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "roundIndex", - "type": "uint256" - }, - { - "internalType": "address", - "name": "winnerToken", - "type": "address" - } - ], - "name": "registerRoundCompleted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "rounds", - "outputs": [ - { - "internalType": "uint32", - "name": "roundCompletedTimestamp", - "type": "uint32" - }, - { - "internalType": "uint224", - "name": "totalSacrificeCompetitionRewards", - "type": "uint224" - }, - { - "internalType": "uint256", - "name": "totalStakeRewards", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -578,7 +588,7 @@ }, { "internalType": "uint256[]", - "name": "_rounds", + "name": "_cycles", "type": "uint256[]" }, { @@ -646,7 +656,7 @@ "inputs": [ { "internalType": "uint256[]", - "name": "_rounds", + "name": "_cycles", "type": "uint256[]" }, { @@ -708,7 +718,7 @@ "inputs": [ { "internalType": "uint256", - "name": "unstakeRound", + "name": "unstakeCycle", "type": "uint256" } ], diff --git a/src/assets/contracts/UniswapPool.json b/src/assets/contracts/UniswapPool.json index 47b29ee..1791b46 100644 --- a/src/assets/contracts/UniswapPool.json +++ b/src/assets/contracts/UniswapPool.json @@ -1,5 +1,5 @@ { "contractName": "OurUniV3Pool", - "contractAddress": "0xAAC69F9d8A960eeda4F8211CA9F17aD6151D8F25", + "contractAddress": "0xA82a55f15Ed9c4fcaf260A7fdDbc3ba8E35959fb", "abi": [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"CollectProtocol","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid1","type":"uint256"}],"name":"Flash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"observationCardinalityNextOld","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"observationCardinalityNextNew","type":"uint16"}],"name":"IncreaseObservationCardinalityNext","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"feeProtocol0Old","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol1Old","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol0New","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol1New","type":"uint8"}],"name":"SetFeeProtocol","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"int256","name":"amount0","type":"int256"},{"indexed":false,"internalType":"int256","name":"amount1","type":"int256"},{"indexed":false,"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"}],"name":"collect","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"}],"name":"collectProtocol","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGrowthGlobal0X128","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGrowthGlobal1X128","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"observationCardinalityNext","type":"uint16"}],"name":"increaseObservationCardinalityNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLiquidityPerTick","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"int56","name":"tickCumulative","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityCumulativeX128","type":"uint160"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"secondsAgos","type":"uint32[]"}],"name":"observe","outputs":[{"internalType":"int56[]","name":"tickCumulatives","type":"int56[]"},{"internalType":"uint160[]","name":"secondsPerLiquidityCumulativeX128s","type":"uint160[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"positions","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"feeGrowthInside0LastX128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1LastX128","type":"uint256"},{"internalType":"uint128","name":"tokensOwed0","type":"uint128"},{"internalType":"uint128","name":"tokensOwed1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFees","outputs":[{"internalType":"uint128","name":"token0","type":"uint128"},{"internalType":"uint128","name":"token1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"feeProtocol0","type":"uint8"},{"internalType":"uint8","name":"feeProtocol1","type":"uint8"}],"name":"setFeeProtocol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slot0","outputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"uint16","name":"observationIndex","type":"uint16"},{"internalType":"uint16","name":"observationCardinality","type":"uint16"},{"internalType":"uint16","name":"observationCardinalityNext","type":"uint16"},{"internalType":"uint8","name":"feeProtocol","type":"uint8"},{"internalType":"bool","name":"unlocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"snapshotCumulativesInside","outputs":[{"internalType":"int56","name":"tickCumulativeInside","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityInsideX128","type":"uint160"},{"internalType":"uint32","name":"secondsInside","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int16","name":"","type":"int16"}],"name":"tickBitmap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickSpacing","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"","type":"int24"}],"name":"ticks","outputs":[{"internalType":"uint128","name":"liquidityGross","type":"uint128"},{"internalType":"int128","name":"liquidityNet","type":"int128"},{"internalType":"uint256","name":"feeGrowthOutside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthOutside1X128","type":"uint256"},{"internalType":"int56","name":"tickCumulativeOutside","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityOutsideX128","type":"uint160"},{"internalType":"uint32","name":"secondsOutside","type":"uint32"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] } diff --git a/src/assets/sass/variables.sass b/src/assets/sass/variables.sass index b44e9ef..05b0a7d 100644 --- a/src/assets/sass/variables.sass +++ b/src/assets/sass/variables.sass @@ -97,8 +97,8 @@ $button-background-color: $black font-style: normal font-weight: 400 line-height: normal - @media (min-width: 992px) - font-size: 30px + // @media (min-width: 992px) + // font-size: 30px // :root // --font-size-text: 16px diff --git a/src/components/BloodChart.vue b/src/components/BloodChart.vue index 3cbd270..8493409 100644 --- a/src/components/BloodChart.vue +++ b/src/components/BloodChart.vue @@ -20,7 +20,12 @@
- logo + +
{{ coin.name }}
@@ -67,8 +72,7 @@ @@ -91,7 +95,9 @@ diff --git a/src/components/ClaimComponent.vue b/src/components/ClaimComponent.vue index 5ce48cc..b5cd8c8 100644 --- a/src/components/ClaimComponent.vue +++ b/src/components/ClaimComponent.vue @@ -37,7 +37,7 @@
Stake & Claim Rest
@@ -55,7 +55,9 @@ @@ -88,6 +90,8 @@ import { useTokenStore } from "@/stores/tokens"; import { useRewardLockerStore } from "@/stores/rewardlocker"; import { useRouter } from "vue-router"; import { useToast } from "vue-toastification"; +import { formatNumber } from "@/helper/helper.js"; +import { showSuccessToast } from "@/helper/toast.js"; const toast = useToast(); const rewardLockerStore = useRewardLockerStore(); @@ -121,17 +125,12 @@ function openStake() { stakeMenu.value = true; } -function openUnstake() { - stake.value = false; - stakeMenu.value = true; -} - -async function stakeAndClaimAllRounds() { +async function stakeAndClaimAllCycles() { try { const unclaimedRewards = walletStore.memeToken?.unclaimedRewards; stateClaim.value = 2; const coefficient = (10000 * tokenNumber.value) / unclaimedRewards; - var hash = await rewardLockerStore.stakeAndClaimAllRounds(coefficient); + var hash = await rewardLockerStore.stakeAndClaimAllCycles(coefficient); stateClaim.value = 3; const data = await waitForTransaction({ hash: hash, @@ -147,7 +146,7 @@ async function stakeAndClaimAllRounds() { //ClaimedReward (address staker, uint256 reward) const outputClaim = Number(rewardData.topics[2]) / Math.pow(10, tokenStore.memeToken.decimals); showSuccessToast( - outputClaim.toFixed(5), + formatNumber(outputClaim), "Success!", "You just claimed and staked", "Join the next cycle to increase your rewards and win with your clan" @@ -178,7 +177,7 @@ async function claimAll() { //ClaimedReward (address staker, uint256 reward) const outputClaim = Number(rewardData.topics[2]) / Math.pow(10, tokenStore.memeToken.decimals); showSuccessToast( - outputClaim.toFixed(5), + formatNumber(outputClaim), "Success!", "You just claimed", "Join the next cycle to increase your rewards and win with your clan." @@ -220,42 +219,6 @@ const stateClaimComp = computed(() => { } return returnState; }); - -function showSuccessToast(value, header, subheader, info) { - // Define the content object with the component, props and listeners - const content = { - component: StakeSuccessToast, - // Any prop can be passed, but don't expect them to be reactive - props: { - // counter: this.counter, - // value: tokenStore.activeToken.rewards?.toFixed(5), - value: value, - header: header, - subheader: subheader, - info: info, - }, - // Listen and react to events using callbacks. In this case we listen for - // the "click" event emitted when clicking the toast button - listeners: {}, - }; - - // Render the toast and its contents - toast(content, { - position: "top-center", - icon: false, - closeOnClick: false, - toastClassName: "modal-overlay", - closeButton: false, - hideProgressBar: true, - timeout: false, - }); -} - + diff --git a/src/components/ConnectWallet.vue b/src/components/ConnectWallet.vue index 9fca2dc..abffc51 100644 --- a/src/components/ConnectWallet.vue +++ b/src/components/ConnectWallet.vue @@ -67,10 +67,8 @@ import { ref, toRaw, onMounted, onUnmounted, getCurrentInstance } from "vue"; import { useWalletStoreV2 } from "@/stores/walletV2"; import { useTokenStore } from "@/stores/tokens"; -import Meme1Json from "@/assets/contracts/Meme1.json"; import TokenNamePrice from "./TokenNamePrice.vue"; import TokenLogo from "./TokenLogo.vue"; -import TokenInput from "./TokenInput.vue"; import StakeComponentV1 from "@/components/StakeComponentV1.vue"; import { getAddressShortName, getblocky } from "@/helper/helper.js"; @@ -83,21 +81,15 @@ const router = useRouter(); const walletStore = useWalletStoreV2(); const tokenStore = useTokenStore(); -const goerliKey = import.meta.env.VITE_GOERLI_KEY; +// const goerliKey = import.meta.env.VITE_GOERLI_KEY; -const fromAddress = ref(null); - -const accountSub = ref(null); - -const metaMaskInstalled = ref(false); const instance = getCurrentInstance(); + async function disconnectWallet() { console.log("disconnectWallet"); try { instance.parent.emit("update:modelValue", false); await disconnect(); - // walletStore.connected = false; - // walletStore.address = null; } catch (error) { console.log("error", error); } @@ -112,10 +104,12 @@ function isMetaMaskInstalled() { return false; } +//go to the sacrifice-page and select the clicked token +//if contract === bloodline show buy +//we could also show buy, if there is no pepe function badgeClick(token) { var tokenData = tokenStore.getToken(token.contractAddress); tokenStore.activeToken = tokenData; - // router.push({ name: "home", hash: `#${tokenData.name}` }); if (tokenStore.memeToken.contractAddress === token.contractAddress) { //buy window.open( @@ -128,6 +122,7 @@ function badgeClick(token) { } } +//special case for metaMask, but I think that is the most used wallet async function connectWallet(connector) { if (connector.id === "metaMask" && !isMetaMaskInstalled()) { window.open(" https://metamask.io/", "_blank"); @@ -136,10 +131,6 @@ async function connectWallet(connector) { instance.parent.emit("update:modelValue", false); await walletStore.connectWallet(toRaw(connector)); } - -onMounted(async () => { - console.log("window.ethereum", window.ethereum); -}); - - diff --git a/src/helper/helper.js b/src/helper/helper.js index 0c90a6f..755e507 100644 --- a/src/helper/helper.js +++ b/src/helper/helper.js @@ -15,6 +15,20 @@ export function compactNumber(number) { }).format(parseInt(number)); } + +export function formatNumber(number) { + const options = { + style: "decimal", + minimumFractionDigits: 0, + maximumFractionDigits: 0, + }; + if (!number) { + return 0 + } + const formattedWithOptions = number.toLocaleString("en-US", options); + return formattedWithOptions; +} + export function getAddressShortName(address) { // const address = "0x66422602B2f4885c57EE794174f98d9E4DDBBBC6"; const addressBegin = address.substring(0, 6); @@ -41,3 +55,23 @@ export function getblocky(address) { return blockiesData; } + +export function debounce(func, timeout = 300) { + let timer; + return (...args) => { + clearTimeout(timer); + timer = setTimeout(() => { + return func.apply(this, args); + }, timeout); + }; + } + +export function createDebounce() { + let timeout = null; + return function (fnc, delayMs) { + clearTimeout(timeout); + timeout = setTimeout(() => { + fnc(); + }, delayMs || 500); + }; +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index 668f63b..c05ca7e 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,7 @@ import { useTokenStore } from "@/stores/tokens"; import { useMemeburnerStore } from "@/stores/memeburner"; import { useRewardLockerStore } from "@/stores/rewardlocker"; import { useUniswapStore } from "@/stores/uniswap"; -import { useRoundsStore } from "@/stores/rounds"; +import { useCycleStore } from "@/stores/cycles"; import { createApp } from 'vue' import { createPinia } from 'pinia' @@ -13,19 +13,11 @@ import piniaPluginPersistedstate from "pinia-plugin-persistedstate"; import { createConfig, configureChains, - getAccount, getNetwork, - getContract, - connect, - disconnect, watchAccount, - watchWalletClient, - watchPublicClient, watchContractEvent, watchNetwork, getWalletClient, - fetchBalance, - multicall, } from "@wagmi/core"; import { WalletConnectConnector } from "@wagmi/core/connectors/walletConnect"; import { MetaMaskConnector } from "@wagmi/core/connectors/metaMask"; @@ -86,7 +78,9 @@ app.use(pinia); -app.use(Toast, {}); +app.use(Toast, { + transition: "Vue-Toastification__fade", +}); try { @@ -94,7 +88,7 @@ try { const tokenStore = useTokenStore(); const memeBurnerStore = useMemeburnerStore(); const rewardLockerStore = useRewardLockerStore(); - const roundsStore = useRoundsStore(); + const cycleStore = useCycleStore(); const uniswapStore = useUniswapStore(); const goerliKey = import.meta.env.VITE_GOERLI_KEY; @@ -135,25 +129,6 @@ try { }); walletStore.publicClient = publicClient; - const networkId = getNetwork()?.chain?.id; - - // watchWalletClient( - // { - // chainId: networkId, - // }, - // async (walletClient) => { - // console.log("watchWalletClient", walletClient); - // walletStore.walletClient = walletClient; - // } - // ); - - // watchPublicClient( - // { - // chainId: networkId, - // }, - // (publicClient) => console.log("publicClient", publicClient) - // ); - watchContractEvent( { address: memeBurnerStore.config.contractAddress, @@ -163,7 +138,7 @@ try { async (log) => { console.log("memeSacrificedEvent", log); const token = log[0].args.sacrificedToken; - await roundsStore.updateCurrentRound(token); + await cycleStore.updateCurrentCycle(token); } ); @@ -171,13 +146,13 @@ try { { address: rewardLockerStore.config.contractAddress, abi: rewardLockerStore.config.abi, - eventName: "RoundCompleted", + eventName: "CycleCompleted", }, async (log) => { - console.log("roundCompleted", log); - await roundsStore.fillRound(roundsStore.currentRound); - roundsStore.currentRound++; - await roundsStore.fillRound(roundsStore.currentRound); + console.log("CycleCompleted", log); + await cycleStore.fillCycle(cycleStore.currentCycle); + cycleStore.currentCycle++; + await cycleStore.fillCycle(cycleStore.currentCycle); } ); @@ -203,7 +178,8 @@ try { await memeBurnerStore.init(); await tokenStore.initV2(); await rewardLockerStore.init(); - await walletStore.loadWalletData(); + await walletStore.loadWalletData(); + await cycleStore.fillCycle(cycleStore.currentCycle); await uniswapStore.init(); } else { walletStore.address = null; @@ -218,18 +194,6 @@ try { } }); - // watchContractEvent( - // { - // address: memeBurnerStore.config.contractAddress, - // abi: memeBurnerStore.config.abi, - // eventName: "MemeSacrificed", - // }, - // async (log) => { - // console.log("memeSacrificedEvent", log); - // const token = log[0].args.sacrificedToken; - // await roundsStore.updateCurrentRound(token); - // } - // ); await walletStore.init(); await tokenStore.initV2(); diff --git a/src/stores/contracts.js b/src/stores/contracts.js deleted file mode 100644 index 940ec16..0000000 --- a/src/stores/contracts.js +++ /dev/null @@ -1,12 +0,0 @@ -import { defineStore } from "pinia"; -export const useContractStore = defineStore("contracts", { - state: () => ({ - list: { - - } - }), - getters: { - }, - actions: { - } -}); diff --git a/src/stores/memeburner.js b/src/stores/memeburner.js index e0b6dd2..2f98a39 100644 --- a/src/stores/memeburner.js +++ b/src/stores/memeburner.js @@ -2,7 +2,7 @@ import { defineStore } from "pinia"; import MemeAltarJson from "@/assets/contracts/MemeAltar.json"; import { useTokenStore } from "./tokens"; import { useWalletStoreV2 } from "./walletV2"; -import { useRoundsStore } from "@/stores/rounds"; +import { useCycleStore } from "@/stores/cycles"; import { multicall, getContract, fetchToken, waitForTransaction, getWalletClient } from "@wagmi/core"; @@ -18,7 +18,7 @@ export const useMemeburnerStore = defineStore("memeburner", { async init() { console.log("-----------init memeburner-------------"); const walletStore = useWalletStoreV2(); - // const roundsStore = useRoundsStore(); + // const cycleStore = useCycleStore(); console.log("walletStore.walletClient", walletStore.walletClient); this.contract = getContract({ address: this.config.contractAddress, @@ -37,30 +37,29 @@ export const useMemeburnerStore = defineStore("memeburner", { console.log("rewards", rewards); return rewards; }, - async getCurrentRound() { - return await this.contract.read.currentRound(); + async getCurrentCycle() { + return await this.contract.read.currentCycle(); }, - async getGoal(roundnumber) { - return await this.contract.read.rounds([roundnumber]); + async getGoal(cycleNumber) { + return await this.contract.read.cycles([cycleNumber]); }, //returns participated, amount achieved - async getSacrificedMeme(roundnumber, tokenAddress) { - return await this.contract.read.getSacrificedMeme([roundnumber, tokenAddress]); + async getSacrificedMeme(cycleNumber, tokenAddress) { + return await this.contract.read.getSacrificedMeme([cycleNumber, tokenAddress]); }, async getAmountToReachGoal(tokenAddress) { return await this.contract.read.getAmountToReachGoal([tokenAddress, 0]); }, - async getSacrificedRound(roundnumber) { - console.log("getSacrificedRound", roundnumber); + async getSacrificedCycle(cycleNumber) { + console.log("getSacrificedCycle", cycleNumber); const tokenStore = useTokenStore(); const contracts = []; for (let index = 0; index < tokenStore.sacrificeToken.length; index++) { const token = tokenStore.sacrificeToken[index]; - // contracts.push(this.contract.methods.getSacrificedMeme(roundnumber, token.contractAddress)); contracts.push({ ...this.contract, functionName: "getSacrificedMeme", - args: [roundnumber, token.contractAddress], + args: [cycleNumber, token.contractAddress], }); } // console.log("this.contract", this.contract); @@ -105,8 +104,8 @@ export const useMemeburnerStore = defineStore("memeburner", { ]); return hash; }, - async getGoalInBLOOD(roundNumber) { - return await this.contract.read.getGoalInBLOOD([roundNumber]); + async getGoalInBLOOD(cycleNumber) { + return await this.contract.read.getGoalInBLOOD([cycleNumber]); }, async getAmountETHBase(amount) { console.log("getAmountETHBase"); diff --git a/src/stores/rewardlocker.js b/src/stores/rewardlocker.js index dd5be8c..bc1a3e9 100644 --- a/src/stores/rewardlocker.js +++ b/src/stores/rewardlocker.js @@ -2,7 +2,7 @@ import { defineStore } from "pinia"; import RewardLockerJson from "@/assets/contracts/RewardLocker.json"; import { useTokenStore } from "./tokens"; import { useWalletStoreV2 } from "./walletV2"; -import { useRoundsStore } from "@/stores/rounds"; +import { useCycleStore } from "@/stores/cycles"; import { createPermitObject, getSignatureRSV } from "@/helper/blockchain.js"; import { multicall, getContract, signTypedData, getAccount, waitForTransaction } from "@wagmi/core"; @@ -26,49 +26,48 @@ export const useRewardLockerStore = defineStore("rewardlocker", { }, /* * @param {*} walletAddress - * @param {*} roundNumber + * @param {*} cycleNumber * @param {*} tokenAddress - * @returns Rewards for specific token and specific round + * @returns Rewards for specific token and specific cycle */ - async getRewards(walletAddress, roundNumber, tokenAddress) { + async getRewards(walletAddress, cycleNumber, tokenAddress) { try { - return await this.contract.read.rewards([walletAddress, roundNumber, tokenAddress]); + return await this.contract.read.rewards([walletAddress, cycleNumber, tokenAddress]); } catch (error) { console.error("getRewards", error); } }, - async getRewardsForAllToken(roundNumber) { + async getRewardsForAllToken(cycleNumber) { console.log("getRewardsForAllToken"); const tokenStore = useTokenStore(); const walletStore = useWalletStoreV2(); const contracts = []; for (let index = 0; index < tokenStore.sacrificeToken.length; index++) { const token = tokenStore.sacrificeToken[index]; - // calls.push(this.contract.methods.rewards(walletStore.address, roundNumber, token.contractAddress)); + // calls.push(this.contract.methods.rewards(walletStore.address, cycleNumber, token.contractAddress)); contracts.push({ ...this.contract, functionName: "getRewards", - args: [walletStore.address, roundNumber, token.contractAddress], + args: [walletStore.address, cycleNumber, token.contractAddress], }); } const data = await multicall({ contracts, }); - // const multicallStore = useMultiCallStore(); return data; }, - async getTotalSacrificeRewardsForAllToken(roundNumber) { + async getTotalSacrificeRewardsForAllToken(cycleNumber) { try { const tokenStore = useTokenStore(); const contracts = []; for (let index = 0; index < tokenStore.sacrificeToken.length; index++) { const token = tokenStore.sacrificeToken[index]; - // calls.push(this.contract.methods.rewards(walletStore.address, roundNumber, token.contractAddress)); + // calls.push(this.contract.methods.rewards(walletStore.address, cycleNumber, token.contractAddress)); contracts.push({ ...this.contract, functionName: "getTotalSacrificeRewardsForToken", - args: [roundNumber, token.contractAddress], + args: [cycleNumber, token.contractAddress], }); } const data = await multicall({ @@ -81,80 +80,41 @@ export const useRewardLockerStore = defineStore("rewardlocker", { throw new Error(error) } }, - async getSacrificedTokenCoefficient(roundNumber, sacrificedToken) { - try { - return await this.contract.read.getSacrificedTokenCoefficient([roundNumber, sacrificedToken]); - } catch (error) { - console.error("getSacrificedTokenCoefficient", error); - } + async getSacrificedTokenCoefficient(cycleNumber, sacrificedToken) { + return await this.contract.read.getSacrificedTokenCoefficient([cycleNumber, sacrificedToken]); }, - async lastCompletedRound() { - try { - return await this.contract.read.lastCompletedRound(); - } catch (error) { - console.error("lastCompletedRound", error); - } + async lastCompletedCycle() { + return await this.contract.read.lastCompletedCycle(); }, - async claim(round) { - try { - console.log("claim"); - return await this.contract.write.claim([round]); - } catch (error) { - console.error("claim", error); - - } + async claim(cycle) { + console.log("claim"); + return await this.contract.write.claim([cycle]); }, async claimAll() { console.log("claimAll"); - const roundsStore = useRoundsStore(); + const cycleStore = useCycleStore(); const account = getAccount(); console.log("acocunt", account); - const rounds = await roundsStore.getFinshedRoundNumbers(); - return await this.contract.write.claim([rounds]); + const cycles = await cycleStore.getFinshedCycleNumbers(); + return await this.contract.write.claim([cycles]); }, - async getTotalRewardsOf(address, rounds) { - try { - return await this.contract.read.getTotalRewardsOf([address, rounds]); - } catch (error) { - console.error("getTotalRewardsOf", error); - - } + async getTotalRewardsOf(address, cycles) { + return await this.contract.read.getTotalRewardsOf([address, cycles]); }, async getTotalRewards(address) { - try { - console.log("this.contract", this.contract); - const roundsStore = useRoundsStore(); - const rounds = await roundsStore.getFinshedRoundNumbers(); - return await this.contract.read.getTotalRewardsOf([address, rounds]); - } catch (error) { - console.error("getTotalRewards", error); - throw new Error(error); - } + const cycleStore = useCycleStore(); + const cycles = await cycleStore.getFinshedCycleNumbers(); + return await this.contract.read.getTotalRewardsOf([address, cycles]); }, async getStaked(address) { - try { - return await this.contract.read.staked([address]); - } catch (error) { - console.error("getStaked", error); - throw new Error(error); - } + return await this.contract.read.staked([address]); }, async orderUnstake() { - try { - return await this.contract.write.orderUnstake(); - } catch (error) { - console.error("orderUnstake", error); - throw new Error(error) - } + return await this.contract.write.orderUnstake(); }, - async unstake(unstakeRound) { - try { - return await this.contract.write.unstake([unstakeRound]); - } catch (error) { - console.error("unstake", error); - throw new Error(error); - } + async unstake(unstakeCycle) { + return await this.contract.write.unstake([unstakeCycle]); }, async stakeBloodline(tokenNumber) { console.log("tokenNumber", tokenNumber); @@ -189,24 +149,24 @@ export const useRewardLockerStore = defineStore("rewardlocker", { return hash; }, - async stakeAndClaimRound(stakeCoefficient, round) { + async stakeAndClaimCycle(stakeCoefficient, cycle) { // stakeCoefficient 25% = 2500, 50% = 5000 const tokenStore = useTokenStore(); const addresses = tokenStore.sacrificeToken.map((obj) => obj.contractAddress); - const hash = await this.contract.write.stakeAndClaim([stakeCoefficient, [round], addresses]); + const hash = await this.contract.write.stakeAndClaim([stakeCoefficient, [cycle], addresses]); const data = await waitForTransaction({ hash: hash, }); return hash; }, - async stakeAndClaimAllRounds(stakeCoefficient) { - console.log("stakeAndClaimAllRounds"); + async stakeAndClaimAllCycles(stakeCoefficient) { + console.log("stakeAndClaimAllCycles"); const tokenStore = useTokenStore(); - const roundsStore = useRoundsStore(); - const rounds = await roundsStore.getFinshedRoundNumbers(); + const cycleStore = useCycleStore(); + const cycles = await cycleStore.getFinshedCycleNumbers(); const addresses = tokenStore.sacrificeToken.map((obj) => obj.contractAddress); var stakeCoefficientInt = Math.round(stakeCoefficient); - const hash = await this.contract.write.stakeAndClaim([stakeCoefficientInt, rounds, addresses]); + const hash = await this.contract.write.stakeAndClaim([stakeCoefficientInt, cycles, addresses]); return hash; }, }, diff --git a/src/stores/rounds.js b/src/stores/rounds.js deleted file mode 100644 index 6bd2742..0000000 --- a/src/stores/rounds.js +++ /dev/null @@ -1,206 +0,0 @@ -import { defineStore } from "pinia"; -import { useMemeburnerStore } from "./memeburner"; -import { useTokenStore } from "./tokens"; -import { useRewardLockerStore } from "./rewardlocker"; -import { useWalletStoreV2 } from "./walletV2"; -import { multicall } from "@wagmi/core"; - - -export const useRoundsStore = defineStore("rounds", { - state: () => ({ - rounds: [], - activeRound: null, - currentRound: null, - }), - getters: { - getRoundWinner() { - const goal = this.getCurrentRoundData?.goal; - if (!goal) { - return; - } - const winnerCoin = this.rounds[this.activeRound]?.token.find((token) => token.amount === goal); - if (winnerCoin) { - return winnerCoin; - } else { - return false; - } - }, - getCurrentRoundData() { - return this.rounds[this.activeRound]; - }, - }, - actions: { - async init() { - //fill initial round - }, - async loadRewardsRounds() { - const walletStore = useWalletStoreV2(); - const rewardLockerStore = useRewardLockerStore(); - - console.log("this.currentRound", this.currentRound); - const contracts = []; - for (let index = 0; index < this.currentRound; index++) { - console.log("load round: " + index); - // await this.fillRound(index) - console.log({ index, address: walletStore.address }); - contracts.push({ - ...rewardLockerStore.contract, - functionName: "getTotalRewardsOf", - args: [walletStore.address, [index + 1]], - }); - } - - const data = await multicall({ - contracts, - }); - // var test = await rewardLockerStore.getTotalRewardsOf(walletStore.address, rounds) - for (let index = 0; index < data.length; index++) { - const element = data[index]; - if (!this.rounds[index]) { - this.rounds[index] = {}; - } - console.log("vor Fehler"); - // this.rounds[index].round = index + 1; - // this.rounds[index].rewards_total = element.result; - } - }, - async updateCurrentRound(sacrificedToken) { - console.log("updateCurrentRound"); - const tokenStore = useTokenStore(); - const memeBurnerStore = useMemeburnerStore(); - var data = await memeBurnerStore.getSacrificedRound(this.currentRound); - var tokenIndex = this.rounds[this.currentRound].token.findIndex( - (tokenData) => tokenData.contractAddress === sacrificedToken - ); - const token = tokenStore.getToken(sacrificedToken); - // console.log( - // "this.rounds[this.currentRound].token[tokenIndex].amount", - // this.rounds[this.currentRound].token[tokenIndex].amount - // ); - // console.log("Number(data[tokenIndex].result[1] / BigInt(Math.pow(10, token.decimals))", Number(data[tokenIndex].result[1] / BigInt(Math.pow(10, token.decimals)))); - this.rounds[this.currentRound].token[tokenIndex].amount = - Number(data[tokenIndex].result[1]) / Math.pow(10, token.decimals) - }, - async fillRound(roundNumber, refillRound = false) { - console.log("fillRound"); - const memeBurnerStore = useMemeburnerStore(); - const tokenStore = useTokenStore(); - const walletStore = useWalletStoreV2(); - const rewardLockerStore = useRewardLockerStore(); - - // if (this.activeRound === this.currentRound) { - // console.log("activeRound is not completed"); - // } else - if (!this.rounds[roundNumber]?.goal || refillRound) { - console.log("round not filled --> fill round"); - var data = await memeBurnerStore.getSacrificedRound(roundNumber); - let rewardData = null; - if (walletStore.connected) { - rewardData = await rewardLockerStore.getRewardsForAllToken(roundNumber); - } - - const tokenTotalSacrificed = await rewardLockerStore.getTotalSacrificeRewardsForAllToken(roundNumber); - var goal = await memeBurnerStore.getGoal(roundNumber); - console.log("goal", goal); - var tokenArray = []; - var rewards_clan = 0; - var rewards_sacrifice = 0; - var rewards_staking = 0; - console.log("data", data); - for (let index = 0; index < data.length; index++) { - var tokenData = {}; - const token = tokenStore.token[index]; - var coefficent = await rewardLockerStore.getSacrificedTokenCoefficient( - roundNumber, - token.contractAddress - ); - console.log("coefficent", coefficent); - - tokenData.name = token.name; - tokenData.contractAddress = token.contractAddress; - tokenData.vamplogo = token.vamp.logo; - tokenData.vampname = token.vamp.name; - // tokenData.amount = data[index].result[1]; - tokenData.amount = Number(data[index].result[1]) / Math.pow(10, token.decimals); - tokenData.amountInBLD = Number(tokenTotalSacrificed[index].result) / Math.pow(10, token.decimals); - // tokenData.getAmountToReachGoal = - // Number(await memeBurnerStore.getAmountToReachGoal(token.contractAddress)) / - // Math.pow(10, token.decimals); - - - if (walletStore.connected) { - const stakeReward = Number(rewardData[index].result[0]); - const sacrificeClanReward = Number(rewardData[index].result[1]); - let clanwin = 0; - if (roundNumber !== this.currentRound) { - clanwin = (Number(coefficent) / 10000 - 1) * sacrificeClanReward; - console.log("clanwin", clanwin); - } - const sacrificeRewards = Number(sacrificeClanReward); - - tokenData.rewards_ges = Number( - rewardData[index].result[1] / BigInt(Math.pow(10, token.decimals)) + - rewardData[index].result[0] / BigInt(Math.pow(10, token.decimals)) - ); - - tokenData.rewards_clan = clanwin / Math.pow(10, token.decimals); - - tokenData.rewards_staking = Number( - rewardData[index].result[0] / BigInt(Math.pow(10, token.decimals)) - ); - tokenData.rewards_sacrifice = sacrificeRewards / Math.pow(10, token.decimals); - - rewards_clan = rewards_clan + tokenData.rewards_clan; - rewards_sacrifice = rewards_sacrifice + tokenData.rewards_sacrifice; - rewards_staking = rewards_staking + tokenData.rewards_staking; - } - - - tokenArray.push(tokenData); - } - console.log("clanwin123", rewards_clan); - const goalInBLD = await memeBurnerStore.getGoalInBLOOD(roundNumber); - this.rounds[roundNumber] = { - goal: Number(goal[0]) / Math.pow(10, tokenStore.memeToken.decimals), - goalInBLD: Number(goalInBLD / BigInt(Math.pow(10, tokenStore.memeToken.decimals))), - expirationTimestamp: Number(goal[2]), - rewards_clan: Number(rewards_clan), - rewards_staking: Number(rewards_staking), - rewards_sacrifice: Number(rewards_sacrifice), - rewards_total: Number(rewards_clan) + Number(rewards_sacrifice) + Number(rewards_staking), - token: tokenArray, - }; - console.log("this.rounds[roundNumber]", this.rounds[roundNumber]); - } else { - console.log("round already filled"); - } - }, - async getFinshedRoundNumbers() { - const array = []; - const rewardLockerStore = useRewardLockerStore(); - const lastCompletedRound = await rewardLockerStore.lastCompletedRound(); - console.log("lastCompletedRound", lastCompletedRound); - for (let index = 0; index <= Number(lastCompletedRound); index++) { - array.push(index); - } - // for (let index = 1; index <= Number(lastCompletedRound) + 1; index++) { - // array.push(index); - // } - console.log("array", array); - return array; - }, - /** - * function to get finished rounds, active round and the next round to check if there is a round the user called unstakeOrdered. - * with Backend it would be much easier because we could store the event data in the database - */ - async getRoundsNumberWithNext() { - const array = []; - const rewardLockerStore = useRewardLockerStore(); - const lastCompletedRound = await rewardLockerStore.lastCompletedRound(); - for (let index = 1; index <= Number(lastCompletedRound) + 1; index++) { - array.push(index); - } - return array; - }, - }, -}); diff --git a/src/stores/tokens.js b/src/stores/tokens.js index 37b768a..2bd835e 100644 --- a/src/stores/tokens.js +++ b/src/stores/tokens.js @@ -1,7 +1,6 @@ import { defineStore } from "pinia"; import { markRaw } from "vue"; import { useWalletStoreV2 } from "./walletV2"; -import { useContractStore } from "./contracts"; import { useMemeburnerStore } from "./memeburner"; import Meme1Json from "@/assets/contracts/Meme1.json"; import Meme2Json from "@/assets/contracts/Meme2.json"; @@ -13,7 +12,8 @@ import { multicall, getContract, fetchToken, getWalletClient, waitForTransaction export const useTokenStore = defineStore("token", { - state: () => ({ + state: () => ({ + //some static data for the coin token: [ { name: "$PEPE", @@ -22,6 +22,8 @@ export const useTokenStore = defineStore("token", { vamp: { logo: "/assets/img/token/pepevamp.png", name: "$PEPE Vamp Token", + winner: "/assets/img/token/pepewinner.png", + winner2: "/assets/img/token/pepewinnerborder.png", }, backgroundColor: "#4b8501", abi: Meme1Json.abi, @@ -34,6 +36,8 @@ export const useTokenStore = defineStore("token", { vamp: { logo: "/assets/img/token/shibvamp.png", name: "$SHIBA Vamp Token", + winner: "/assets/img/token/shibwinner.png", + winner2: "/assets/img/token/shibwinnerborder.png", }, abi: Meme2Json.abi, contractAddress: Meme2Json.contractAddress, @@ -45,6 +49,8 @@ export const useTokenStore = defineStore("token", { vamp: { logo: "/assets/img/token/elonvamp.png", name: "$ELON Vamp Token", + winner: "/assets/img/token/elonwinner.png", + winner2: "/assets/img/token/elonwinnerborder.png", }, abi: Meme3Json.abi, contractAddress: Meme3Json.contractAddress, @@ -56,6 +62,8 @@ export const useTokenStore = defineStore("token", { // vamp: { // logo: "/assets/img/token/bitcoin.png", // name: "$ELON Vamp Token", + // winner: "/assets/img/token/bitcoinwinner.png" + // winner2: "/assets/img/token/bitcoinwinnerborder.png" // }, // abi: Meme4Json.abi, // contractAddress: Meme4Json.contractAddress, @@ -100,7 +108,7 @@ export const useTokenStore = defineStore("token", { async initV2() { console.log("-----------init token-------------"); try { - const walletStore = useWalletStoreV2(); + const walletStore = useWalletStoreV2(); for (let index = 0; index < this.token.length; index++) { const contracts = []; const token = this.token[index]; @@ -122,11 +130,10 @@ export const useTokenStore = defineStore("token", { token.symbol = data[2].result; token.totalSupply = data[3].result; } - } catch (error) { - console.error("initV2", error); - } - - }, + } catch (error) { + console.error("initV2", error); + } + }, async changeActiveToken(token) { console.log("changeActiveToken"); this.activeToken = token; @@ -141,16 +148,10 @@ export const useTokenStore = defineStore("token", { console.log("allowance"); const walletStore = useWalletStoreV2(); const memeBurnerStore = useMemeburnerStore(); - // var allowance = await this.contract.methods - // .allowance(walletStore.address, memeBurnerStore.config.contractAddress) - // .call(); - console.log("this.activeToken.contract", this.activeToken.contract); var allowance = await this.activeToken.contract.read.allowance([ walletStore.address, memeBurnerStore.config.contractAddress, ]); - // var decimals = await this.contract.methods.decimals().call(); - // console.log("decimals", decimals); const decimals = this.activeToken.decimals; allowance = BigInt(allowance / BigInt(Math.pow(10, decimals))); @@ -162,21 +163,16 @@ export const useTokenStore = defineStore("token", { console.log("amount", amount); this.loading = true; const memeBurnerStore = useMemeburnerStore(); - // var approve = await this.contract.methods - // .approve(memeBurnerStore.config.contractAddress, amount) - // .send({ from: walletStore.address}); - console.log("approve"); - console.log("this.activeToken.contract", this.activeToken.contract); var approveHash = await this.activeToken.contract.write.approve([ memeBurnerStore.config.contractAddress, amount * Math.pow(10, this.activeToken.decimals), ]); console.log("approveHash", approveHash); - return approveHash; + return approveHash; } catch (error) { - console.error(error); - throw new Error(error) + console.error(error); + throw new Error(error); } finally { this.loading = false; } diff --git a/src/stores/uniswap.js b/src/stores/uniswap.js index 04cf4ba..eb4fd9b 100644 --- a/src/stores/uniswap.js +++ b/src/stores/uniswap.js @@ -48,14 +48,14 @@ export const useUniswapStore = defineStore("uniswap", { token0: this.poolData.token0, token1: this.poolData.token1, fee: this.poolData.fee, - amountEthBase: amountEthBase[1], + amountEthBase: amountEthBase[0], pricelimit: 0, //sqrtPriceLimitX96 }); const quotedAmountOut = await this.quoateV3Contract.read.quoteExactInputSingle([ this.poolData.token0, //bloodline this.poolData.token1, //weth this.poolData.fee, - amountEthBase[1], + amountEthBase[0], 0, //sqrtPriceLimitX96 ]); return {result: true, amount: quotedAmountOut}; diff --git a/src/stores/walletV2.js b/src/stores/walletV2.js index 98b3eb3..5ffa0c8 100644 --- a/src/stores/walletV2.js +++ b/src/stores/walletV2.js @@ -39,7 +39,6 @@ export const useWalletStoreV2 = defineStore("walletV2", { config: null, chain: null, token: [], - stateSacrifice: 0, }), getters: { sacrificeToken: (state) => state.token.filter((obj) => { @@ -57,7 +56,6 @@ export const useWalletStoreV2 = defineStore("walletV2", { async init() { console.log("wallet init"); - const account = getAccount(); if (account.address) { @@ -65,24 +63,6 @@ export const useWalletStoreV2 = defineStore("walletV2", { this.connected = true; } - // await this.isConnected(); - // const goerliKey = import.meta.env.VITE_GOERLI_KEY; - // if (this.connected) { - // const web3 = new Web3(window.ethereum); - // this.web3 = markRaw(web3); - // console.log("hierabc"); - // window.ethereum.on("accountsChanged", async (data) => { - // console.log("accountsChanged", data); - // console.log("data", data); - // if (data.length > 0) { - // this.address = data[0]; - // this.connected = true; - // } else { - // this.address = null; - // this.connected = false; - // } - // }); - }, async connectWallet(connector) { try { @@ -103,17 +83,13 @@ export const useWalletStoreV2 = defineStore("walletV2", { // this.address = connection.account; }, async getTokenBalance(token) { - console.log("token", token); - console.log("address", this.address); const result = await token.contract.read.balanceOf([this.address]); return result; }, - async getTokenBalances() { console.log("getTokenBalances"); this.token = [] const tokenStore = useTokenStore(); - console.log("tokenStore.token.length", tokenStore.token.length); var contracts = []; for (let index = 0; index < tokenStore.token.length; index++) { const token = tokenStore.token[index]; @@ -123,11 +99,8 @@ export const useWalletStoreV2 = defineStore("walletV2", { const data = await multicall({ contracts, }); - console.log("data", data); for (let index = 0; index < tokenStore.token.length; index++) { const token = tokenStore.token[index]; - console.log("token", token); - console.log("data[index].result", data[index].result); const balanceOfDecimal = data[index].result / BigInt(Math.pow(10, token.decimals)); this.token.push({ contractAddress: token.contractAddress, @@ -153,5 +126,5 @@ export const useWalletStoreV2 = defineStore("walletV2", { } }, - persist: true, + // persist: true, }); diff --git a/src/utils/helper.js b/src/utils/helper.js deleted file mode 100644 index e316c01..0000000 --- a/src/utils/helper.js +++ /dev/null @@ -1,22 +0,0 @@ - -export default class Helper { - static debounce(func, timeout = 300) { - let timer; - return (...args) => { - clearTimeout(timer); - timer = setTimeout(() => { - func.apply(this, args); - }, timeout); - }; - } - - static createDebounce() { - let timeout = null; - return function (fnc, delayMs) { - clearTimeout(timeout); - timeout = setTimeout(() => { - fnc(); - }, delayMs || 500); - }; - } -} diff --git a/src/views/CycleView.vue b/src/views/CycleView.vue index 7aa1d73..a840909 100644 --- a/src/views/CycleView.vue +++ b/src/views/CycleView.vue @@ -8,13 +8,13 @@
-
Cycle {{ roundsStore.activeRound }}
+
Cycle {{ cycleStore.activeCycle }}
@@ -22,37 +22,35 @@
Sacrifice Goal:
-
{{ roundsStore.getCurrentRoundData?.goalInBLD }} $BDL
+
{{ cycleStore.getCurrentCycleData?.goalInBLD }} $BDL
Time left:
{{ days }} {{ hours }} {{ minutes }}
-