Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2f8b90cdd | ||
|
|
a719ee5989 | ||
|
|
5e6f373293 | ||
|
|
0b9e14c628 | ||
|
|
32ababbb39 | ||
|
|
fedcd0314d | ||
|
|
9eabba9c11 | ||
|
|
d25ef5ad63 | ||
|
|
fe44a619d4 | ||
|
|
320cbb5c63 | ||
|
|
2d35457076 | ||
|
|
dad9fd4fe6 | ||
|
|
d761adef18 | ||
|
|
1fb59225e3 | ||
|
|
b3191f493b | ||
|
|
35f2f0782f | ||
|
|
301c569edc | ||
|
|
a34de54d60 | ||
|
|
2b4405579e | ||
|
|
b5c6f8af33 | ||
|
|
68cd720c59 | ||
|
|
5c7e176457 | ||
|
|
18d14f1478 | ||
|
|
8d8423b1cb | ||
|
|
2965cbe065 | ||
|
|
e33c59d621 | ||
|
|
2445bb1f78 | ||
|
|
ea60d365d5 | ||
|
|
dd7a0a113d | ||
|
|
2f712d41d6 | ||
|
|
64d46693ea | ||
|
|
3d53d9e7c8 | ||
|
|
5c7053c0d9 | ||
|
|
1b2ea9b2a2 | ||
|
|
9330168af2 | ||
|
|
02182c8128 | ||
|
|
ca243064f7 | ||
|
|
0ff38abfb4 | ||
|
|
a0aafaddf0 | ||
|
|
44173a36e1 | ||
|
|
dfd208e075 | ||
|
|
cd773e16c9 | ||
|
|
c8f7c7cd5e | ||
|
|
034cc10f06 | ||
|
|
904df8ac7d | ||
|
|
1925a2d8af | ||
|
|
23100d9a2a | ||
|
|
7d33f225ce | ||
|
|
641755201e | ||
|
|
a77cf3a668 | ||
|
|
ceac2a1083 | ||
|
|
6c4933a6a8 | ||
|
|
2555217641 | ||
|
|
259ddec9ec | ||
|
|
c160b1c836 | ||
|
|
8ae8f9a64a | ||
|
|
b7a54f2cdd | ||
|
|
650df134d2 | ||
|
|
5157308745 | ||
|
|
0bab85fe75 | ||
|
|
34a445eaa3 | ||
|
|
e200b82697 | ||
|
|
bf3a606879 | ||
|
|
b2121a1ca4 | ||
|
|
22bce3d4be | ||
|
|
50bf3c81a6 | ||
|
|
716c0accc6 | ||
|
|
9dbb4d723d | ||
|
|
bac13aef42 | ||
|
|
feb841c17b | ||
|
|
9cbfd30a87 | ||
|
|
87e7937f0e | ||
|
|
9191df9c3b | ||
|
|
07dd95b38a | ||
|
|
5d15fe7567 | ||
|
|
67a86f8c26 | ||
|
|
601e7d98a0 | ||
|
|
5a21bb0fd3 | ||
|
|
cdd142ded0 | ||
|
|
9c409550e7 | ||
|
|
13021bf691 | ||
|
|
161262f590 | ||
|
|
24d91353b9 | ||
|
|
994c440e2f | ||
|
|
cb85a47a94 | ||
|
|
56454bef89 | ||
|
|
9565f494ea | ||
|
|
9b76ef48e5 | ||
|
|
86f4e97f23 | ||
|
|
524a5add62 | ||
|
|
fdf96948a5 |
@@ -1,12 +1,12 @@
|
|||||||
/* eslint-env node */
|
/* eslint-env node */
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
extends: [
|
extends: ["plugin:vue/vue3-essential", "eslint:recommended"],
|
||||||
'plugin:vue/vue3-essential',
|
parserOptions: {
|
||||||
'eslint:recommended',
|
ecmaVersion: "latest",
|
||||||
],
|
},
|
||||||
parserOptions: {
|
global: {
|
||||||
ecmaVersion: 'latest'
|
BigInt: true,
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -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
|
## Project Setup
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/assets/js/blockies.min.js"></script>
|
||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -13,15 +13,23 @@
|
|||||||
"@fortawesome/free-brands-svg-icons": "^6.4.0",
|
"@fortawesome/free-brands-svg-icons": "^6.4.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "^6.4.0",
|
"@fortawesome/free-solid-svg-icons": "^6.4.0",
|
||||||
"@fortawesome/vue-fontawesome": "^3.0.3",
|
"@fortawesome/vue-fontawesome": "^3.0.3",
|
||||||
|
"@wagmi/core": "^1.3.8",
|
||||||
|
"abi-decoder": "^2.4.0",
|
||||||
|
"blockies": "^0.0.2",
|
||||||
"pinia": "^2.0.36",
|
"pinia": "^2.0.36",
|
||||||
"pinia-plugin-persistedstate": "^3.1.0",
|
"pinia-plugin-persistedstate": "^3.1.0",
|
||||||
"sass": "^1.62.1",
|
"sass": "^1.62.1",
|
||||||
"swiper": "^9.4.1",
|
"swiper": "^9.4.1",
|
||||||
|
"viem": "^1.4.1",
|
||||||
"vue": "^3.3.2",
|
"vue": "^3.3.2",
|
||||||
|
"vue-collapsed": "^1.2.8",
|
||||||
"vue-router": "^4.2.0",
|
"vue-router": "^4.2.0",
|
||||||
"web3": "^1.7.1"
|
"vue-toastification": "^2.0.0-rc.5",
|
||||||
|
"vue3-lottie": "^3.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@esbuild-plugins/node-globals-polyfill": "^0.2.3",
|
||||||
|
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
|
||||||
"@vitejs/plugin-vue": "^4.2.3",
|
"@vitejs/plugin-vue": "^4.2.3",
|
||||||
"eslint": "^8.39.0",
|
"eslint": "^8.39.0",
|
||||||
"eslint-plugin-vue": "^9.11.0",
|
"eslint-plugin-vue": "^9.11.0",
|
||||||
|
|||||||
|
After Width: | Height: | Size: 699 B |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,13 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_13571_129878)">
|
||||||
|
<rect width="40" height="40" fill="#0052FF"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.3312 0H31.6672C36.2704 0 40 4.0128 40 8.9632V31.0368C40 35.9872 36.2704 40 31.6688 40H8.3312C3.7296 40 0 35.9872 0 31.0368V8.9632C0 4.0128 3.7296 0 8.3312 0Z" fill="#0052FF"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9989 5.79443C27.8453 5.79443 34.2053 12.1544 34.2053 20.0008C34.2053 27.8472 27.8453 34.2072 19.9989 34.2072C12.1525 34.2072 5.79254 27.8472 5.79254 20.0008C5.79254 12.1544 12.1525 5.79443 19.9989 5.79443Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5005 15.459H23.4973C24.0733 15.459 24.5389 15.9614 24.5389 16.579V23.419C24.5389 24.0382 24.0717 24.539 23.4973 24.539H16.5005C15.9245 24.539 15.4589 24.0366 15.4589 23.419V16.579C15.4589 15.9614 15.9261 15.459 16.5005 15.459Z" fill="#0052FF"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_13571_129878">
|
||||||
|
<rect width="40" height="40" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="40" height="40" fill="#F7F9FB"/>
|
||||||
|
<path d="M32.6877 6.6665L22.0555 14.5632L24.0216 9.90427L32.6877 6.6665Z" fill="#E2761B" stroke="#E2761B" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M8.1433 6.6665L18.6901 14.638L16.8201 9.90427L8.1433 6.6665ZM28.8628 24.9711L26.0311 29.3095L32.0899 30.9764L33.8317 25.0672L28.8628 24.9711ZM7.0213 25.0672L8.75238 30.9764L14.8112 29.3095L11.9795 24.9711L7.0213 25.0672Z" fill="#E4761B" stroke="#E4761B" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M14.4697 17.641L12.7814 20.1949L18.7974 20.462L18.5837 13.9972L14.4697 17.641ZM26.3629 17.641L22.1955 13.9224L22.0565 20.462L28.0619 20.1949L26.3629 17.641ZM14.8117 29.3097L18.4234 27.5466L15.3032 25.1103L14.8117 29.3097ZM22.4092 27.5466L26.0316 29.3097L25.5294 25.1103L22.4092 27.5466Z" fill="#E4761B" stroke="#E4761B" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M26.0316 29.3095L22.4091 27.5464L22.6976 29.9079L22.6656 30.9017L26.0316 29.3095ZM14.8116 29.3095L18.1776 30.9017L18.1562 29.9079L18.4233 27.5464L14.8116 29.3095Z" fill="#D7C1B3" stroke="#D7C1B3" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M18.2319 23.5497L15.2185 22.6628L17.345 21.6904L18.2319 23.5497ZM22.6023 23.5497L23.4892 21.6904L25.6264 22.6628L22.6023 23.5497Z" fill="#233447" stroke="#233447" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M14.8106 29.3092L15.3236 24.9708L11.9789 25.067L14.8106 29.3092ZM25.5177 24.9708L26.0306 29.3092L28.8623 25.067L25.5177 24.9708ZM28.0609 20.1943L22.0555 20.4615L22.6112 23.5496L23.4981 21.6903L25.6352 22.6627L28.0609 20.1943ZM15.2167 22.6627L17.3538 21.6903L18.2301 23.5496L18.7964 20.4615L12.7804 20.1943L15.2167 22.6627Z" fill="#CD6116" stroke="#CD6116" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M12.7814 20.1943L15.3032 25.1097L15.2177 22.6627L12.7814 20.1943ZM25.6362 22.6627L25.5294 25.1097L28.0619 20.1943L25.6362 22.6627ZM18.7974 20.4615L18.2311 23.5496L18.9363 27.1935L19.0966 22.3956L18.7974 20.4615ZM22.0565 20.4615L21.768 22.3849L21.8963 27.1935L22.6122 23.5496L22.0565 20.4615Z" fill="#E4751F" stroke="#E4751F" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M22.613 23.5495L21.8971 27.1933L22.41 27.546L25.5302 25.1096L25.637 22.6626L22.613 23.5495ZM15.2185 22.6626L15.304 25.1096L18.4242 27.546L18.9371 27.1933L18.2319 23.5495L15.2185 22.6626Z" fill="#F6851B" stroke="#F6851B" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M22.6656 30.9022L22.6976 29.9085L22.4305 29.6734H18.402L18.1562 29.9085L18.1776 30.9022L14.8116 29.3101L15.987 30.2718L18.3699 31.9281H22.4625L24.8561 30.2718L26.0316 29.3101L22.6656 30.9022Z" fill="#C0AD9E" stroke="#C0AD9E" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M22.409 27.5465L21.8961 27.1938H18.9362L18.4233 27.5465L18.1561 29.908L18.4019 29.6729H22.4304L22.6975 29.908L22.409 27.5465Z" fill="#161616" stroke="#161616" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M33.1371 15.0761L34.0454 10.7164L32.6883 6.6665L22.4087 14.2961L26.3624 17.6407L31.951 19.2756L33.1905 17.833L32.6562 17.4484L33.5111 16.6683L32.8486 16.1554L33.7034 15.5036L33.1371 15.0761ZM6.79688 10.7164L7.70516 15.0761L7.12813 15.5036L7.98299 16.1554L7.33116 16.6683L8.18601 17.4484L7.65173 17.833L8.88058 19.2756L14.4692 17.6407L18.4229 14.2961L8.14327 6.6665L6.79688 10.7164Z" fill="#763D16" stroke="#763D16" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M31.951 19.2761L26.3624 17.6412L28.0614 20.1951L25.5289 25.1105L28.8628 25.0678H33.8317L31.951 19.2761ZM14.4692 17.6412L8.88061 19.2761L7.0213 25.0678H11.9795L15.3027 25.1105L12.7809 20.1951L14.4692 17.6412ZM22.0561 20.4622L22.4087 14.2966L24.0329 9.90479H16.8201L18.4229 14.2966L18.7969 20.4622L18.9252 22.407L18.9358 27.1942H21.8958L21.9171 22.407L22.0561 20.4622Z" fill="#F6851B" stroke="#F6851B" stroke-width="0.106857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="40" height="40" fill="#3396FF"/>
|
||||||
|
<path d="M20 40C31.0457 40 40 31.0457 40 20C40 8.9543 31.0457 0 20 0C8.9543 0 0 8.9543 0 20C0 31.0457 8.9543 40 20 40Z" fill="#3396FF"/>
|
||||||
|
<path d="M12.2327 14.8836C16.5225 10.7003 23.4779 10.7003 27.7677 14.8836L28.284 15.3871C28.4985 15.5962 28.4985 15.9353 28.284 16.1445L26.5179 17.8668C26.4106 17.9713 26.2368 17.9713 26.1295 17.8668L25.419 17.1739C22.4263 14.2555 17.5741 14.2555 14.5813 17.1739L13.8204 17.9159C13.7132 18.0205 13.5393 18.0205 13.4321 17.9159L11.666 16.1936C11.4514 15.9845 11.4514 15.6453 11.666 15.4362L12.2327 14.8836ZM31.4203 18.4454L32.9922 19.9782C33.2067 20.1874 33.2067 20.5265 32.9922 20.7356L25.9045 27.6473C25.69 27.8565 25.3422 27.8565 25.1277 27.6473L20.0973 22.742C20.0437 22.6896 19.9568 22.6896 19.9031 22.742L14.8728 27.6473C14.6583 27.8565 14.3106 27.8565 14.096 27.6473L7.00816 20.7355C6.79367 20.5264 6.79367 20.1873 7.00816 19.9782L8.58004 18.4453C8.79454 18.2362 9.1423 18.2362 9.35679 18.4453L14.3873 23.3508C14.4409 23.4031 14.5278 23.4031 14.5814 23.3508L19.6117 18.4453C19.8262 18.2361 20.1739 18.2361 20.3885 18.4453L25.4189 23.3508C25.4726 23.4031 25.5595 23.4031 25.6131 23.3508L30.6436 18.4454C30.858 18.2362 31.2058 18.2362 31.4203 18.4454Z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 445 B |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 798 B |
|
After Width: | Height: | Size: 492 B |
|
After Width: | Height: | Size: 428 B |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 963 B |
@@ -1,43 +1,269 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted } from "vue";
|
import { onMounted, onUnmounted, provide, ref, watch } from "vue";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
import Web3 from "web3";
|
|
||||||
import Navbar from "./components/Navbar.vue";
|
import Navbar from "./components/Navbar.vue";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
import { useWalletStore } from "@/stores/wallet";
|
|
||||||
const walletStore = useWalletStore();
|
|
||||||
import { useTokenStore } from "@/stores/tokens";
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
import { useContractStore } from "@/stores/contracts";
|
import { useSacrificeStore } from "@/stores/sacrifice";
|
||||||
const tokenStore = useTokenStore();
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
const contractStore = useContractStore();
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
const { memeBurner } = storeToRefs(tokenStore);
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
const { list } = storeToRefs(contractStore);
|
|
||||||
|
import SlideoutPanel from "./components/SlideoutPanel.vue";
|
||||||
|
import ConnectWallet from "./components/ConnectWallet.vue";
|
||||||
|
import BloodSplash from "./components/BloodSplash.vue";
|
||||||
|
import { getNetwork, fetchTransaction } from "@wagmi/core";
|
||||||
|
|
||||||
|
const isMobile = ref(false);
|
||||||
|
const showPanel = ref(false);
|
||||||
|
const splashBlood = ref(0);
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
isMobile.value = isMobileFunc();
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
window.removeEventListener("resize", handleWindowSizeChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(showPanel, (newValue, oldValue) => {
|
||||||
|
console.log("document.body", document.body);
|
||||||
|
if (newValue) {
|
||||||
|
document.body.classList.add("sideoutpanel-open");
|
||||||
|
if (isMobile) {
|
||||||
|
document.body.classList.add("mobile");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
document.body.classList.remove("sideoutpanel-open");
|
||||||
|
if (isMobile) {
|
||||||
|
document.body.classList.remove("mobile");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleWindowSizeChange = () => {
|
||||||
|
isMobile.value = isMobileFunc();
|
||||||
|
// your code
|
||||||
|
};
|
||||||
|
|
||||||
|
//to have mobile breakpoint not only on sass side
|
||||||
|
function isMobileFunc() {
|
||||||
|
if (screen.width <= 760) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeRoute(name) {
|
||||||
|
router.push({
|
||||||
|
name: name,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
provide("isMobile", isMobile);
|
||||||
|
provide("showPanel", showPanel);
|
||||||
|
provide("splashBlood", splashBlood);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
var test = await walletStore.isConnected();
|
window.addEventListener("resize", handleWindowSizeChange);
|
||||||
console.log("test", test);
|
handleWindowSizeChange();
|
||||||
|
|
||||||
let web3 = new Web3("https://eth-goerli.g.alchemy.com/v2/0-W9tOm6v_QP1PfRV8RuBCpWr-qoEbkN");
|
console.log("beforeEach");
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
walletStore.initialized = true;
|
||||||
|
console.log("init router");
|
||||||
|
//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 contract = new web3.eth.Contract(memeBurner.value.config.abi, memeBurner.value.config.contractAddress);
|
console.log("cycleStore.activeCycle", cycleStore.activeCycle);
|
||||||
list.value.memeBurnerPublic = new web3.eth.Contract(
|
await cycleStore.fillCycle(cycleStore.activeCycle);
|
||||||
memeBurner.value.config.abi,
|
|
||||||
memeBurner.value.config.contractAddress
|
|
||||||
);
|
|
||||||
console.log("list", list.value);
|
|
||||||
const currentRound = await contract.methods.currentRound().call();
|
|
||||||
const rounds = await contract.methods.rounds("0x0e349D42C125acA39ea58024FFC23ED0fE5feE32").call();
|
|
||||||
console.log("currentRound", currentRound);
|
|
||||||
console.log("rounds", rounds);
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<navbar />
|
<navbar @show-panel="(value) => (showPanel = value)" />
|
||||||
<div class="main">
|
<slideout-panel v-model="showPanel">
|
||||||
|
<connect-wallet></connect-wallet>
|
||||||
|
</slideout-panel>
|
||||||
|
<div class="main" :class="{ 'no-scroll': showPanel, mobile: isMobile }">
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</div>
|
</div>
|
||||||
|
<blood-splash :key="splashBlood"></blood-splash>
|
||||||
|
|
||||||
|
<div class="footer">
|
||||||
|
<div class="footer-inner">
|
||||||
|
<div class="footer-headline">Join Bloodline</div>
|
||||||
|
|
||||||
|
<div class="footer-social-links">
|
||||||
|
<div class="social-bloodline-badge">
|
||||||
|
<div class="social-bloodline-badge-icon">
|
||||||
|
<font-awesome-icon icon="fa-brands fa-discord" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="social-bloodline-badge">
|
||||||
|
<div class="social-bloodline-badge-icon">
|
||||||
|
<font-awesome-icon icon="fa-brands fa-telegram" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="social-bloodline-badge">
|
||||||
|
<div class="social-bloodline-badge-icon">
|
||||||
|
<font-awesome-icon icon="fa-brands fa-twitter" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-navigation-bar" v-if="isMobile">
|
||||||
|
<div @click="changeRoute('home')" :class="{ active: route.name === 'home' }">
|
||||||
|
<font-awesome-icon icon="fa-droplet" />
|
||||||
|
</div>
|
||||||
|
<div @click="changeRoute('cycle')" :class="{ active: route.name === 'cycle' }">
|
||||||
|
<font-awesome-icon icon="fa-moon" />
|
||||||
|
</div>
|
||||||
|
<div @click="changeRoute('profile')" :class="{ active: route.name === 'profile' }">
|
||||||
|
<font-awesome-icon icon="fa-person" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="sass"></style>
|
<style lang="sass">
|
||||||
|
|
||||||
|
.footer
|
||||||
|
height: auto
|
||||||
|
background-color: var(--midnight-black)
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 150px
|
||||||
|
min-height: 150px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: center
|
||||||
|
.footer-inner
|
||||||
|
padding: 16px 0 24px 0
|
||||||
|
font-size: 24px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
align-items: center
|
||||||
|
@media (min-width: 992px)
|
||||||
|
justify-content: center
|
||||||
|
.footer-headline
|
||||||
|
font-size: 16px
|
||||||
|
.footer-social-links
|
||||||
|
display: flex
|
||||||
|
gap: 24px
|
||||||
|
.social-bloodline-badge
|
||||||
|
border-radius: 14px
|
||||||
|
background: var(--grey, #858585)
|
||||||
|
display: flex
|
||||||
|
padding: 6px 20px
|
||||||
|
align-items: center
|
||||||
|
flex: 0 1 0
|
||||||
|
color: black
|
||||||
|
&:hover,&:active,&:focus
|
||||||
|
background-color: lighten( #858585, 10%)
|
||||||
|
cursor: pointer
|
||||||
|
.social-bloodline-badge-icon
|
||||||
|
font-size: 16px
|
||||||
|
.main
|
||||||
|
// padding-top: 24px
|
||||||
|
margin-top: 82px
|
||||||
|
padding: 24px 0
|
||||||
|
@media (min-width: 992px)
|
||||||
|
margin-top: 80px
|
||||||
|
padding: 80px 0
|
||||||
|
&.mobile
|
||||||
|
&.no-scroll
|
||||||
|
overflow: hidden
|
||||||
|
|
||||||
|
|
||||||
|
.mobile-navigation-bar
|
||||||
|
height: 72px
|
||||||
|
z-index: 1
|
||||||
|
width: 100%
|
||||||
|
padding: 16px 48px
|
||||||
|
border-radius: 16px 16px 0px 0px
|
||||||
|
box-shadow: 0px -4px 6px 0px rgba(0, 0, 0, 0.25)
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
bottom: -1px
|
||||||
|
position: fixed
|
||||||
|
display: flex
|
||||||
|
justify-content: space-around
|
||||||
|
align-items: center
|
||||||
|
div
|
||||||
|
font-size: 40px
|
||||||
|
cursor: pointer
|
||||||
|
&.active
|
||||||
|
color: var(--purple)
|
||||||
|
|
||||||
|
.modal-overlay
|
||||||
|
background-color: rgb(15, 15, 15, 0.7)
|
||||||
|
height: 100vh
|
||||||
|
width: 100vw
|
||||||
|
position: fixed
|
||||||
|
left: 0
|
||||||
|
bottom: 0
|
||||||
|
z-index: 10
|
||||||
|
@media (min-width: 992px)
|
||||||
|
background-color: unset
|
||||||
|
.modal-card
|
||||||
|
border-radius: 16px
|
||||||
|
padding: 16px
|
||||||
|
width: 342px
|
||||||
|
text-align: center
|
||||||
|
position: absolute
|
||||||
|
top: 50%
|
||||||
|
left: 50%
|
||||||
|
transform: translate(-50%, -50%)
|
||||||
|
border: 2px solid var(--dark-purple, #4B0082)
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
z-index: 100
|
||||||
|
gap: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
top: 142px
|
||||||
|
right: 24px
|
||||||
|
left: unset
|
||||||
|
transform: unset
|
||||||
|
.body
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.amount-number
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
align-items: end
|
||||||
|
gap: 8px
|
||||||
|
img
|
||||||
|
width: 74px
|
||||||
|
height: 74px
|
||||||
|
|
||||||
|
body::-webkit-scrollbar
|
||||||
|
width: 10px
|
||||||
|
|
||||||
|
body::-webkit-scrollbar-track
|
||||||
|
background: #202020
|
||||||
|
|
||||||
|
body::-webkit-scrollbar-thumb
|
||||||
|
background: grey
|
||||||
|
|
||||||
|
body:hover::-webkit-scrollbar-thumb
|
||||||
|
background: grey
|
||||||
|
|
||||||
|
|
||||||
|
.toast-header, .toast-body
|
||||||
|
font-size: 16px
|
||||||
|
|
||||||
|
.Vue-Toastification__container
|
||||||
|
&.bloodline-toast-container
|
||||||
|
&.top-right
|
||||||
|
@media (min-width: 992px)
|
||||||
|
top: 100px
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"contractName": "MemeToken",
|
"contractName": "Bloodline",
|
||||||
"contractAddress": "0xeC73Ec89897a36E9Ca36B2190964bBd8C46748AD",
|
"contractAddress": "0x51bF3df58D123e8EA43fb2189f18027FD36a08Af",
|
||||||
"abi": [
|
"abi": [
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -172,7 +172,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "burn",
|
"name": "burn",
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
@@ -202,7 +208,7 @@
|
|||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "mintMemeToken",
|
"name": "mintBloodline",
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"contractName": "LiquidityOwner",
|
"contractName": "LiquidityOwner",
|
||||||
"contractAddress": "0x0ce1d955f2a2658d6ca1CF61Fa300234fD8A262c",
|
"contractAddress": "0xF8bc4Ce13263DD4e12070e3192be50310eF7C95a",
|
||||||
"abi": [
|
"abi": [
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_memeToken",
|
"name": "_bloodline",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -21,270 +21,95 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_nfPositionManager",
|
"name": "_memeAltar",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "_memeBurner",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "_chunk",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "payable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "constructor"
|
"type": "constructor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "CallbackCanBeCalledOnlyByPool",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "CurrentPriceDisallowsToProvide",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "NothingToProvide",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "OnlyMemeAltar",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "ProjectAlive",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "WrongSideOfPrice",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
|
"indexed": true,
|
||||||
"internalType": "int24",
|
"internalType": "int24",
|
||||||
"name": "_tickLower",
|
"name": "tickLower",
|
||||||
"type": "int24"
|
"type": "int24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"indexed": true,
|
||||||
"internalType": "int24",
|
"internalType": "int24",
|
||||||
"name": "_tickUpper",
|
"name": "tickUpper",
|
||||||
"type": "int24"
|
"type": "int24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"indexed": true,
|
||||||
"name": "amountMemeToken",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "amountWETH",
|
"name": "amountWETH",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "addNewPosition",
|
"name": "LiquidityProvided",
|
||||||
"outputs": [],
|
"type": "event"
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "chunk",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"indexed": true,
|
||||||
"name": "liquidityTokenIds",
|
"internalType": "int24",
|
||||||
"type": "uint256[]"
|
"name": "tickLower",
|
||||||
}
|
"type": "int24"
|
||||||
],
|
|
||||||
"name": "collectDeveloperFees",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount0",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"indexed": true,
|
||||||
"name": "amount1",
|
"internalType": "int24",
|
||||||
"type": "uint256"
|
"name": "tickUpper",
|
||||||
}
|
"type": "int24"
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "currentTokenIdToFill",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "tokenId",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint128",
|
|
||||||
"name": "liquidity",
|
|
||||||
"type": "uint128"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "decreasePositionLiquidity",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount0",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount1",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "tokenId",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "amountWETH",
|
"name": "amountWETH",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amountMemeToken",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "increasePositionLiquidity",
|
"name": "LiquidityShouldBeProvidedLater",
|
||||||
"outputs": [],
|
"type": "event"
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "memeBurner",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "memeToken",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
|
||||||
"internalType": "uint256[]",
|
|
||||||
"name": "positionsToCancel",
|
|
||||||
"type": "uint256[]"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amountOfWETHToUse",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "movePriceUP",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount0Collected",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount1Collected",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "nfPositionManager",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "contract INonfungiblePositionManager",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "onERC721Received",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bytes4",
|
|
||||||
"name": "",
|
|
||||||
"type": "bytes4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "pure",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "positions",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint128",
|
|
||||||
"name": "liquidity",
|
|
||||||
"type": "uint128"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"internalType": "int24",
|
"internalType": "int24",
|
||||||
"name": "tickLower",
|
"name": "tickLower",
|
||||||
@@ -296,36 +121,36 @@
|
|||||||
"type": "int24"
|
"type": "int24"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"name": "_concatenateTicks",
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "round1",
|
|
||||||
"type": "bool"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "provideLiquidity",
|
|
||||||
"outputs": [],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "tokenIds",
|
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "int48",
|
||||||
"name": "",
|
"name": "",
|
||||||
"type": "uint256"
|
"type": "int48"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "pure",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int48",
|
||||||
|
"name": "",
|
||||||
|
"type": "int48"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "_positions",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "providedETH",
|
||||||
|
"type": "uint112"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "unprovidedETH",
|
||||||
|
"type": "uint112"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
@@ -333,7 +158,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "uniV3Pool",
|
"name": "bloodline",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
@@ -347,22 +172,200 @@
|
|||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "int256",
|
"internalType": "int24",
|
||||||
"name": "amount0Delta",
|
"name": "tickLower",
|
||||||
"type": "int256"
|
"type": "int24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "int256",
|
"internalType": "int24",
|
||||||
"name": "amount1Delta",
|
"name": "tickUpper",
|
||||||
"type": "int256"
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "collectPositionFees",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "wethAmount",
|
||||||
|
"type": "uint128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "bloodlineAmount",
|
||||||
|
"type": "uint128"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "collectedEthTotal",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "memeAltar",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "developerFee",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "payDeveloperFee",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "uniswapPool",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "extraAmount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "payWETHToUniswapPool",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "contract IUniswapV3Pool",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "previousBDLTotalSupply",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint128"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickLower",
|
||||||
|
"type": "int24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickUpper",
|
||||||
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "provideUnprovidedLiquidity",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickLower",
|
||||||
|
"type": "int24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickUpper",
|
||||||
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "rageQuit",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "wethAmount",
|
||||||
|
"type": "uint128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "bloodlineAmount",
|
||||||
|
"type": "uint128"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount0Owed",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount1Owed",
|
||||||
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "bytes",
|
"internalType": "bytes",
|
||||||
"name": "_data",
|
"name": "",
|
||||||
"type": "bytes"
|
"type": "bytes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "uniswapV3SwapCallback",
|
"name": "uniswapV3MintCallback",
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
@@ -379,10 +382,6 @@
|
|||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
|
||||||
{
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "receive"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,368 @@
|
|||||||
|
{
|
||||||
|
"contractName": "Meme",
|
||||||
|
"contractAddress": "0xC99B9d1693b71eF503c86B4cC05f141714176E5b",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "name",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "symbol",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_weth",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_uniV2Factory",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "payable",
|
||||||
|
"type": "constructor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Approval",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Transfer",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "DOMAIN_SEPARATOR",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "allowance",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "approve",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "balanceOf",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "burn",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "decimals",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "mint",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "name",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "nonces",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "value",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "deadline",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "v",
|
||||||
|
"type": "uint8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "r",
|
||||||
|
"type": "bytes32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "s",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "permit",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "symbol",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "totalSupply",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transfer",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transferFrom",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "uniV2Pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,368 @@
|
|||||||
|
{
|
||||||
|
"contractName": "Meme",
|
||||||
|
"contractAddress": "0xBCf48173f0767465Ef22fcDe2e1a099C8A5B4712",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "name",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "symbol",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_weth",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_uniV2Factory",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "payable",
|
||||||
|
"type": "constructor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Approval",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Transfer",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "DOMAIN_SEPARATOR",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "allowance",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "approve",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "balanceOf",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "burn",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "decimals",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "mint",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "name",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "nonces",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "value",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "deadline",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "v",
|
||||||
|
"type": "uint8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "r",
|
||||||
|
"type": "bytes32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "s",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "permit",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "symbol",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "totalSupply",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transfer",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transferFrom",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "uniV2Pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,368 @@
|
|||||||
|
{
|
||||||
|
"contractName": "Meme",
|
||||||
|
"contractAddress": "0xD563C6d061c5fc09eCf94c6Ce30CB400Ce2FD295",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "name",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "symbol",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_weth",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_uniV2Factory",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "payable",
|
||||||
|
"type": "constructor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Approval",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Transfer",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "DOMAIN_SEPARATOR",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "allowance",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "approve",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "balanceOf",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "burn",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "decimals",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "mint",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "name",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "nonces",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "value",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "deadline",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "v",
|
||||||
|
"type": "uint8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "r",
|
||||||
|
"type": "bytes32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "s",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "permit",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "symbol",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "totalSupply",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transfer",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transferFrom",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "uniV2Pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,920 @@
|
|||||||
|
{
|
||||||
|
"contractName": "MemeAltar",
|
||||||
|
"contractAddress": "0xE4F42F3f8B0E57b1054D457fe3b49a1A10B1aCEa",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address[]",
|
||||||
|
"name": "sacrificableList",
|
||||||
|
"type": "address[]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address[]",
|
||||||
|
"name": "uniV2pools",
|
||||||
|
"type": "address[]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_weth",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_admin",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_rewardLocker",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_bloodline",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "_defaultGoal",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "constructor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "ArraysHaveDifferentLength",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "CycleCompletedRegistrationFailed",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "InsufficientOutputAmount",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "LiquidityOwnerAlreadyInitialized",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "MemeIsNotInAList",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "NextCycleRegistrationFailed",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "NotAdmin",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "NotExactInput",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "NothingToSacrifice",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "RewardRegistrationFailed",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "SwapCallbackCanBeCalledOnlyByPool",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "SwapWithinZeroLiquidity",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "SwitchRequiresMemeBeSet",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "TokenIsNotInSacrificableList",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "TooLittleReceived",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "uniV2Pool",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "UniV2PoolWithoutLiquidity",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeMarket",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "MemeAddedToSacrificableList",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "MemeRemovedFromSacrificableList",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificer",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificedToken",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "sacrificedAmount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "MemeSacrificed",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "newAdmin",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "NewAdmin",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b3",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m4",
|
||||||
|
"type": "uint40"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "struct MemeAltar.BM",
|
||||||
|
"name": "_bm",
|
||||||
|
"type": "tuple"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "NewBM",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "newDurationLimit",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "NewCycleDurationLimit",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "newDefaultGoal",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "NewDefaultCycleGoal",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "uniV2Pool",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "addMemeToList",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b3",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m4",
|
||||||
|
"type": "uint40"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"internalType": "struct MemeAltar.BM",
|
||||||
|
"name": "newBM",
|
||||||
|
"type": "tuple"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "adjustBM",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint32",
|
||||||
|
"name": "newDurationLimit",
|
||||||
|
"type": "uint32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "adjustCycleDurationLimit",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "newDefaultGoal",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "adjustDefaultGoal",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "admin",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "bloodline",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "contract Bloodline",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "bm",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m1",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m2",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "b3",
|
||||||
|
"type": "uint40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint40",
|
||||||
|
"name": "m4",
|
||||||
|
"type": "uint40"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "currentCycle",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeToSacrifice",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountToSacrifice",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "cycleParticipant",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getAmountETHBase",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountETHBase",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountETHForSelling",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeToSacrifice",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getAmountToReachGoal",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getGoalInBLOOD",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeToSacrifice",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountToSacrifice",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getRewardForSacrifice",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "rewardCurrentCycle",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "rewardNextCycle",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint112"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getSacrificedMeme",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "participation",
|
||||||
|
"type": "bool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountAchieved",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "issuancePrice",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "liquidityOwner",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "memeList",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "memesUniV2Pools",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "removeMemeFromList",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "rewardLocker",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeToSacrifice",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountToSacrifice",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "minETH",
|
||||||
|
"type": "uint112"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "sacrificeMeme",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint128",
|
||||||
|
"name": "reward",
|
||||||
|
"type": "uint128"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "memeToSacrifice",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountToSacrifice",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "minBLOOD",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "sacrificeMemeAndBuyBLOOD",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "reward",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_liquidityOwner",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "setLiquidityOwner",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "newAdmin",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "switchAdmin",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "meme",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "newUniV2Pool",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "switchUniV2Pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "uniV3Pool",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int256",
|
||||||
|
"name": "amount0Delta",
|
||||||
|
"type": "int256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int256",
|
||||||
|
"name": "amount1Delta",
|
||||||
|
"type": "int256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes",
|
||||||
|
"name": "_data",
|
||||||
|
"type": "bytes"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "uniswapV3SwapCallback",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "weth",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,18 +1,36 @@
|
|||||||
{
|
{
|
||||||
"contractName": "MemeBurner",
|
"Meme1": {
|
||||||
"contractAddress": "0x6eEAe97975e156400DD1DDD8eFc4CcB167BaAFC3",
|
"address": "0x4435ABC578136e2Eca50b5EFf950F17CAF42485b",
|
||||||
|
"uniV2Pool": "0xdD84B97DbA213e1aAdFEFD3de7067fC4Ab357378"
|
||||||
|
},
|
||||||
|
"Meme2": {
|
||||||
|
"address": "0xa0B7b2a78dF87eDc70736f7ED9D40d86c37B533F",
|
||||||
|
"uniV2Pool": "0xe9428ba55920DAB804153E9c4E8910EF1564a2b9"
|
||||||
|
},
|
||||||
|
"Meme3": {
|
||||||
|
"address": "0xC99B9d1693b71eF503c86B4cC05f141714176E5b",
|
||||||
|
"uniV2Pool": "0x905F0FA7F878eB8bd50782F9a4B739fb50394715"
|
||||||
|
},
|
||||||
|
"Meme4": {
|
||||||
|
"address": "0xBCf48173f0767465Ef22fcDe2e1a099C8A5B4712",
|
||||||
|
"uniV2Pool": "0x32Ba68Da1d5Df661181C8CA420b96925bFc748AA"
|
||||||
|
},
|
||||||
|
"Meme5": {
|
||||||
|
"address": "0xD563C6d061c5fc09eCf94c6Ce30CB400Ce2FD295",
|
||||||
|
"uniV2Pool": "0xf51E0b3804945d05eC20a4a1a2B0F7eD5BFf0068"
|
||||||
|
},
|
||||||
"abi": [
|
"abi": [
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address[]",
|
"internalType": "string",
|
||||||
"name": "sacrificableList",
|
"name": "name",
|
||||||
"type": "address[]"
|
"type": "string"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address[]",
|
"internalType": "string",
|
||||||
"name": "uniV2pools",
|
"name": "symbol",
|
||||||
"type": "address[]"
|
"type": "string"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
@@ -21,152 +39,90 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_developer",
|
"name": "_uniV2Factory",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "_rewardLocker",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "_memeToken",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256[]",
|
|
||||||
"name": "roundGoals",
|
|
||||||
"type": "uint256[]"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "_liquidityAmountLimit",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "payable",
|
||||||
"type": "constructor"
|
"type": "constructor"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "ArraysHaveDifferentLength",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "Impossible",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "LiquidityOwnerAlreadyInitialized",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "NothingToSacrifice",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "TokenIsNotInSacrificableList",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "memeToTransfer",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "TokenTransferFailed",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "uniV2Pool",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "UniV2PoolWithoutLiquidity",
|
|
||||||
"type": "error"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"anonymous": false,
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"indexed": false,
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "meme",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "MemeAddedToSacrificeList",
|
|
||||||
"type": "event"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"anonymous": false,
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"indexed": false,
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "meme",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "MemeRemovedFromSacrificeList",
|
|
||||||
"type": "event"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"anonymous": false,
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "sacrificer",
|
"name": "owner",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "sacrificedToken",
|
"name": "spender",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": false,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "sacrificedAmount",
|
"name": "amount",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "MemeSacrificed",
|
"name": "Approval",
|
||||||
"type": "event"
|
"type": "event"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Transfer",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "DOMAIN_SEPARATOR",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "meme",
|
"name": "",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "uniV2Pool",
|
"name": "",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "addMemeToList",
|
"name": "allowance",
|
||||||
"outputs": [],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "currentRound",
|
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
@@ -181,58 +137,35 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "memeToSacrifice",
|
"name": "spender",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "amountToSacrifice",
|
"name": "amount",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "getRewardFor",
|
"name": "approve",
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "roundNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "meme",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "getSacrificedMeme",
|
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "bool",
|
"internalType": "bool",
|
||||||
"name": "participation",
|
"name": "",
|
||||||
"type": "bool"
|
"type": "bool"
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amountAchieved",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [
|
||||||
"name": "liquidityAmountLimit",
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "balanceOf",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
@@ -243,78 +176,27 @@
|
|||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "liquidityOwner",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "",
|
"name": "amount",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "memeList",
|
"name": "burn",
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "memesUniV2Pools",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "meme",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "removeMemeFromList",
|
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "rewardLocker",
|
"name": "decimals",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "uint8",
|
||||||
"name": "",
|
"name": "",
|
||||||
"type": "address"
|
"type": "uint8"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
@@ -324,61 +206,172 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "",
|
"name": "amount",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "rounds",
|
"name": "mint",
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "goal",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "memeToSacrifice",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amountToSacrifice",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "sacrificeMeme",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "reward",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "_liquidityOwner",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "setLiquidityOwner",
|
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "weth",
|
"name": "name",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "nonces",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "owner",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "spender",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "value",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "deadline",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint8",
|
||||||
|
"name": "v",
|
||||||
|
"type": "uint8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "r",
|
||||||
|
"type": "bytes32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "s",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "permit",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "symbol",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "string",
|
||||||
|
"name": "",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "totalSupply",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transfer",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "from",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "to",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "transferFrom",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "uniV2Pool",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
@@ -388,10 +381,6 @@
|
|||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
|
||||||
{
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "receive"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
{
|
||||||
|
"contractName": "Quoter",
|
||||||
|
"contractAddress": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_factory",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "_WETH9",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "constructor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "WETH9",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "factory",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes",
|
||||||
|
"name": "path",
|
||||||
|
"type": "bytes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountIn",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "quoteExactInput",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountOut",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "tokenIn",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "tokenOut",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint24",
|
||||||
|
"name": "fee",
|
||||||
|
"type": "uint24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountIn",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint160",
|
||||||
|
"name": "sqrtPriceLimitX96",
|
||||||
|
"type": "uint160"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "quoteExactInputSingle",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountOut",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bytes",
|
||||||
|
"name": "path",
|
||||||
|
"type": "bytes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountOut",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "quoteExactOutput",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountIn",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "tokenIn",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "tokenOut",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint24",
|
||||||
|
"name": "fee",
|
||||||
|
"type": "uint24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountOut",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint160",
|
||||||
|
"name": "sqrtPriceLimitX96",
|
||||||
|
"type": "uint160"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "quoteExactOutputSingle",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amountIn",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int256",
|
||||||
|
"name": "amount0Delta",
|
||||||
|
"type": "int256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int256",
|
||||||
|
"name": "amount1Delta",
|
||||||
|
"type": "int256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes",
|
||||||
|
"name": "path",
|
||||||
|
"type": "bytes"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "uniswapV3SwapCallback",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"contractName": "RewardLocker",
|
"contractName": "RewardLocker",
|
||||||
"contractAddress": "0x3bEc26159dbA0A32210eaDF6A938F1BbE8bfDAA0",
|
"contractAddress": "0x2952253374973DE0ffbFe35269Ca13FaF28B935F",
|
||||||
"abi": [
|
"abi": [
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -15,17 +15,22 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "MemeAltarAlreadyInitialized",
|
"name": "AlreadyInitialized",
|
||||||
"type": "error"
|
"type": "error"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "MemeTokenAlreadyInitialized",
|
"name": "CycleIsNotCompletedYet",
|
||||||
"type": "error"
|
"type": "error"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "RoundIsNotCompletedYet",
|
"name": "NotMemeAltar",
|
||||||
|
"type": "error"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "StakePartMoreThan100Percent",
|
||||||
"type": "error"
|
"type": "error"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -57,6 +62,44 @@
|
|||||||
"name": "ClaimedReward",
|
"name": "ClaimedReward",
|
||||||
"type": "event"
|
"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,
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -69,7 +112,7 @@
|
|||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "stakedRound",
|
"name": "stakedCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -94,7 +137,7 @@
|
|||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -116,6 +159,12 @@
|
|||||||
"name": "user",
|
"name": "user",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
@@ -123,7 +172,7 @@
|
|||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": false,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "reward",
|
"name": "reward",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
@@ -132,44 +181,6 @@
|
|||||||
"name": "Rewarded",
|
"name": "Rewarded",
|
||||||
"type": "event"
|
"type": "event"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"anonymous": false,
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"indexed": true,
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "index",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"indexed": true,
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "winnerToken",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"indexed": false,
|
|
||||||
"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,
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -182,7 +193,7 @@
|
|||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -195,11 +206,24 @@
|
|||||||
"name": "UnstakeOrdered",
|
"name": "UnstakeOrdered",
|
||||||
"type": "event"
|
"type": "event"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "bloodline",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "contract Bloodline",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -223,7 +247,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -242,7 +266,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -262,6 +286,141 @@
|
|||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"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": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "user",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificedToken",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getRewards",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "stakeReward",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "sacrificeReward",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getSacrificableTokens",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address[]",
|
||||||
|
"name": "",
|
||||||
|
"type": "address[]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificedToken",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getSacrificedTokenCoefficient",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "user",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificedToken",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "reward",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getStakeRewardForSacrificeReward",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "stakeReward",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
@@ -271,7 +430,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "roundNumbers",
|
"name": "cycleNumbers",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -279,7 +438,36 @@
|
|||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "totalRewardsAmount",
|
"name": "totalSacrificeRewards",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "totalStakeRewards",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "cycleNumber",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "sacrificedToken",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getTotalSacrificeRewardsForToken",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "totalSacrificeRewardsForToken",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -295,7 +483,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_memeToken",
|
"name": "_bloodline",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -306,7 +494,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "lastCompletedRound",
|
"name": "lastCompletedCycle",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
@@ -330,26 +518,13 @@
|
|||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "memeToken",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "contract MemeToken",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "orderUnstake",
|
"name": "orderUnstake",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -360,7 +535,31 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"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"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -369,7 +568,7 @@
|
|||||||
"type": "address[]"
|
"type": "address[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "registerNextRound",
|
"name": "registerNextCycle",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "bool",
|
"internalType": "bool",
|
||||||
@@ -413,84 +612,36 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "roundIndex",
|
"name": "stakeCoefficient",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "uint256[]",
|
||||||
"name": "winnerToken",
|
"name": "_cycles",
|
||||||
"type": "address"
|
"type": "uint256[]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address[]",
|
||||||
|
"name": "_sacrificedTokens",
|
||||||
|
"type": "address[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "registerRoundCompleted",
|
"name": "stakeAndClaim",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "bool",
|
"internalType": "uint256",
|
||||||
"name": "",
|
"name": "stakedAmount",
|
||||||
"type": "bool"
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "claimedAmount",
|
||||||
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "rewards",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "rounds",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "roundCompleted",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "totalDefaultRewards",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "totalRewards",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
@@ -534,7 +685,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -596,7 +747,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
[{"inputs":[{"internalType":"address","name":"meme","type":"address"},{"internalType":"address","name":"uniV2Pool","type":"address"}],"name":"addMemeToList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint40","name":"b1","type":"uint40"},{"internalType":"uint40","name":"m1","type":"uint40"},{"internalType":"uint40","name":"b2","type":"uint40"},{"internalType":"uint40","name":"m2","type":"uint40"},{"internalType":"uint40","name":"b3","type":"uint40"},{"internalType":"uint40","name":"m4","type":"uint40"}],"internalType":"struct MemeAltar.BM","name":"newBM","type":"tuple"}],"name":"adjustBM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint112","name":"newDefaultGoal","type":"uint112"}],"name":"adjustDefaultGoal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newDurationLimit","type":"uint32"}],"name":"adjustRoundDurationLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"switchAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"meme","type":"address"},{"internalType":"address","name":"newUniV2Pool","type":"address"}],"name":"switchUniV2Pool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"meme","type":"address"}],"name":"removeMemeFromList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
|
||||||
|
Before Width: | Height: | Size: 120 KiB |
@@ -0,0 +1 @@
|
|||||||
|
!function(){function e(e){for(var o=0;o<c.length;o++)c[o]=0;for(var o=0;o<e.length;o++)c[o%4]=(c[o%4]<<5)-c[o%4]+e.charCodeAt(o)}function o(){var e=c[0]^c[0]<<11;return c[0]=c[1],c[1]=c[2],c[2]=c[3],c[3]=c[3]^c[3]>>19^e^e>>8,(c[3]>>>0)/(1<<31>>>0)}function r(){var e=Math.floor(360*o()),r=60*o()+40+"%",t=25*(o()+o()+o()+o())+"%",l="hsl("+e+","+r+","+t+")";return l}function t(e){for(var r=e,t=e,l=Math.ceil(r/2),n=r-l,a=[],c=0;t>c;c++){for(var i=[],f=0;l>f;f++)i[f]=Math.floor(2.3*o());var s=i.slice(0,n);s.reverse(),i=i.concat(s);for(var h=0;h<i.length;h++)a.push(i[h])}return a}function l(o){var t={};return t.seed=o.seed||Math.floor(Math.random()*Math.pow(10,16)).toString(16),e(t.seed),t.size=o.size||8,t.scale=o.scale||4,t.color=o.color||r(),t.bgcolor=o.bgcolor||r(),t.spotcolor=o.spotcolor||r(),t}function n(e,o){var r=t(e.size),l=Math.sqrt(r.length);o.width=o.height=e.size*e.scale;var n=o.getContext("2d");n.fillStyle=e.bgcolor,n.fillRect(0,0,o.width,o.height),n.fillStyle=e.color;for(var a=0;a<r.length;a++)if(r[a]){var c=Math.floor(a/l),i=a%l;n.fillStyle=1==r[a]?e.color:e.spotcolor,n.fillRect(i*e.scale,c*e.scale,e.scale,e.scale)}return o}function a(e){var e=l(e||{}),o=document.createElement("canvas");return n(e,o),o}var c=new Array(4),i={create:a,render:n};"undefined"!=typeof module&&(module.exports=i),"undefined"!=typeof window&&(window.blockies=i)}();
|
||||||
@@ -1,35 +1,41 @@
|
|||||||
.bloodline-devider
|
.bloodline-devider
|
||||||
font-size: 42px
|
font-size: 42px
|
||||||
margin: 24px 0
|
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
||||||
.bloodline-border
|
.bloodline-border
|
||||||
padding: 24px 32px
|
padding: 12px
|
||||||
border: 4px solid #000000
|
|
||||||
border-radius: 16px
|
border-radius: 16px
|
||||||
|
border: 2px solid #000
|
||||||
|
&.bloodline-border--variant1
|
||||||
|
border: 3px solid var(--midnight-black)
|
||||||
|
&.bloodline-border__thin
|
||||||
|
border-width: 1px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 18px 24px
|
||||||
|
border: 3px solid #000
|
||||||
|
&.purple
|
||||||
|
border-color: var(--purple)
|
||||||
|
&.white
|
||||||
|
border-color: var(--white)
|
||||||
|
&.grey
|
||||||
|
border-color: var(--grey, #858585)
|
||||||
|
|
||||||
.bloodline-badge
|
.bloodline-badge
|
||||||
padding: 8px 16px 8px 16px
|
padding: 6px 12px 6px 12px
|
||||||
border-radius: 14px
|
border-radius: 14px
|
||||||
background-color: #0F0F0F
|
background-color: #0F0F0F
|
||||||
display: flex
|
display: flex
|
||||||
.bloodline-badge-icon
|
.bloodline-badge-icon
|
||||||
margin-right: 8px
|
margin-right: 8px
|
||||||
|
&.grey
|
||||||
|
background-color: var(--grey)
|
||||||
|
|
||||||
.card
|
.bloodline-token
|
||||||
display: block
|
height: 50px
|
||||||
overflow: hidden
|
width: 50px
|
||||||
overflow-wrap: break-word
|
@media (min-width: 992px)
|
||||||
position: relative
|
height: auto
|
||||||
padding: 0
|
width: auto
|
||||||
text-decoration: none
|
|
||||||
transition-duration: .28s
|
.bloodline-container
|
||||||
transition-property: box-shadow,opacity,background
|
padding: 0 24px
|
||||||
transition-timing-function: cubic-bezier(.4,0,.2,1)
|
|
||||||
z-index: 0
|
|
||||||
border-color: rgba(var(--v-border-color),var(--v-border-opacity))
|
|
||||||
border-style: solid
|
|
||||||
border-width: 0
|
|
||||||
border-radius: 4px
|
|
||||||
box-shadow: 0 2px 1px -1px rgba(0, 0, 0, .2),0 1px 1px 0rgba(0, 0, 0, .14),0 1px 3px 0 rgba(0, 0, 0, .12)
|
|
||||||
background-color: $darkgrey
|
|
||||||
|
|||||||
@@ -1,13 +1,24 @@
|
|||||||
|
|
||||||
.btn
|
.btn
|
||||||
|
padding: 16px 24px
|
||||||
|
gap: 8px
|
||||||
|
border-radius: 14px
|
||||||
|
border: none
|
||||||
|
display: block
|
||||||
|
width: 100%
|
||||||
|
text-decoration: none
|
||||||
|
&:hover,&:focus,&:active
|
||||||
|
cursor: pointer
|
||||||
|
&[disabled], &.btn--disabled
|
||||||
|
background-color: darken($purple, 10%)
|
||||||
|
cursor: not-allowed
|
||||||
|
&.black
|
||||||
|
background-color: var(--midnight-black)
|
||||||
&.btn-immortal
|
&.btn-immortal
|
||||||
background-color: $red
|
background-color: $purple
|
||||||
color: $button-color
|
color: $button-color
|
||||||
font-size: 24px
|
&[disabled], &.btn--disabled
|
||||||
padding: 16px 24px
|
background-color: darken($purple, 10%)
|
||||||
gap: 8px
|
cursor: not-allowed
|
||||||
border-radius: 14px
|
|
||||||
&:hover,&:focus,&:active
|
&:hover,&:focus,&:active
|
||||||
background-color: lighten($button-background-color, 10%),
|
background-color: darken($purple, 10%),
|
||||||
color: darken($button-color, 10%),
|
|
||||||
cursor: pointer
|
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ body
|
|||||||
background-color: #2D2D2D
|
background-color: #2D2D2D
|
||||||
color: $white
|
color: $white
|
||||||
font-family: 'Inter', sans-serif
|
font-family: 'Inter', sans-serif
|
||||||
|
&.sideoutpanel-open
|
||||||
|
&:not(.mobile)
|
||||||
|
overflow-y: hidden
|
||||||
|
padding-right: 10px
|
||||||
|
.navbar
|
||||||
|
padding-right: 10px
|
||||||
|
|
||||||
.main
|
|
||||||
padding-top: 120px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
padding-top: 208px
|
|
||||||
html
|
html
|
||||||
font-size: var(--font-size-main)
|
font-size: var(--font-size-main)
|
||||||
html, body, #app
|
|
||||||
height: 100%
|
|
||||||
|
|
||||||
body
|
body
|
||||||
margin: 0
|
margin: 0
|
||||||
@@ -33,22 +33,21 @@ body
|
|||||||
#app
|
#app
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
|
height: 100vh
|
||||||
.footer
|
.footer
|
||||||
margin-top: auto
|
margin-top: auto
|
||||||
|
|
||||||
.container
|
.container
|
||||||
padding-right: 15px
|
|
||||||
padding-left: 15px
|
|
||||||
margin-right: auto
|
margin-right: auto
|
||||||
margin-left: auto
|
margin-left: auto
|
||||||
|
padding-right: 16px
|
||||||
|
padding-left: 16px
|
||||||
|
// &.container--variant1
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// max-width: 800px
|
||||||
|
// padding: 24px 64px
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
max-width: 800px
|
max-width: 670px
|
||||||
.section-header-container
|
|
||||||
width: 655px
|
|
||||||
text-align: center
|
|
||||||
font-size: 24px
|
|
||||||
margin-top: 64px
|
|
||||||
margin-bottom: 64px
|
|
||||||
|
|
||||||
h1
|
h1
|
||||||
font-weight: 700
|
font-weight: 700
|
||||||
@@ -57,7 +56,16 @@ h1
|
|||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
font-size: 60px
|
font-size: 60px
|
||||||
@media (min-width: 1200px)
|
@media (min-width: 1200px)
|
||||||
|
h2
|
||||||
|
font-size: 40px
|
||||||
|
font-weight: 200
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 40px
|
||||||
|
h3
|
||||||
|
font-size: 32px
|
||||||
|
font-weight: 200
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 40px
|
||||||
.page-head
|
.page-head
|
||||||
margin-bottom: 80px
|
margin-bottom: 80px
|
||||||
.page-body
|
.page-body
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ $tertiary-light: lighten($tertiary, 20%)
|
|||||||
|
|
||||||
$white: #F9F9FA
|
$white: #F9F9FA
|
||||||
$black: #0F0F0F
|
$black: #0F0F0F
|
||||||
$grey: #808080
|
$grey: #858585
|
||||||
|
$grey-light: lighten($grey, 20%)
|
||||||
$red: #8B0000
|
$red: #8B0000
|
||||||
$purple: #4B0082
|
$purple: #4B0082
|
||||||
|
$midnight-black: #0F0F0F
|
||||||
$darkgrey: #202020
|
$darkgrey: #202020
|
||||||
|
$grey2: #2D2D2D
|
||||||
|
$dark-grey: #202020
|
||||||
|
|
||||||
$button-color: $white
|
$button-color: $white
|
||||||
$button-background-color: $black
|
$button-background-color: $black
|
||||||
@@ -28,12 +31,91 @@ $button-background-color: $black
|
|||||||
--tertiary: #{$tertiary}
|
--tertiary: #{$tertiary}
|
||||||
--tertiary-light: #{$tertiary-light}
|
--tertiary-light: #{$tertiary-light}
|
||||||
--tertiary-dark: #{$tertiary-dark}
|
--tertiary-dark: #{$tertiary-dark}
|
||||||
|
--white: #{#F9F9FA}
|
||||||
--grey: #{$grey}
|
--grey: #{$grey}
|
||||||
|
--grey-light: #{$grey-light}
|
||||||
|
--grey2: #{$grey2}
|
||||||
|
--dark-grey: #{$dark-grey}
|
||||||
--purple: #{$purple}
|
--purple: #{$purple}
|
||||||
--blood-color: #{$red}
|
--blood-color: #{$red}
|
||||||
|
--midnight-black: #{$midnight-black}
|
||||||
|
--black: #{$midnight-black}
|
||||||
|
--darkgrey: #{$darkgrey}
|
||||||
|
|
||||||
|
//fonts
|
||||||
|
.tiny-text
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 14px
|
||||||
|
.low-mid-text
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 16px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// font-size: 18px
|
||||||
|
.mid-mid-text
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 18px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// font-size: 24px
|
||||||
|
.mid-text
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 18px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
.small-text
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 14px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 18px
|
||||||
|
.number-mobile
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 24px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
letter-spacing: 4.32px
|
||||||
|
.sub-header
|
||||||
|
font-family: Inter
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
font-size: 24px
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// font-size: 32px
|
||||||
|
.header
|
||||||
|
font-family: Inter
|
||||||
|
font-size: 32px
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// font-size: 30px
|
||||||
|
|
||||||
// :root
|
// :root
|
||||||
// --font-size-text: 16px
|
// --font-size-text: 16px
|
||||||
// --font-size-title: 32px
|
// --font-size-title: 32px
|
||||||
// @media (min-width: 992px)
|
// @media (min-width: 992px)
|
||||||
// --font-size-text: 24px
|
// --font-size-text: 24px
|
||||||
// --font-size-title: 36px
|
// --font-size-title: 36px
|
||||||
|
|
||||||
|
.text-center
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.transparent
|
||||||
|
background-color: transparent
|
||||||
|
|
||||||
|
.card
|
||||||
|
border-radius: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 48px 32px
|
||||||
|
&.card--glow
|
||||||
|
box-shadow: 0px 12px 150px 0px rgba(75, 0, 130, 0.35)
|
||||||
|
|||||||
@@ -1,13 +1,36 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="blood-chart-wrapper">
|
<div class="blood-chart-wrapper">
|
||||||
<div class="blood-chart-element" v-for="coin in dataPoints" :key="coin.name">
|
<div class="blood-arrow left">
|
||||||
<div class="blood-chart-element-header">
|
<img
|
||||||
<div class="blood-chart-coin"></div>
|
class="swiper-arrow"
|
||||||
<div class="blood-chart-coin-title">{{ coin.name }}</div>
|
src="/assets/img/blood-arrow-left.png"
|
||||||
</div>
|
alt="left-arrow"
|
||||||
<div class="blood-chart-element-body">
|
@click="swiperInstance.slidePrev()"
|
||||||
<div class="blood-chart-bar-wrapper">
|
v-if="token?.length > 3"
|
||||||
<div class="blood-chart-bar" :style="`height: ${coin.percentage}%`">
|
/>
|
||||||
|
</div>
|
||||||
|
<swiper
|
||||||
|
class="blood-chart"
|
||||||
|
:slidesPerView="3"
|
||||||
|
:centeredSlides="false"
|
||||||
|
:initial-slide="0"
|
||||||
|
:spaceBetween="IsMobile ? 35 : 0"
|
||||||
|
@swiper="onSwiper"
|
||||||
|
>
|
||||||
|
<swiper-slide class="blood-chart-element" v-for="coin in token" :key="coin.name">
|
||||||
|
<div class="blood-chart-element-header">
|
||||||
|
<div class="blood-chart-coin">
|
||||||
|
<template v-if="cycleStore.getCycleWinner.contractAddress === coin.contractAddress">
|
||||||
|
<img :src="coin.vampwinner2" alt="logo" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<img :src="coin.vamplogo" alt="logo" />
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="blood-chart-coin-title low-mid-text">{{ coin.name }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="blood-chart-element-body">
|
||||||
|
<div class="blood-chart-bar-wrapper">
|
||||||
<svg
|
<svg
|
||||||
class="waves"
|
class="waves"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@@ -29,96 +52,183 @@
|
|||||||
<use xlink:href="#gentle-wave" x="48" y="7" fill="#8B0000" />
|
<use xlink:href="#gentle-wave" x="48" y="7" fill="#8B0000" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
<div class="wrapper">
|
<div
|
||||||
<div><span class="dot"></span></div>
|
class="blood-chart-bar"
|
||||||
<div><span class="dot"></span></div>
|
:style="`height: ${getPercentageBloodChart(coin.amount, props.data.goal)}%`"
|
||||||
<div><span class="dot"></span></div>
|
>
|
||||||
<div><span class="dot"></span></div>
|
<div class="wrapper">
|
||||||
<div><span class="dot"></span></div>
|
<div><span class="dot"></span></div>
|
||||||
<div><span class="dot"></span></div>
|
<div><span class="dot"></span></div>
|
||||||
|
<div><span class="dot"></span></div>
|
||||||
|
<div><span class="dot"></span></div>
|
||||||
|
<div><span class="dot"></span></div>
|
||||||
|
<div><span class="dot"></span></div>
|
||||||
|
</div>
|
||||||
|
<div class="blood-chart-bar-percentage">
|
||||||
|
{{ getPercentage(coin.amount, props.data.goal) }}%
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="blood-chart-bar-percentage">{{ coin.percentage }}%</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="blood-chart-element-footer">
|
||||||
<div class="blood-chart-element-footer">
|
<div class="blood-chart-amount">
|
||||||
<div class="blood-chart-amount">130,4b</div>
|
{{ formatNumber(coin.amountInBLD / 10n ** tokenStore.memeToken.decimals) }}
|
||||||
<div class="blood-chart-coin">$BLOOD</div>
|
</div>
|
||||||
</div>
|
<div>$BLOOD</div>
|
||||||
|
</div>
|
||||||
|
</swiper-slide>
|
||||||
|
|
||||||
|
<!-- <button @click="swiperInstance.slidePrev()">left</button>
|
||||||
|
<button @click="swiperInstance.slideNext()">left</button> -->
|
||||||
|
</swiper>
|
||||||
|
<div class="blood-arrow right">
|
||||||
|
<img
|
||||||
|
class="swiper-arrow"
|
||||||
|
src="/assets/img/blood-arrow-right.png"
|
||||||
|
alt="left-arrow"
|
||||||
|
@click="swiperInstance.slideNext()"
|
||||||
|
v-if="token?.length > 3"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
const dataPoints = [
|
import { computed, ref, inject, onMounted } from "vue";
|
||||||
{
|
import { getPercentage, compactNumber, formatNumber } from "@/helper/helper.js";
|
||||||
name: "PEPE",
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
percentage: 62.2,
|
|
||||||
},
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
{
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
name: "Shiba",
|
|
||||||
percentage: 31.2,
|
import { Swiper, SwiperSlide } from "swiper/vue";
|
||||||
},
|
|
||||||
{
|
// Import Swiper styles
|
||||||
name: "Doge",
|
import "swiper/css";
|
||||||
percentage: 54.5,
|
import "swiper/css/navigation";
|
||||||
},
|
import "swiper/css/pagination";
|
||||||
];
|
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
data: Object,
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
console.log("bloodchart-data", props.data);
|
||||||
|
});
|
||||||
|
|
||||||
|
const swiperInstance = ref();
|
||||||
|
|
||||||
|
function onSwiper(swiper) {
|
||||||
|
swiperInstance.value = swiper;
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = computed(() => props.data?.token);
|
||||||
|
|
||||||
|
//start with visual 5% of the filled bar, because otherwise the percentage number is not visible
|
||||||
|
function getPercentageBloodChart(amount, goal) {
|
||||||
|
let returnNumber = 5;
|
||||||
|
if ((Number(amount) / Number(goal)) * 100 < 5) {
|
||||||
|
returnNumber = 5;
|
||||||
|
} else {
|
||||||
|
returnNumber = (Number(amount) / Number(goal)) * 100;
|
||||||
|
}
|
||||||
|
return returnNumber.toFixed(2);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.blood-chart-wrapper
|
.blood-chart-wrapper
|
||||||
|
// margin-top: 56px
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
// margin-bottom: 80px
|
||||||
|
position: relative
|
||||||
|
.blood-chart
|
||||||
height: 750px
|
height: 750px
|
||||||
|
width: 100%
|
||||||
|
justify-content: space-around
|
||||||
display: inline-flex
|
display: inline-flex
|
||||||
gap: 96px
|
@media (min-width: 992px)
|
||||||
|
gap: 32px
|
||||||
|
width: unset
|
||||||
|
justify-content: unset
|
||||||
|
|
||||||
.blood-chart-element
|
.blood-chart-element
|
||||||
height: 100%
|
height: 100%
|
||||||
width: 80px
|
width: 80px
|
||||||
|
align-items: center
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: 100px
|
||||||
|
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
.blood-chart-element-header
|
.blood-chart-element-header
|
||||||
flex: 0 0 100px
|
flex: 0 0 100px
|
||||||
.blood-chart-coin
|
.blood-chart-coin
|
||||||
height: 80px
|
|
||||||
width: 80px
|
|
||||||
border-radius: 80px
|
|
||||||
background-color: grey
|
|
||||||
margin-left: auto
|
margin-left: auto
|
||||||
margin-right: auto
|
margin-right: auto
|
||||||
position: relative
|
position: relative
|
||||||
margin-bottom: 16px
|
margin-bottom: 16px
|
||||||
|
overflow: hidden
|
||||||
|
height: 80px
|
||||||
|
width: 80px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 72px
|
||||||
|
width: 72px
|
||||||
|
img
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
.blood-chart-coin-title
|
.blood-chart-coin-title
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-bottom: 32px
|
margin-bottom: 32px
|
||||||
font-size: 24px
|
|
||||||
.blood-chart-element-body
|
.blood-chart-element-body
|
||||||
background-color: rgba(233, 233, 233, 0.2)
|
background-color: rgba(233, 233, 233, 0.2)
|
||||||
flex: 1 1 auto
|
flex: 0 0 500px
|
||||||
|
width: 60px
|
||||||
border-radius: 8px 8px 40px 40px
|
border-radius: 8px 8px 40px 40px
|
||||||
|
text-align: left
|
||||||
|
overflow: hidden
|
||||||
.blood-chart-bar-wrapper
|
.blood-chart-bar-wrapper
|
||||||
height: 100%
|
height: 100%
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
.blood-chart-bar
|
.waves
|
||||||
margin-top: auto
|
margin-top: auto
|
||||||
|
.blood-chart-bar
|
||||||
background-color: var(--blood-color)
|
background-color: var(--blood-color)
|
||||||
position: relative
|
position: relative
|
||||||
border-radius: 8px 8px 40px 40px
|
border-radius: 0 0 40px 40px
|
||||||
.blood-chart-bar-percentage
|
.blood-chart-bar-percentage
|
||||||
font-size: 14px
|
font-size: 14px
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-top: 16px
|
|
||||||
.waves
|
|
||||||
position: absolute
|
|
||||||
top: -8px
|
|
||||||
width: 100%
|
|
||||||
height: 10px
|
|
||||||
.blood-chart-element-footer
|
.blood-chart-element-footer
|
||||||
margin-top: 32px
|
margin-top: 32px
|
||||||
text-align: center
|
text-align: center
|
||||||
.blood-chart-amount
|
.blood-chart-amount
|
||||||
font-size: 24px
|
font-size: 24px
|
||||||
margin-bottom: 8px
|
margin-bottom: 8px
|
||||||
.blood-chart-coin
|
|
||||||
font-size: 16px
|
|
||||||
|
.swiper-slide
|
||||||
|
width: 80px
|
||||||
|
|
||||||
|
|
||||||
|
.blood-arrow
|
||||||
|
min-width: 30px
|
||||||
|
&.left, &.right
|
||||||
|
img
|
||||||
|
height: 50px
|
||||||
|
position: absolute
|
||||||
|
top: 50%
|
||||||
|
z-index: 0
|
||||||
|
&.right
|
||||||
|
img
|
||||||
|
right: -5px
|
||||||
|
&.left
|
||||||
|
img
|
||||||
|
left: -5px
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="connected-stake bloodline-border card"
|
||||||
|
:class="{ 'card--dense': dense }"
|
||||||
|
@click="
|
||||||
|
(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<div class="connected-stake-headline mid-mid-text" v-if="slots.headline">
|
||||||
|
<slot name="headline"></slot>
|
||||||
|
</div>
|
||||||
|
<div class="connected-stake-subheadline" v-if="slots.subheadline">
|
||||||
|
<slot name="subheadline"></slot>
|
||||||
|
</div>
|
||||||
|
<div class="connected-stake-body" v-if="slots.body">
|
||||||
|
<slot name="body"></slot>
|
||||||
|
</div>
|
||||||
|
<slot name="actions"></slot>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { useSlots } from "vue";
|
||||||
|
const slots = useSlots();
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
stakeonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
dense: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.card--dense
|
||||||
|
padding: 8px
|
||||||
|
.connected-stake
|
||||||
|
background-color: var(--darkgrey)
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
border: 2px solid var(--grey, #858585)
|
||||||
|
border-color: var(--grey, #858585)
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 8px 12px
|
||||||
|
&.connected-stake--variant1
|
||||||
|
background-color: transparent
|
||||||
|
border: none
|
||||||
|
padding: 16px 6px
|
||||||
|
.connected-stake-headline
|
||||||
|
text-align: center
|
||||||
|
.connected-stake-subheadline
|
||||||
|
text-align: center
|
||||||
|
.connected-stake-body
|
||||||
|
display: flex
|
||||||
|
text-align: left
|
||||||
|
gap: 16px
|
||||||
|
height: 56px
|
||||||
|
.token-logo
|
||||||
|
margin-left: auto
|
||||||
|
.connected-stake-buttons
|
||||||
|
display: flex
|
||||||
|
text-align: center
|
||||||
|
gap: 16px
|
||||||
|
justify-content: center
|
||||||
|
// div
|
||||||
|
// flex: 1 1 50%
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
<template>
|
||||||
|
<card-component>
|
||||||
|
<template v-slot:headline> Unclaimed </template>
|
||||||
|
<template v-slot:body>
|
||||||
|
<token-name-price
|
||||||
|
:name="tokenStore.getToken(walletStore.memeToken?.contractAddress)?.name"
|
||||||
|
:price="formatNumber(walletStore.unclaimedRewards)"
|
||||||
|
></token-name-price>
|
||||||
|
<token-logo img="/assets/img/token/bloodline.png" :alt="'bloodline logo'"></token-logo>
|
||||||
|
</template>
|
||||||
|
<template v-slot:actions>
|
||||||
|
<template v-if="walletStore.unclaimedRewards > 0">
|
||||||
|
<Transition name="smooth">
|
||||||
|
<div class="connected-stake-buttons" v-show="!stakeMenu">
|
||||||
|
<div class="btn btn-immortal mid-mid-text" @click="claimAll" v-if="stateStake === 0">Claim</div>
|
||||||
|
<div class="btn btn-immortal mid-mid-text" disabled v-else-if="stateStake === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-else-if="stateStake === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal mid-mid-text" @click="openStake">Stake</div>
|
||||||
|
</div>
|
||||||
|
</Transition>
|
||||||
|
<Transition name="smooth">
|
||||||
|
<stake-menu
|
||||||
|
v-model="tokenNumber"
|
||||||
|
@close="stakeMenu = false"
|
||||||
|
:amount="walletStore.unclaimedRewards"
|
||||||
|
:stake="stake"
|
||||||
|
v-if="stakeMenu"
|
||||||
|
>
|
||||||
|
<template v-slot:body>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateClaimComp === 0">
|
||||||
|
Enter Amount
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal stake-button"
|
||||||
|
v-else-if="stateClaimComp === 1"
|
||||||
|
@click="stakeAndClaimAllCycles"
|
||||||
|
>
|
||||||
|
Stake & Claim Rest
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateClaimComp === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateClaimComp === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn transparent small-text cancel-button text-center"
|
||||||
|
@click="stakeMenu = false"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-slot:message-end>
|
||||||
|
<div class="input-balance">
|
||||||
|
Balance:
|
||||||
|
{{ formatNumber(walletStore.unclaimedRewards) }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</stake-menu>
|
||||||
|
</Transition>
|
||||||
|
<div class="connected-stake-first-round small-text text-center">
|
||||||
|
You can claim, once the cycle is over.
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="btn btn-immortal mid-mid-text text-center" @click="router.push({ name: 'home' })">
|
||||||
|
Go to Sacrifice
|
||||||
|
</div>
|
||||||
|
<div class="small-text text-center">Sacrifice to earn $BLOOD</div>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</card-component>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed } from "vue";
|
||||||
|
import CardComponent from "@/components/CardComponent.vue";
|
||||||
|
import StakeMenu from "@/components/StakeMenu.vue";
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
import { waitForTransaction } from "@wagmi/core";
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
import StakeSuccessToast from "@/components/toasts/StakeSuccessToast.vue";
|
||||||
|
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
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();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
stakeonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const stakeMenu = ref(false);
|
||||||
|
const stake = ref(null);
|
||||||
|
const tokenNumber = ref(null);
|
||||||
|
/**
|
||||||
|
* state 0 enter amount
|
||||||
|
* state 1 rdy to go
|
||||||
|
* state 2 signing
|
||||||
|
* state 3 loading
|
||||||
|
* state 4 staked
|
||||||
|
*/
|
||||||
|
const state = ref(0);
|
||||||
|
const stateClaim = ref(0);
|
||||||
|
|
||||||
|
function openStake() {
|
||||||
|
stake.value = true;
|
||||||
|
stakeMenu.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stakeAndClaimAllCycles() {
|
||||||
|
try {
|
||||||
|
const unclaimedRewards = walletStore.memeToken?.unclaimedRewards / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
stateClaim.value = 2;
|
||||||
|
console.log("unclaimedRewards", unclaimedRewards);
|
||||||
|
const coefficient = BigInt(10000 * tokenNumber.value) / unclaimedRewards;
|
||||||
|
var hash = await rewardLockerStore.stakeAndClaimAllCycles(coefficient);
|
||||||
|
stateClaim.value = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
stateClaim.value = 4;
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xd0813ff03c470dcc7baa9ce36914dc2febdfd276d639deffaac383fd3db42ba3"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
//
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
//ClaimedReward (address staker, uint256 reward)
|
||||||
|
const outputClaim = BigInt(rewardData.topics[2]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim),
|
||||||
|
"Success!",
|
||||||
|
"You just claimed and staked",
|
||||||
|
"Join the next cycle to increase your rewards and win with your clan"
|
||||||
|
);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
stateClaim.value = 0;
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function claimAll() {
|
||||||
|
try {
|
||||||
|
state.value = 2;
|
||||||
|
const hash = await rewardLockerStore.claimAll();
|
||||||
|
state.value = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xd0813ff03c470dcc7baa9ce36914dc2febdfd276d639deffaac383fd3db42ba3"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
//
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
//ClaimedReward (address staker, uint256 reward)
|
||||||
|
const outputClaim = rewardData.topics[2] / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim),
|
||||||
|
"Success!",
|
||||||
|
"You just claimed",
|
||||||
|
"Join the next cycle to increase your rewards and win with your clan."
|
||||||
|
);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
state.value = 0;
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const stateStake = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
if (state.value === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (state.value === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
|
||||||
|
const stateClaimComp = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
console.log("tokenNumber.value", tokenNumber.value);
|
||||||
|
if (
|
||||||
|
tokenNumber.value === null ||
|
||||||
|
tokenNumber.value === "" ||
|
||||||
|
tokenNumber.value === 0 ||
|
||||||
|
tokenNumber.value > walletStore.memeToken?.unclaimedRewards
|
||||||
|
) {
|
||||||
|
returnState = 0;
|
||||||
|
} else if (stateClaim.value === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (stateClaim.value === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
} else if (tokenNumber.value !== null || tokenNumber.value !== "" || tokenNumber.value > 0) {
|
||||||
|
returnState = 1;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass"></style>
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
<template>
|
||||||
|
<div class="connect-wallet-wrapper">
|
||||||
|
<template v-if="!walletStore.connected">
|
||||||
|
<div class="connect-wallet-headline low-mid-text">Connect your wallet</div>
|
||||||
|
<div class="connectors-wrapper">
|
||||||
|
<div
|
||||||
|
class="connectors-element card"
|
||||||
|
:class="[[connector.id]]"
|
||||||
|
v-for="connector in walletStore.config?.connectors"
|
||||||
|
@click="connectWallet(connector)"
|
||||||
|
>
|
||||||
|
<div class="connector-icon">
|
||||||
|
<template v-if="connector.id === 'injected'">
|
||||||
|
<font-awesome-icon :icon="['fas', 'wallet']" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<img :src="`/assets/img/connectors/${connector.id}.svg`" :alt="`${connector.name} Logo`" />
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="connector-name">
|
||||||
|
<template
|
||||||
|
v-if="
|
||||||
|
connector.id !== 'metaMask' ||
|
||||||
|
(connector.id === 'metaMask' && isMetaMaskInstalled(connector))
|
||||||
|
"
|
||||||
|
>
|
||||||
|
{{ connector.name }}
|
||||||
|
</template>
|
||||||
|
<template v-else> Install {{ connector.name }} </template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>Are you coming from Binance, Bybit, Kucoin or any other crypto exchange?</div>
|
||||||
|
<div>Follow these instructions first.</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-else>
|
||||||
|
<div class="connected-header">
|
||||||
|
<div class="connected-header-avatar">
|
||||||
|
<img :src="getblocky(walletStore.address)" alt="avatar" />
|
||||||
|
</div>
|
||||||
|
<div class="connected-header-address">
|
||||||
|
{{ getAddressShortName(walletStore.address) }}
|
||||||
|
</div>
|
||||||
|
<div class="connected-header-logout" @click="disconnectWallet">
|
||||||
|
<font-awesome-icon :icon="['fas', 'fa-arrow-right-from-bracket']" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="connected-tokens-headline">Your Tokens</div>
|
||||||
|
<div class="connected-tokens">
|
||||||
|
<div class="connected-token" v-for="token in walletStore.token">
|
||||||
|
<token-name-price
|
||||||
|
:name="tokenStore.getToken(token.contractAddress).name"
|
||||||
|
:price="token.balanceOf / 10n ** tokenStore.getToken(token.contractAddress).decimals"
|
||||||
|
></token-name-price>
|
||||||
|
<div class="connected-token-button">
|
||||||
|
<div class="bloodline-badge grey" @click="badgeClick(token)">
|
||||||
|
<div
|
||||||
|
class="bloodline-badge-text"
|
||||||
|
v-if="tokenStore.memeToken.contractAddress === token.contractAddress"
|
||||||
|
>
|
||||||
|
Buy
|
||||||
|
</div>
|
||||||
|
<div v-else class="bloodline-badge-text">Sacrifice</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<token-logo :img="tokenStore.getToken(token.contractAddress).logo" :alt="'test'"></token-logo>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<stake-component-v1 :variant="3"></stake-component-v1>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, toRaw, onMounted, onUnmounted, getCurrentInstance } from "vue";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import TokenNamePrice from "./TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "./TokenLogo.vue";
|
||||||
|
import StakeComponentV1 from "@/components/StakeComponentV1.vue";
|
||||||
|
|
||||||
|
import { getAddressShortName, getblocky } from "@/helper/helper.js";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
|
import { disconnect } from "@wagmi/core";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
// const goerliKey = import.meta.env.VITE_GOERLI_KEY;
|
||||||
|
|
||||||
|
const instance = getCurrentInstance();
|
||||||
|
|
||||||
|
async function disconnectWallet() {
|
||||||
|
console.log("disconnectWallet");
|
||||||
|
try {
|
||||||
|
instance.parent.emit("update:modelValue", false);
|
||||||
|
await disconnect();
|
||||||
|
} catch (error) {
|
||||||
|
console.log("error", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMetaMaskInstalled(connector) {
|
||||||
|
const metamaskInstalled = connector?.options?.getProvider();
|
||||||
|
if (metamaskInstalled) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
if (tokenStore.memeToken.contractAddress === token.contractAddress) {
|
||||||
|
//buy
|
||||||
|
window.open(
|
||||||
|
`https://app.uniswap.org/swap?inputCurrency=ETH&outputCurrency=${token.contractAddress}&chain=goerli`,
|
||||||
|
"_blank"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
router.push({ name: "home" });
|
||||||
|
instance.parent.emit("update:modelValue", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//special case for metaMask, but I think that is the most used wallet
|
||||||
|
async function connectWallet(connector) {
|
||||||
|
if (connector.id === "metaMask" && !isMetaMaskInstalled(connector)) {
|
||||||
|
window.open(" https://metamask.io/", "_blank");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
instance.parent.emit("update:modelValue", false);
|
||||||
|
await walletStore.connectWallet(toRaw(connector));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.connect-wallet-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 24px
|
||||||
|
.connectors-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.connectors-element
|
||||||
|
display: flex
|
||||||
|
padding: 12px
|
||||||
|
border: 1px solid rgba(152, 161, 192, 0.24)
|
||||||
|
background: var(--grey, #858585)
|
||||||
|
color: var(--midnight-black, #0F0F0F)
|
||||||
|
&:hover, &:active, &:focus
|
||||||
|
background-color: lighten(#858585, 20%)
|
||||||
|
cursor: pointer
|
||||||
|
&.injected
|
||||||
|
.connector-icon
|
||||||
|
background-color: white
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
align-items: center
|
||||||
|
svg
|
||||||
|
font-size: 25px
|
||||||
|
.connector-icon
|
||||||
|
border-radius: 12px
|
||||||
|
width: 40px
|
||||||
|
overflow: hidden
|
||||||
|
height: 40px
|
||||||
|
.connector-name
|
||||||
|
padding: 0 8px
|
||||||
|
align-self: center
|
||||||
|
font-size: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 18px
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.connected-header
|
||||||
|
margin-bottom: 24px
|
||||||
|
display: flex
|
||||||
|
gap: 16px
|
||||||
|
align-items: center
|
||||||
|
.connected-header-avatar
|
||||||
|
img
|
||||||
|
border-radius: 8px
|
||||||
|
.connected-header-logout
|
||||||
|
margin-left: auto
|
||||||
|
&:hover, &:active, &:focus
|
||||||
|
cursor: pointer
|
||||||
|
svg
|
||||||
|
font-size: 25px
|
||||||
|
|
||||||
|
.connected-tokens-headline
|
||||||
|
font-size: 18px
|
||||||
|
margin-bottom: 16px
|
||||||
|
.connected-tokens
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
margin-bottom: 24px
|
||||||
|
.connected-token
|
||||||
|
display: flex
|
||||||
|
gap: 16px
|
||||||
|
align-items: center
|
||||||
|
height: 56px
|
||||||
|
.connected-token-button
|
||||||
|
margin-left: auto
|
||||||
|
.bloodline-badge
|
||||||
|
padding: 4px 16px
|
||||||
|
color: black
|
||||||
|
font-size: 14px
|
||||||
|
&:hover, &:active, &:focus
|
||||||
|
cursor: pointer
|
||||||
|
background-color: var(--grey-light)
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<template>
|
||||||
|
<div class="loading-container">
|
||||||
|
<div class="blood"></div>
|
||||||
|
<div class="blood"></div>
|
||||||
|
<div class="blood"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.loading-container
|
||||||
|
display: flex
|
||||||
|
align-items: center
|
||||||
|
justify-content: center
|
||||||
|
gap: 10px
|
||||||
|
|
||||||
|
.blood
|
||||||
|
width: 15px
|
||||||
|
height: 15px
|
||||||
|
border: 1px solid black
|
||||||
|
border-radius: 0% 100% 100% 100%
|
||||||
|
transform: rotate(45deg)
|
||||||
|
animation: blink 1s infinite
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: 20px
|
||||||
|
height: 20px
|
||||||
|
|
||||||
|
.blood
|
||||||
|
&:nth-child(1)
|
||||||
|
animation-delay: -.2s
|
||||||
|
|
||||||
|
&:nth-child(2)
|
||||||
|
animation-delay: 0.2s
|
||||||
|
|
||||||
|
&:nth-child(3)
|
||||||
|
animation-delay: 0.5s
|
||||||
|
|
||||||
|
@keyframes blink
|
||||||
|
0%
|
||||||
|
background-color: transparent
|
||||||
|
|
||||||
|
50%
|
||||||
|
background-color: red
|
||||||
|
</style>
|
||||||
@@ -1,10 +1,67 @@
|
|||||||
|
<template>
|
||||||
|
<div class="navbar" :class="{ 'navbar--hidden': !showNavbar }">
|
||||||
|
<div class="navbar-inner">
|
||||||
|
<div class="navbar-icon">
|
||||||
|
<router-link to="/">
|
||||||
|
<img alt="logo" class="logo" src="/assets/img/vampir.png" />
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-text">
|
||||||
|
<router-link to="/">Bloodline</router-link>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-center" v-if="!isMobile"></div>
|
||||||
|
<div class="navbar-end">
|
||||||
|
<div class="navbar-navigation mid-text" v-if="!isMobile">
|
||||||
|
<div
|
||||||
|
class="navbar-navigation-link"
|
||||||
|
v-for="link in links"
|
||||||
|
:key="link.name"
|
||||||
|
:class="{ active: link.name === route.name }"
|
||||||
|
@click="router.push(link.path)"
|
||||||
|
>
|
||||||
|
<div class="icon">
|
||||||
|
<img :src="link.icon" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="text">{{ link.title }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!isMobile">
|
||||||
|
<div v-if="!address" class="btn btn-immortal mid-text" @click="showPanel = true">Connect</div>
|
||||||
|
<div class="login-icon-desktop mid-text" v-else @click="showPanel = true">
|
||||||
|
<img :src="getblocky(address)" alt="avatar" />
|
||||||
|
<div>{{ getAddressShortName(walletStore.address) }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else @click="showPanel = true">
|
||||||
|
<div class="login-icon" v-if="!address">
|
||||||
|
<font-awesome-icon :icon="['fas', 'fa-arrow-right-to-bracket']" />
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<img :src="getblocky(address)" alt="avatar" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { ref, onMounted, onBeforeUnmount } from "vue";
|
import { ref, onMounted, onBeforeUnmount, inject } from "vue";
|
||||||
import { useWalletStore } from "@/stores/wallet";
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
const walletStore = useWalletStore();
|
import { getblocky, getAddressShortName } from "@/helper/helper.js";
|
||||||
const { connected, address } = storeToRefs(walletStore);
|
|
||||||
|
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const emit = defineEmits(["showPanel"]);
|
||||||
|
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const { address } = storeToRefs(walletStore);
|
||||||
|
const isMobile = inject("isMobile");
|
||||||
|
const showPanel = inject("showPanel");
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
const showNavbar = ref(true);
|
const showNavbar = ref(true);
|
||||||
const lastScrollPosition = ref(0);
|
const lastScrollPosition = ref(0);
|
||||||
|
|
||||||
@@ -17,6 +74,27 @@ function onScroll() {
|
|||||||
lastScrollPosition.value = currentScrollPosition;
|
lastScrollPosition.value = currentScrollPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const links = [
|
||||||
|
{
|
||||||
|
title: "Sacrifice",
|
||||||
|
name: "home",
|
||||||
|
path: "/",
|
||||||
|
icon: "/assets/img/sacrifice-icon.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Cycle",
|
||||||
|
name: "cycle",
|
||||||
|
path: "/cycle",
|
||||||
|
icon: "/assets/img/cycle-icon.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Profile",
|
||||||
|
name: "profile",
|
||||||
|
path: "/profile",
|
||||||
|
icon: "/assets/img/profile-icon.png",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.addEventListener("scroll", onScroll);
|
window.addEventListener("scroll", onScroll);
|
||||||
});
|
});
|
||||||
@@ -26,89 +104,97 @@ onBeforeUnmount(() => {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
|
||||||
<header>
|
|
||||||
<div class="navbar" :class="{ 'navbar--hidden': !showNavbar }">
|
|
||||||
<div class="navbar-inner">
|
|
||||||
<div class="navbar-icon">
|
|
||||||
<router-link to="/">
|
|
||||||
<!-- <img alt="Parry logo" class="logo" src="@/assets/img/logo.svg" /> -->
|
|
||||||
<img alt="logo" class="logo" src="@/assets/img/vampir.png" />
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-text">Bloodline</div>
|
|
||||||
<div class="navbar-center">
|
|
||||||
<div class="navbar-social-links">
|
|
||||||
<div class="social-bloodline-badge">
|
|
||||||
<div class="social-bloodline-badge-icon">
|
|
||||||
<font-awesome-icon icon="fa-brands fa-discord" />
|
|
||||||
</div>
|
|
||||||
<div class="social-bloodline-badge-text">Discord</div>
|
|
||||||
</div>
|
|
||||||
<div class="social-bloodline-badge">
|
|
||||||
<div class="social-bloodline-badge-icon">
|
|
||||||
<font-awesome-icon icon="fa-brands fa-telegram" />
|
|
||||||
</div>
|
|
||||||
<div class="social-bloodline-badge-text">Telegram</div>
|
|
||||||
</div>
|
|
||||||
<div class="social-bloodline-badge">
|
|
||||||
<div class="social-bloodline-badge-icon">
|
|
||||||
<font-awesome-icon icon="fa-brands fa-twitter" />
|
|
||||||
</div>
|
|
||||||
<div class="social-bloodline-badge-text">Twitter</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-end">
|
|
||||||
<div v-if="!connected" class="btn btn-immortal" @click="walletStore.connectWallet">connect</div>
|
|
||||||
<span v-else> {{ address }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="sass" scoped>
|
<style lang="sass" scoped>
|
||||||
header
|
.navbar
|
||||||
.navbar
|
position: fixed
|
||||||
position: fixed
|
z-index: 3
|
||||||
z-index: 3
|
box-sizing: border-box
|
||||||
|
background-color: #202020
|
||||||
|
width: 100%
|
||||||
|
transform: translate3d(0,0,0)
|
||||||
|
transition: transform .3s ease,visibility 0s .3s linear
|
||||||
|
height: 82px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 80px
|
||||||
|
// &.navbar--hidden
|
||||||
|
// transform: translate3d(0,-100%,0)
|
||||||
|
.navbar-inner
|
||||||
|
display: flex
|
||||||
|
padding: 16px 24px
|
||||||
box-sizing: border-box
|
box-sizing: border-box
|
||||||
background-color: #202020
|
height: 100%
|
||||||
width: 100%
|
align-items: center
|
||||||
transform: translate3d(0,0,0)
|
@media (min-width: 992px)
|
||||||
transition: transform .3s ease,visibility 0s .3s linear
|
|
||||||
height: 128px
|
|
||||||
&.navbar--hidden
|
|
||||||
transform: translate3d(0,-100%,0)
|
|
||||||
.navbar-inner
|
|
||||||
display: flex
|
|
||||||
padding: 16px 24px
|
padding: 16px 24px
|
||||||
box-sizing: border-box
|
.navbar-icon
|
||||||
height: 100%
|
img
|
||||||
align-items: center
|
height: 50px
|
||||||
|
width: 50px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 56px
|
||||||
|
width: 56px
|
||||||
|
|
||||||
|
.navbar-text
|
||||||
|
font-family: 'Vampire', sans-serif
|
||||||
|
font-size: 36px
|
||||||
|
margin-left: 16px
|
||||||
|
letter-spacing: 0.138em
|
||||||
|
line-height: 73.107px
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
padding: 16px 24px
|
font-size: 42px
|
||||||
.navbar-text
|
a
|
||||||
font-family: 'Vampire', sans-serif
|
text-decoration: none
|
||||||
font-size: 64px
|
color: white
|
||||||
letter-spacing: 0.138em
|
.navbar-center
|
||||||
.navbar-center
|
display: flex
|
||||||
|
.navbar-end
|
||||||
|
display: flex
|
||||||
|
margin-left: auto
|
||||||
|
gap: 80px
|
||||||
|
.navbar-navigation
|
||||||
display: flex
|
display: flex
|
||||||
margin-left: auto
|
align-items: center
|
||||||
.navbar-social-links
|
gap: 48px
|
||||||
|
.navbar-navigation-link
|
||||||
display: flex
|
display: flex
|
||||||
gap: 18px
|
gap: 8px
|
||||||
.social-bloodline-badge
|
border-bottom: 2px solid transparent
|
||||||
font-size: 16px
|
&.active
|
||||||
padding: 8px 16px 8px 16px
|
border-bottom: 2px solid white
|
||||||
border-radius: 14px
|
&:active, &:hover, &:focus
|
||||||
background-color: #0F0F0F
|
cursor: pointer
|
||||||
display: flex
|
.icon
|
||||||
.social-bloodline-badge-icon
|
img
|
||||||
margin-right: 8px
|
width: 20px
|
||||||
.navbar-end
|
height: 20px
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.login-icon
|
||||||
|
color: var(--white)
|
||||||
|
background-color: var(--purple)
|
||||||
|
padding: 8px
|
||||||
|
font-size: 25px
|
||||||
|
border-radius: 8px
|
||||||
|
width: 44px
|
||||||
|
height: 44px
|
||||||
display: flex
|
display: flex
|
||||||
flex: 0 0 200px
|
justify-content: center
|
||||||
justify-content: flex-end
|
align-items: center
|
||||||
|
img
|
||||||
|
width: 32px
|
||||||
|
height: 32px
|
||||||
|
border-radius: 8px
|
||||||
|
.login-icon-desktop
|
||||||
|
display: flex
|
||||||
|
padding: 8px
|
||||||
|
align-items: center
|
||||||
|
gap: 16px
|
||||||
|
border-radius: 16px
|
||||||
|
background: var(--Background-grey, #2D2D2D)
|
||||||
|
&:hover,&:active,&:focus
|
||||||
|
cursor: pointer
|
||||||
|
img
|
||||||
|
width: 32px
|
||||||
|
height: 32px
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<template>
|
||||||
|
<div class="rewards-wrapper">
|
||||||
|
<div class="rewards-headline low-mid-text">
|
||||||
|
{{ props.title }}
|
||||||
|
</div>
|
||||||
|
<div class="rewards-inner">
|
||||||
|
<token-name-price name="$BLOOD" :price="props.amount"></token-name-price>
|
||||||
|
<token-logo :img="props.image" :alt="'vampire'"></token-logo>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
title: String,
|
||||||
|
info: String,
|
||||||
|
amount: [String, Number],
|
||||||
|
image: String,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.rewards-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
padding: 6px 0
|
||||||
|
.rewards-inner
|
||||||
|
display: flex
|
||||||
|
padding: 0 6px 6px 6px
|
||||||
|
border-bottom: 1px solid var(--grey, #858585)
|
||||||
|
justify-content: space-between
|
||||||
|
height: 56px
|
||||||
|
box-sizing: content-box
|
||||||
|
</style>
|
||||||
@@ -1,216 +1,546 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="sacrifice-wrapper card bloodline-wrapper">
|
<div class="sacrifice-wrapper card card--glow">
|
||||||
{{ activeToken.allowance }}
|
<div class="sacrifice-headline">Select Sacrifice {{ splashBlood }}</div>
|
||||||
<div class="sacrifice-headline">Select Token</div>
|
|
||||||
<div class="sacrifice-select-tokens">
|
<div class="sacrifice-select-tokens">
|
||||||
<div class="sacrifice-tokens">
|
<div class="sacrifice-tokens">
|
||||||
<div
|
<div
|
||||||
class="sacrifice-token"
|
class="sacrifice-token"
|
||||||
:class="[{ 'sacrifice-token--active': token.contractAddress === activeToken.contractAddress }]"
|
:class="[
|
||||||
|
{
|
||||||
|
'sacrifice-token--active': token.contractAddress === activeToken.contractAddress,
|
||||||
|
'bloodline-border': token.contractAddress === activeToken.contractAddress,
|
||||||
|
'bloodline-border--variant1': token.contractAddress === activeToken.contractAddress,
|
||||||
|
},
|
||||||
|
]"
|
||||||
v-for="token in props.data"
|
v-for="token in props.data"
|
||||||
:key="token.contractAddress"
|
:key="token.contractAddress"
|
||||||
@click="tokenStore.changeActiveToken(token)"
|
@click="changeActiveToken(token)"
|
||||||
>
|
>
|
||||||
{{ token.name }}
|
<div class="sacrifice-token-logo">
|
||||||
|
<img v-if="isMobile" :src="token.logoMobile" alt="token logo" />
|
||||||
|
<img v-if="!isMobile" :src="token.logo" alt="token logo" />
|
||||||
|
</div>
|
||||||
|
<div class="sacrifice-token-name mid-text">{{ token.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-from-to-wrapper" v-if="activeToken.contractAddress">
|
<div class="sacrifice-from-to-wrapper" v-if="activeToken.contractAddress">
|
||||||
<div class="sacrifice-from-wrapper bloodline-border">
|
<div class="sacrifice-from-wrapper bloodline-border bloodline-border--variant1 purple">
|
||||||
<div class="sarcrifice-from-input">
|
<token-input
|
||||||
<input @input="processChange" type="number" v-model="tokenNumber" :placeholder="0" /><img
|
:modelValue="sacrificeStore.sacrificeNumber / 10n ** activeToken.decimals"
|
||||||
src="@/assets/img/vampir.png"
|
@input="
|
||||||
alt="vampir"
|
($event) => {
|
||||||
/>
|
const value = BigInt($event.target.value) * 10n ** 18n;
|
||||||
</div>
|
sacrificeStore.sacrificeNumber = value;
|
||||||
<div class="value-adder">
|
processChange(value);
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(1000000)">+1m</div>
|
}
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(10000000)">+10m</div>
|
"
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(100000000)">+100m</div>
|
:max="activeWalletToken?.balanceOf"
|
||||||
<div class="sacrifice-adder-balance">Balance: {{ parseFloat(activeToken.balance) }}</div>
|
:logo="activeToken.logo"
|
||||||
<div class="sacrifice-adder-max" @click="tokenNumber = parseFloat(activeToken.balance)">Max</div>
|
>
|
||||||
</div>
|
<template v-slot:message>
|
||||||
|
<div
|
||||||
|
class="sacrifice-adder-step bloodline-badge"
|
||||||
|
v-for="steps in activeToken.addSteps"
|
||||||
|
:key="steps.name"
|
||||||
|
@click="addTokens(steps.amount)"
|
||||||
|
>
|
||||||
|
<template
|
||||||
|
v-if="
|
||||||
|
!walletStore.connected ||
|
||||||
|
sacrificeStore.sacrificeNumber < activeWalletToken?.balanceOf
|
||||||
|
"
|
||||||
|
>
|
||||||
|
+{{ steps.name }}
|
||||||
|
</template>
|
||||||
|
<template v-else> -{{ steps.name }} </template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-slot:message-end v-if="activeWalletToken?.balanceOf">
|
||||||
|
<div class="input-balance tiny-text">
|
||||||
|
Balance:
|
||||||
|
{{ BigInt(activeWalletToken?.balanceOf) / 10n ** activeToken.decimals }}
|
||||||
|
</div>
|
||||||
|
<div class="input-max tiny-text" @click="addMaxTokens">Max</div>
|
||||||
|
</template>
|
||||||
|
</token-input>
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-divider bloodline-devider">
|
<div class="bloodline-devider">
|
||||||
<font-awesome-icon :icon="['fas', 'arrow-down']" />
|
<font-awesome-icon :icon="['fas', 'arrow-down']" />
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-to-wrapper bloodline-border">
|
<div
|
||||||
<div class="sarcrifice-from-input">
|
:class="{
|
||||||
<div class="sacrifice-to-output">
|
'sacrifice-to-wrapper': true,
|
||||||
<div class="sacrifice-to-output-coin">{{ activeToken.name }}</div>
|
'bloodline-border': true,
|
||||||
<div class="sacrifice-to-output-rewards">{{ output }}</div>
|
'bloodline-border--variant1': true,
|
||||||
|
purple: output && output > 0,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div class="sacrifice-to-body">
|
||||||
|
<token-name-price name="$BLOOD" :price="`≈${formatNumber(output)}`"></token-name-price>
|
||||||
|
<token-logo :img="activeToken.vamp.logo" :size="64" :alt="activeToken.vamp.name"></token-logo>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="sacrifice-staking-bonus">
|
||||||
|
<div
|
||||||
|
class="sacrifice-staking-bonus-inner"
|
||||||
|
@click="
|
||||||
|
(e) => {
|
||||||
|
showStakingMenu = !showStakingMenu;
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<div class="mid-mid-text" v-if="!walletStore.connected">+ Staking Bonus</div>
|
||||||
|
<div
|
||||||
|
class="mid-mid-text"
|
||||||
|
v-else-if="walletStore.memeToken?.staked === 0 || cycleStore.currentCycle === 1"
|
||||||
|
>
|
||||||
|
No Staking Bonus
|
||||||
|
</div>
|
||||||
|
<div class="mid-mid-text" v-else>+ {{ stakingOutput }} Staking Bonus</div>
|
||||||
|
<div class="icon">
|
||||||
|
<font-awesome-icon icon="chevron-down" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img src="@/assets/img/vampir.png" alt="vampir" />
|
<stake-component-v1 :variant="1" v-if="showStakingMenu">
|
||||||
|
<template v-slot:headline> {{ null }}</template>
|
||||||
|
</stake-component-v1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-fees-info-wrapper">
|
<div class="sacrificed-info" v-if="stateComputed === 4">
|
||||||
<div class="sacrifice-fees-img">
|
<div class="left low-mid-text">You can claim your $BLOOD when the cycle is finished.</div>
|
||||||
<img src="@/assets/img/fuel-noozle.png" alt="fuel noozle" />
|
<div class="right">
|
||||||
</div>
|
<img src="/assets/img/moon.png" alt="moon" />
|
||||||
<div class="sacrifice-fees-body">
|
|
||||||
<div class="sacrifice-fees-body-header">
|
|
||||||
<div class="sacrifice-fees-body-header-title">Gas Support</div>
|
|
||||||
<div class="sacrifice-fees-body-header-amount">42Gwei</div>
|
|
||||||
</div>
|
|
||||||
<div class="sacrifice-fees-body-subheader">Increase amount to pay 97% less network fees.</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-buttons-function-wrapper">
|
<div class="sacrifice-buttons-function-wrapper">
|
||||||
<div v-if="connected">
|
<template v-if="walletStore.connected">
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-if="stateComputed === 0">Enter Amount</div>
|
||||||
<div
|
<div
|
||||||
class="btn btn-immortal"
|
class="btn btn-immortal sub-header"
|
||||||
v-if="activeToken.allowance > 0 && activeToken.allowance >= tokenNumber"
|
disabled
|
||||||
@click="approvalData = tokenStore.sacrificeToken(1)"
|
v-else-if="sacrificeStore.sacrificeNumber > activeWalletToken?.balanceOf"
|
||||||
>
|
>
|
||||||
<font-awesome-icon v-if="loading" icon="spinner" spin />
|
Insufficient Balance
|
||||||
Sacrifce {{ activeToken.name }}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="btn btn-immortal" v-else @click="approvalData = tokenStore.approveToken(1)">
|
<div
|
||||||
Approve {{ activeToken.name }}
|
class="btn btn-immortal sub-header"
|
||||||
|
v-else-if="
|
||||||
|
activeToken.allowance > 0 &&
|
||||||
|
activeToken.allowance >= sacrificeStore.sacrificeNumber &&
|
||||||
|
(stateComputed === 1 || stateComputed === 4)
|
||||||
|
"
|
||||||
|
@click="sacrificeToken"
|
||||||
|
>
|
||||||
|
Sacrifice 🩸
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div
|
||||||
<div v-else>
|
class="btn btn-immortal sub-header"
|
||||||
<div class="btn btn-immortal" @click="walletStore.connectWallet">Connect</div>
|
v-else-if="
|
||||||
</div>
|
(!activeToken.allowance || activeToken.allowance < sacrificeStore.sacrificeNumber) &&
|
||||||
|
(stateComputed === 1 || stateComputed === 4)
|
||||||
|
"
|
||||||
|
@click="approveToken(sacrificeStore.sacrificeNumber)"
|
||||||
|
>
|
||||||
|
Approve Token
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-else-if="stateComputed === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-else-if="stateComputed === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="btn btn-immortal sub-header" @click="showPanel = true">Connect</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, defineProps, watch } from "vue";
|
import { ref, defineProps, watch, inject, nextTick, onMounted, onBeforeUnmount, computed, markRaw } from "vue";
|
||||||
import { useWalletStore } from "@/stores/wallet";
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
import { useTokenStore } from "@/stores/tokens";
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { useUniswapStore } from "@/stores/uniswap";
|
||||||
|
import { useSacrificeStore } from "@/stores/sacrifice";
|
||||||
|
import StakeComponentV1 from "@/components/StakeComponentV1.vue";
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
import TokenInput from "@/components/TokenInput.vue";
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
import ApprovedToast from "@/components/toasts/ApprovedToast.vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import Helper from "@/utils/helper.js";
|
import { waitForTransaction, readContract, watchBlockNumber, multicall } from "@wagmi/core";
|
||||||
|
|
||||||
const walletStore = useWalletStore();
|
const cycleStore = useCycleStore();
|
||||||
const { contract, connected } = storeToRefs(walletStore);
|
const sacrificeStore = useSacrificeStore();
|
||||||
|
const toast = useToast();
|
||||||
|
|
||||||
|
import { debounce, formatNumber } from "@/helper/helper.js";
|
||||||
|
|
||||||
|
const isMobile = inject("isMobile");
|
||||||
|
const showPanel = inject("showPanel");
|
||||||
|
const splashBlood = inject("splashBlood");
|
||||||
|
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
|
||||||
const tokenStore = useTokenStore();
|
const tokenStore = useTokenStore();
|
||||||
const { activeToken, loading } = storeToRefs(tokenStore);
|
const { activeToken } = storeToRefs(tokenStore);
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: Array,
|
data: Array,
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
|
||||||
activeToken,
|
|
||||||
() => {
|
|
||||||
tokenNumber.value = null;
|
|
||||||
},
|
|
||||||
{ deep: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
const tokenNumber = ref(0);
|
|
||||||
const output = ref(0);
|
const output = ref(0);
|
||||||
|
const stakingOutput = ref(null);
|
||||||
|
const blockEvent = ref(null);
|
||||||
|
const approveToast = ref(null);
|
||||||
|
const addOperator = ref(true);
|
||||||
|
const splashesUsed = ref([]);
|
||||||
|
/**
|
||||||
|
* state 0 enter amount
|
||||||
|
* state 1 rdy to go
|
||||||
|
* state 2 signing
|
||||||
|
* state 3 loading
|
||||||
|
* state 4 sacrificed
|
||||||
|
*/
|
||||||
|
const showStakingMenu = ref(false);
|
||||||
const approvalData = ref(null);
|
const approvalData = ref(null);
|
||||||
|
|
||||||
const processChange = Helper.debounce((e) => test(e));
|
const activeWalletToken = computed(() => {
|
||||||
|
let returnedObject = {};
|
||||||
|
if (activeToken.value.contractAddress) {
|
||||||
|
returnedObject = walletStore.token.find((obj) => obj.contractAddress === activeToken.value.contractAddress);
|
||||||
|
}
|
||||||
|
return returnedObject;
|
||||||
|
});
|
||||||
|
|
||||||
async function test(e) {
|
const stateComputed = computed(() => {
|
||||||
console.log("hier", e);
|
let returnState = 0;
|
||||||
output.value = await tokenStore.getRewardsFor(parseInt(e.target.value));
|
if (
|
||||||
|
sacrificeStore.sacrificeNumber === null ||
|
||||||
|
sacrificeStore.sacrificeNumber === "" ||
|
||||||
|
sacrificeStore.sacrificeNumber === 0n
|
||||||
|
) {
|
||||||
|
returnState = 0;
|
||||||
|
} else if (sacrificeStore.sacrificeState === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (sacrificeStore.sacrificeState === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
} else if (
|
||||||
|
sacrificeStore.sacrificeNumber !== null ||
|
||||||
|
sacrificeStore.sacrificeNumber !== "" ||
|
||||||
|
sacrificeStore.sacrificeNumber > 0
|
||||||
|
) {
|
||||||
|
returnState = 1;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
const processChange = debounce(async (value) => {
|
||||||
|
const rewardValue = await sacrificeStore.getRewardsFor(value, activeToken.value);
|
||||||
|
output.value = rewardValue.output;
|
||||||
|
stakingOutput.value = rewardValue.staking;
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
blockEvent.value = watchBlockNumber(
|
||||||
|
{
|
||||||
|
listen: true,
|
||||||
|
},
|
||||||
|
async (blockNumber) => {
|
||||||
|
console.log("blockNumber", blockNumber);
|
||||||
|
var rewardValue = await sacrificeStore.getRewardsFor(sacrificeStore.sacrificeNumber, activeToken.value);
|
||||||
|
output.value = rewardValue.output;
|
||||||
|
stakingOutput.value = rewardValue.staking;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
console.log("blockEventunwatch", blockEvent.value);
|
||||||
|
blockEvent.value();
|
||||||
|
});
|
||||||
|
|
||||||
|
async function approveToken(amount) {
|
||||||
|
try {
|
||||||
|
console.log("amount", amount);
|
||||||
|
sacrificeStore.sacrificeState = 2;
|
||||||
|
const hash = await tokenStore.approveToken(amount);
|
||||||
|
sacrificeStore.sacrificeState = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
console.log("data", data);
|
||||||
|
activeToken.value.allowance = await tokenStore.allowance();
|
||||||
|
sacrificeStore.sacrificeState = 1;
|
||||||
|
approveToast.value = showApprovedToast();
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
sacrificeStore.sacrificeState = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function addTokens(value) {
|
|
||||||
tokenNumber.value = tokenNumber.value + value;
|
async function addTokens(value) {
|
||||||
|
if (!walletStore.connected || sacrificeStore.sacrificeNumber < activeWalletToken.value?.balanceOf) {
|
||||||
|
sacrificeStore.sacrificeNumber = BigInt(sacrificeStore.sacrificeNumber) + value;
|
||||||
|
} else {
|
||||||
|
sacrificeStore.sacrificeNumber = sacrificeStore.sacrificeNumber - value;
|
||||||
|
if (sacrificeStore.sacrificeNumber < 0n) {
|
||||||
|
sacrificeStore.sacrificeNumber = 0n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rewardValue = await sacrificeStore.getRewardsFor(sacrificeStore.sacrificeNumber, activeToken.value);
|
||||||
|
output.value = rewardValue.output;
|
||||||
|
stakingOutput.value = rewardValue.staking;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function addMaxTokens() {
|
||||||
|
addOperator.value = !addOperator.value;
|
||||||
|
sacrificeStore.sacrificeNumber = activeWalletToken.value?.balanceOf;
|
||||||
|
const rewardValue = await sacrificeStore.getRewardsFor(sacrificeStore.sacrificeNumber, activeToken.value);
|
||||||
|
console.log("rewardValue", rewardValue);
|
||||||
|
output.value = rewardValue.output;
|
||||||
|
stakingOutput.value = rewardValue.staking;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showApprovedToast(value, header, subheader, info) {
|
||||||
|
// Define the content object with the component, props and listeners
|
||||||
|
const content = {
|
||||||
|
component: ApprovedToast,
|
||||||
|
// Any prop can be passed, but don't expect them to be reactive
|
||||||
|
props: {
|
||||||
|
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: {
|
||||||
|
sacrificed: showSplash,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Render the toast and its contents
|
||||||
|
return toast(content, {
|
||||||
|
position: "top-right",
|
||||||
|
icon: false,
|
||||||
|
closeOnClick: false,
|
||||||
|
// toastClassName: "modal-overlay",
|
||||||
|
hideProgressBar: true,
|
||||||
|
timeout: false,
|
||||||
|
toastClassName: "approve-toast toast-card",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSplash() {
|
||||||
|
splashBlood.value++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//call function in the store and remove icon,
|
||||||
|
async function sacrificeToken() {
|
||||||
|
var result = await sacrificeStore.sacrificeToken(sacrificeStore.sacrificeNumber, activeToken.value);
|
||||||
|
if (result) {
|
||||||
|
showSplash();
|
||||||
|
}
|
||||||
|
toast.dismiss(approveToast.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function changeActiveToken(token) {
|
||||||
|
console.log("changeActiveToken");
|
||||||
|
tokenStore.activeToken = token;
|
||||||
|
if (walletStore.connected) {
|
||||||
|
// //TODO, wenn connected, dann all diese Daten laden?
|
||||||
|
// tokenStore.activeToken.balance = await walletStore.getTokenBalance(token);
|
||||||
|
tokenStore.activeToken.allowance = Number(await tokenStore.allowance());
|
||||||
|
}
|
||||||
|
var rewards = await sacrificeStore.getRewardsFor(sacrificeStore.sacrificeNumber, token);
|
||||||
|
console.log("rewards", rewards);
|
||||||
|
output.value = rewards.output;
|
||||||
|
stakingOutput.value = rewards.staking;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
|
|
||||||
.sacrifice-wrapper
|
.sacrifice-wrapper
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
margin-left: auto
|
margin-left: auto
|
||||||
margin-right: auto
|
margin-right: auto
|
||||||
background-color: var(--primary)
|
background-color: var(--primary)
|
||||||
|
padding: 24px
|
||||||
|
align-items: center
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 48px 64px
|
||||||
.sacrifice-headline
|
.sacrifice-headline
|
||||||
text-align: center
|
text-align: center
|
||||||
font-size: 36px
|
font-size: 24px
|
||||||
|
margin-bottom: 32px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 32px
|
||||||
.sacrifice-select-tokens
|
.sacrifice-select-tokens
|
||||||
padding: 24px
|
|
||||||
display: flex
|
display: flex
|
||||||
margin-bottom: 32px
|
margin-bottom: 32px
|
||||||
|
width: 100%
|
||||||
.sacrifice-tokens
|
.sacrifice-tokens
|
||||||
display: flex
|
display: flex
|
||||||
width: 100%
|
width: 100%
|
||||||
justify-content: space-evenly
|
justify-content: space-between
|
||||||
|
flex-wrap: wrap
|
||||||
|
gap: 12px
|
||||||
|
|
||||||
.sacrifice-token
|
.sacrifice-token
|
||||||
width: 132px
|
|
||||||
height: 132px
|
|
||||||
border-radius: 16px
|
border-radius: 16px
|
||||||
padding: 12px
|
padding: 9px
|
||||||
border: 1px solid lightgrey
|
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
background-color: var(--tertiary)
|
background-color: #0F0F0F
|
||||||
&:hover,
|
text-align: center
|
||||||
&:active,
|
user-select: none
|
||||||
&:focus
|
border: 4px solid transparent
|
||||||
background-color: var(--tertiary-dark)
|
.sacrifice-token-logo
|
||||||
|
pointer-events: none
|
||||||
|
@media (min-width: 992px)
|
||||||
|
img
|
||||||
|
height: 100px
|
||||||
|
width: 100px
|
||||||
|
// padding: 0
|
||||||
|
// background-color: unset
|
||||||
&.sacrifice-token--active
|
&.sacrifice-token--active
|
||||||
background-color: var(--tertiary-dark)
|
border-color: var(--purple)
|
||||||
|
|
||||||
|
.sacrifice-token-name
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 5px 26px
|
||||||
|
|
||||||
.sacrifice-buttons-function-wrapper
|
.sacrifice-buttons-function-wrapper
|
||||||
text-align: center
|
text-align: center
|
||||||
display: flex
|
|
||||||
justify-content: center
|
justify-content: center
|
||||||
margin-top: 24px
|
display: block
|
||||||
|
@media (min-width: 992px)
|
||||||
|
display: flex
|
||||||
.btn
|
.btn
|
||||||
padding: 16px 64px
|
padding: 12px 48px
|
||||||
.sacrifice-fees-info-wrapper
|
.sacrifice-fees-info-wrapper
|
||||||
display: flex
|
display: flex
|
||||||
border: 2px dashed var(--grey)
|
border: 1px dashed var(--grey)
|
||||||
|
color: var(--grey)
|
||||||
border-radius: 16px
|
border-radius: 16px
|
||||||
padding: 16px 24px
|
padding: 12px
|
||||||
margin-top: 24px
|
gap: 12px
|
||||||
.sacrifice-fees-img
|
.sacrifice-fees-img
|
||||||
flex: 0 0 15%
|
img
|
||||||
|
height: 46px
|
||||||
.sacrifice-fees-body
|
.sacrifice-fees-body
|
||||||
flex: 1 1 auto
|
flex: 1 1 auto
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: space-between
|
||||||
.sacrifice-fees-body-header
|
.sacrifice-fees-body-header
|
||||||
font-size: 24px
|
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: row
|
flex-direction: row
|
||||||
justify-content: space-between
|
justify-content: space-between
|
||||||
|
margin-bottom: 8px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
margin-bottom: 0
|
||||||
|
|
||||||
.sacrifice-from-to-wrapper
|
.sacrifice-from-to-wrapper
|
||||||
.sacrifice-from-wrapper,.sacrifice-to-wrapper
|
display: flex
|
||||||
.sarcrifice-from-input
|
flex-direction: column
|
||||||
display: flex
|
gap: 16px
|
||||||
margin-bottom: 8px
|
width: 100%
|
||||||
height: 60px
|
@media (min-width: 992px)
|
||||||
input
|
gap: 32px
|
||||||
width: 100%
|
.sacrifice-from-wrapper
|
||||||
font-size: 32px
|
.sacrifice-logo
|
||||||
|
margin-left: 16px
|
||||||
img
|
img
|
||||||
margin-left: 16px
|
width: 45px
|
||||||
|
height: 45px
|
||||||
|
border-radius: 50%
|
||||||
|
pointer-events: none
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 100%
|
||||||
|
width: auto
|
||||||
.sacrifice-to-output
|
.sacrifice-to-output
|
||||||
flex: 1 1 auto
|
flex: 1 1 auto
|
||||||
text-align: left
|
text-align: left
|
||||||
.sacrifice-to-output-coin
|
.sacrifice-to-output-coin
|
||||||
font-size: 24px
|
font-size: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 24px
|
||||||
.sacrifice-to-output-rewards
|
.sacrifice-to-output-rewards
|
||||||
font-size: 42px
|
font-size: 24px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 42px
|
||||||
.value-adder
|
.value-adder
|
||||||
display: flex
|
display: flex
|
||||||
gap: 6px
|
gap: 6px
|
||||||
.sacrifice-adder-step
|
.sacrifice-adder-step
|
||||||
font-size: 14px
|
font-size: 12px
|
||||||
|
align-items: center
|
||||||
|
background: var(--grey, #858585)
|
||||||
|
color: var(--midnight-black, #0F0F0F)
|
||||||
&:hover,
|
&:hover,
|
||||||
&:active,
|
&:active,
|
||||||
&:focus
|
&:focus
|
||||||
background-color: var(--secondary)
|
background-color: var(--grey-light)
|
||||||
border: 1px solid var(--secondary-dark)
|
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
.sacrifice-adder-balance
|
// @media (min-width: 992px)
|
||||||
margin-left: auto
|
// font-size: 12px
|
||||||
.sacrifice-adder-max
|
// .sacrifice-adder-balance
|
||||||
margin-left: 12px
|
// margin-left: auto
|
||||||
color: red
|
// .sacrifice-adder-max
|
||||||
&:hover,
|
// margin-left: 12px
|
||||||
&:focus,
|
// color: red
|
||||||
&:active
|
// &:hover,
|
||||||
color: darken(red, 10%)
|
// &:focus,
|
||||||
transform: scale(1.1)
|
// &:active
|
||||||
transition: transform 0s
|
// color: darken(red, 10%)
|
||||||
|
// transform: scale(1.1)
|
||||||
|
// transition: transform 0s
|
||||||
|
.sacrifice-to-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 18px
|
||||||
|
.sacrifice-to-body
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
height: 56px
|
||||||
|
.sacrificed-info
|
||||||
|
display: flex
|
||||||
|
padding: 8px 24px
|
||||||
|
justify-content: space-between
|
||||||
|
align-items: center
|
||||||
|
align-self: stretch
|
||||||
|
border-radius: 16px
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
text-align: left
|
||||||
|
|
||||||
|
.sacrifice-staking-bonus
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
padding: 8px 16px
|
||||||
|
row-gap: 8px
|
||||||
|
border-radius: 10px
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
.sacrifice-staking-bonus-inner
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
.icon
|
||||||
|
margin-left: auto
|
||||||
|
|
||||||
|
.input-max
|
||||||
|
color: var(--grey, #858585)
|
||||||
|
font-weight: bold
|
||||||
|
&:hover, &:active, &:focus
|
||||||
|
color: var(--grey-light, #858585)
|
||||||
|
cursor: pointer
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
<template>
|
||||||
|
<div class="slideout-overlay" :class="{ open: props.modelValue }" @click="showPanel = false">
|
||||||
|
<div :class="{ 'slideout-wrapper': true, open: props.modelValue }">
|
||||||
|
<div class="slideout-panel" @click="testClick">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { inject, watchEffect } from "vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: Boolean,
|
||||||
|
});
|
||||||
|
|
||||||
|
defineEmits(["update:modelValue"]);
|
||||||
|
|
||||||
|
const showPanel = inject("showPanel");
|
||||||
|
|
||||||
|
function testClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.slideout-overlay
|
||||||
|
z-index: 100
|
||||||
|
&.open
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
position: fixed
|
||||||
|
background-color: rgb(15, 15, 15, 0.7)
|
||||||
|
.slideout-wrapper
|
||||||
|
z-index: 100
|
||||||
|
height: 100svh
|
||||||
|
position: fixed
|
||||||
|
display: flex
|
||||||
|
background-color: var(--midnight-black, #0F0F0F)
|
||||||
|
border-radius: 16px
|
||||||
|
transition: margin-bottom 250ms ease 0s
|
||||||
|
width: 100%
|
||||||
|
margin-bottom: -100vh
|
||||||
|
bottom: 0
|
||||||
|
overflow: auto
|
||||||
|
@media (min-width: 992px)
|
||||||
|
margin-right: -400px
|
||||||
|
transition: margin-right 250ms ease 0s
|
||||||
|
width: auto
|
||||||
|
right: -30px
|
||||||
|
top: 0
|
||||||
|
&.open
|
||||||
|
margin-bottom: -82px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
margin-right: 30px
|
||||||
|
.slideout-panel
|
||||||
|
width: 100%
|
||||||
|
height: 100%
|
||||||
|
padding: 24px 24px 16px 24px
|
||||||
|
overflow: scroll
|
||||||
|
height: calc( 100svh - 82px )
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: 400px
|
||||||
|
overflow: unset
|
||||||
|
.slideout-icon
|
||||||
|
cursor: pointer
|
||||||
|
&:hover, &:active, &:focus
|
||||||
|
background-color: lighten(#2D2D2D, 20%)
|
||||||
|
svg
|
||||||
|
font-size: 30px
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,342 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
:class="{
|
||||||
|
'stake-component--variant1': props.variant === 1,
|
||||||
|
'stake-component--variant2': props.variant === 2,
|
||||||
|
'stake-component--variant3': props.variant === 3,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div class="mid-text text-center" v-if="props.variant === 2">
|
||||||
|
<slot name="headline">Staked</slot>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="connected-stake bloodline-border card"
|
||||||
|
:class="{ 'card--dense': dense, 'connected-stake--variant1': variant === 1 }"
|
||||||
|
@click="
|
||||||
|
(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<div class="connected-stake-headline mid-mid-text">
|
||||||
|
<slot name="headline" v-if="variant !== 2">Staked</slot>
|
||||||
|
</div>
|
||||||
|
<div class="connected-stake-subheadline low-mid-text">
|
||||||
|
<slot name="subheadline"
|
||||||
|
>Stake for a 25% bonus on your sacrifice.<br />
|
||||||
|
Upper limit is your stake.</slot
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="connected-stake-body">
|
||||||
|
<slot name="body">
|
||||||
|
<token-name-price
|
||||||
|
v-if="walletStore.memeToken?.staked"
|
||||||
|
:name="tokenStore.getToken(walletStore.memeToken?.contractAddress)?.name"
|
||||||
|
:price="formatNumber(walletStore.memeToken?.staked / 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
></token-name-price>
|
||||||
|
<token-logo img="/assets/img/token/bloodline.png" :alt="'bloodline-token'"></token-logo>
|
||||||
|
<token-name-price class="stake-reward" name="Extra Reward" price="+25%"></token-name-price>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
<slot name="actions">
|
||||||
|
<div class="connected-stake-buttons" v-if="!stakeMenu">
|
||||||
|
<div class="mid-mid-text text-center" disabled v-if="!walletStore.connected">
|
||||||
|
Please Connect Your Wallet
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal mid-mid-text"
|
||||||
|
disabled
|
||||||
|
v-if="walletStore.connected && cycleStore.currentCycle === 1"
|
||||||
|
>
|
||||||
|
Stake
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal mid-mid-text"
|
||||||
|
v-else-if="walletStore.connected && cycleStore.currentCycle > 1"
|
||||||
|
@click="openStake"
|
||||||
|
>
|
||||||
|
Stake
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="
|
||||||
|
walletStore.connected &&
|
||||||
|
((walletStore.memeToken?.staked === 0 && !stakeonly) || cycleStore.currentCycle === 1)
|
||||||
|
"
|
||||||
|
class="btn btn-immortal btn--disabled mid-mid-text"
|
||||||
|
>
|
||||||
|
Unstake
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-else-if="walletStore.connected && !stakeonly"
|
||||||
|
class="btn btn-immortal mid-mid-text"
|
||||||
|
@click="openUnstake"
|
||||||
|
>
|
||||||
|
Unstake
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Transition name="smooth">
|
||||||
|
<stake-menu
|
||||||
|
v-model="tokenNumber"
|
||||||
|
@close="stakeMenu = false"
|
||||||
|
:stake="stake"
|
||||||
|
:amount="balanceOf"
|
||||||
|
v-if="stakeMenu & !unstakeMenu"
|
||||||
|
>
|
||||||
|
<template v-slot:body>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStake === 0">
|
||||||
|
Enter Amount
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" v-else-if="stateStake === 1" @click="stakeToken">
|
||||||
|
Stake
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStake === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStake === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn transparent small-text cancel-button text-center"
|
||||||
|
@click="stakeMenu = false"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-slot:message-end>
|
||||||
|
<div class="input-balance">Balance: {{ formatNumber(balanceOf) }}</div>
|
||||||
|
</template>
|
||||||
|
</stake-menu>
|
||||||
|
<div class="unstake-menu" v-else-if="stakeMenu & unstakeMenu">
|
||||||
|
<div class="low-mid-text text-center">
|
||||||
|
To prevent users from farming rewards you can claim your stake next cycle.
|
||||||
|
</div>
|
||||||
|
<div class="unstake-menu-actions">
|
||||||
|
<div class="btn btn-immortal stake-button" v-if="stateStake <= 1" @click="orderUnstake">
|
||||||
|
Unstake Next Cycle
|
||||||
|
</div>
|
||||||
|
<div class="btn btn--disabled mid-mid-text text-center" v-else-if="stateStake === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn--disabled mid-mid-text text-center" v-else-if="stateStake === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="btn transparent small-text cancel-button text-center"
|
||||||
|
@click="stakeMenu = false"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Transition>
|
||||||
|
<div class="connected-stake-first-round small-text text-center" v-if="cycleStore.currentCycle === 0">
|
||||||
|
No $BLOOD on the market. Staking is activated after the first cycle is finished.
|
||||||
|
</div>
|
||||||
|
<div class="connected-stake-first-round small-text text-center" v-else>
|
||||||
|
You can claim your stake next cycle
|
||||||
|
</div>
|
||||||
|
</slot>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, useSlots, computed } from "vue";
|
||||||
|
import StakeMenu from "@/components/StakeMenu.vue";
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
import { waitForTransaction } from "@wagmi/core";
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
import { showSuccessToast } from "@/helper/toast.js";
|
||||||
|
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
|
import { formatNumber } from "@/helper/helper.js";
|
||||||
|
|
||||||
|
const toast = useToast();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const slots = useSlots();
|
||||||
|
const props = defineProps({
|
||||||
|
stakeonly: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
variant: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
dense: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const stakeMenu = ref(false);
|
||||||
|
const unstakeMenu = ref(false);
|
||||||
|
const stake = ref(null);
|
||||||
|
const tokenNumber = ref(null);
|
||||||
|
const loading = ref(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* state 0 enter amount
|
||||||
|
* state 1 rdy to go
|
||||||
|
* state 2 signing
|
||||||
|
* state 3 loading
|
||||||
|
* state 4 staked
|
||||||
|
*/
|
||||||
|
const state = ref(0);
|
||||||
|
|
||||||
|
function openStake() {
|
||||||
|
stake.value = true;
|
||||||
|
unstakeMenu.value = false;
|
||||||
|
stakeMenu.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function openUnstake() {
|
||||||
|
stake.value = false;
|
||||||
|
unstakeMenu.value = true;
|
||||||
|
stakeMenu.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function orderUnstake() {
|
||||||
|
try {
|
||||||
|
state.value = 2;
|
||||||
|
var hash = await rewardLockerStore.orderUnstake();
|
||||||
|
state.value = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
state.value = 4;
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xd0813ff03c470dcc7baa9ce36914dc2febdfd276d639deffaac383fd3db42ba3"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
|
||||||
|
const outputClaim = Number(rewardData.topics[2]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim),
|
||||||
|
"Success!",
|
||||||
|
"You just unstaked",
|
||||||
|
"You can claim your stake next cycle."
|
||||||
|
);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("orderUnstake", error);
|
||||||
|
} finally {
|
||||||
|
state.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stakeToken() {
|
||||||
|
try {
|
||||||
|
console.log("stakeToken");
|
||||||
|
state.value = 2;
|
||||||
|
const hash = await rewardLockerStore.stakeBloodline(tokenNumber.value);
|
||||||
|
state.value = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xf496bf2b14b1d178412b6f7a745900105b49b38b315cfdfbfabad31a6f995c6f"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
//
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
|
||||||
|
const outputClaim = BigInt(rewardData.topics[3]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
console.log("data", data);
|
||||||
|
state.value = 0;
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim),
|
||||||
|
"Success!",
|
||||||
|
"You just staked",
|
||||||
|
"Your next sacrifice will get an extra staking bonus as a reward."
|
||||||
|
);
|
||||||
|
//reload data
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
state.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const balanceOf = computed(() => {
|
||||||
|
if (!walletStore.memeToken?.balanceOf) {
|
||||||
|
return 0n;
|
||||||
|
} else {
|
||||||
|
return walletStore.memeToken?.balanceOf / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const stateStake = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
if (state.value === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (state.value === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
} else if (tokenNumber.value !== null || tokenNumber.value !== "" || tokenNumber.value > 0) {
|
||||||
|
returnState = 1;
|
||||||
|
} else if (tokenNumber.value === null || tokenNumber.value === "" || tokenNumber.value === 0) {
|
||||||
|
returnState = 0;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
|
||||||
|
.stake-component--variant2
|
||||||
|
border-radius: 16px
|
||||||
|
background: var(--darkgrey, #202020)
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 18px
|
||||||
|
padding: 8px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 24px 48px
|
||||||
|
.unstake-menu
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
.unstake-menu-actions
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
|
||||||
|
.stake-component--variant3
|
||||||
|
.connected-stake
|
||||||
|
.connected-stake-headline
|
||||||
|
text-align: left
|
||||||
|
.connected-stake-body
|
||||||
|
.token-price-wrapper, .stake-reward
|
||||||
|
.token-name
|
||||||
|
font-size: 14px
|
||||||
|
.token-price
|
||||||
|
font-size: 24px
|
||||||
|
.connected-stake-buttons
|
||||||
|
display: flex
|
||||||
|
gap: 8px
|
||||||
|
.btn
|
||||||
|
font-size: 18px
|
||||||
|
.connected-stake-first-round
|
||||||
|
font-size: 14px
|
||||||
|
.connected-stake-claim-info
|
||||||
|
font-size: 14px
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
<template>
|
||||||
|
<div class="stake-menu">
|
||||||
|
<token-input :modelValue="props.modelValue" @input="emit('update:modelValue', Number($event.target.value))">
|
||||||
|
<template v-slot:message>
|
||||||
|
<div class="stake-adder-step bloodline-badge grey" @click="addTokensPercent(25n)">25%</div>
|
||||||
|
<div class="stake-adder-step bloodline-badge grey" @click="addTokensPercent(50n)">50%</div>
|
||||||
|
<div class="stake-adder-step bloodline-badge grey" @click="addTokensPercent(75n)">75%</div>
|
||||||
|
<div class="stake-adder-step bloodline-badge grey" @click="addTokensPercent(100n)">100%</div>
|
||||||
|
</template>
|
||||||
|
<template v-slot:message-end>
|
||||||
|
<slot name="message-end"> </slot>
|
||||||
|
</template>
|
||||||
|
</token-input>
|
||||||
|
<div class="stake-menu-actions">
|
||||||
|
<slot name="body">
|
||||||
|
<div class="input-balance">Balance: {{ walletStore.memeToken.balanceOf }}</div>
|
||||||
|
<div class="btn btn-immortal stake-button" @click="stakeBloodline" v-if="props.stake">Stake</div>
|
||||||
|
<div class="btn btn-immortal stake-button" @click="unstakeBloodline" v-else>Unstake for Next Cycle</div>
|
||||||
|
<div class="btn btn-immortal black" @click="emit('close')">Cancel</div>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
import TokenInput from "./TokenInput.vue";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { createPermitObject, getSignatureRSV } from "@/helper/blockchain.js";
|
||||||
|
|
||||||
|
import { signTypedData } from "@wagmi/core";
|
||||||
|
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
stake: Boolean,
|
||||||
|
modelValue: [Number, BigInt],
|
||||||
|
amount: [Number, BigInt],
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(["close", "update:modelValue"]);
|
||||||
|
|
||||||
|
async function addTokensPercent(value) {
|
||||||
|
console.log("value", value);
|
||||||
|
console.log("props.amount", props.amount);
|
||||||
|
let amount;
|
||||||
|
if (props.amount !== undefined || props.amount !== null) {
|
||||||
|
console.log("props.amount", props.amount);
|
||||||
|
amount = (props.amount * value) / 100n;
|
||||||
|
} else if (props.stake) {
|
||||||
|
amount = (walletStore.memeToken.balanceOf * value) / 100n;
|
||||||
|
} else {
|
||||||
|
amount = (walletStore.memeToken.staked * value) / 100n;
|
||||||
|
}
|
||||||
|
console.log("amount", amount);
|
||||||
|
emit("update:modelValue", Number(amount));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function unstakeBloodline() {
|
||||||
|
try {
|
||||||
|
const fromAddress = walletStore.address;
|
||||||
|
|
||||||
|
var unstakedOrdered = await rewardLockerStore.contract.read.unstakeOrdered([4, fromAddress]);
|
||||||
|
//check if states needed here
|
||||||
|
var hash = await rewardLockerStore.contract.write.orderUnstake();
|
||||||
|
console.log("hash", hash);
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
console.log("data", data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("unstakeBloodline", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stakeBloodline() {
|
||||||
|
try {
|
||||||
|
console.log("stakeBloodline");
|
||||||
|
const fromAddress = walletStore.address;
|
||||||
|
const spender = rewardLockerStore.config.contractAddress;
|
||||||
|
const deadline = Date.now() + 20 * 60;
|
||||||
|
const decimals = tokenStore.getToken(walletStore.memeToken.contractAddress).decimals;
|
||||||
|
const value = BigInt(tokenNumber.value) * 10n ** decimals;
|
||||||
|
const nonce = await tokenStore.memeToken.contract.read.nonces([fromAddress]);
|
||||||
|
const { types, message, domain, primaryType } = createPermitObject(
|
||||||
|
fromAddress,
|
||||||
|
spender,
|
||||||
|
nonce,
|
||||||
|
deadline,
|
||||||
|
value
|
||||||
|
);
|
||||||
|
|
||||||
|
const signature = await signTypedData({
|
||||||
|
domain: domain,
|
||||||
|
message: message,
|
||||||
|
primaryType: primaryType,
|
||||||
|
types: types,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { r, s, v } = getSignatureRSV(signature);
|
||||||
|
|
||||||
|
var resultStake = await rewardLockerStore.contract.write.stakeToBeSecured([value, deadline, v, r, s]);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("stakeBloodline", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.btn
|
||||||
|
&.btn-immortal
|
||||||
|
&.stake-button
|
||||||
|
font-size: 18px
|
||||||
|
text-align: center
|
||||||
|
.input-balance
|
||||||
|
color: var(--grey, #858585)
|
||||||
|
margin-left: auto
|
||||||
|
|
||||||
|
.stake-menu
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 32px
|
||||||
|
.stake-menu-actions
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
</style>
|
||||||
@@ -1,57 +1,325 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="claim bloodline-border">
|
<div class="claim bloodline-border bloodline-border__thin grey">
|
||||||
<div class="rewards-wrapper">
|
<div class="claim-headline sub-header">Your Cycle Rewards</div>
|
||||||
<div class="rewards-headline">Sacrafice Reward</div>
|
|
||||||
<div class="rewards-sacrifice-wrapper bloodline-border">
|
<!-- <div class="rewards-wrapper" v-if="!isMobile">
|
||||||
<div class="rewards-body">
|
<rewards-wrapper
|
||||||
<div class="rewards-coin">$BLOOD</div>
|
title="Sacrafice Reward"
|
||||||
<div class="rewards-amount">0</div>
|
coin="$BLOOD"
|
||||||
</div>
|
:amount="getCurrentCycleData?.rewards_sacrifice"
|
||||||
<img src="@/assets/img/vampir.png" alt="vampir" />
|
image="/assets/img/vampir.png"
|
||||||
</div>
|
/>
|
||||||
<div class="rewards-divider bloodline-devider">
|
<div class="rewards-divider bloodline-devider">
|
||||||
<font-awesome-icon icon="fa-solid fa-plus" />
|
<font-awesome-icon icon="fa-solid fa-plus" />
|
||||||
</div>
|
</div>
|
||||||
<div class="rewards-headline">Clan Reward</div>
|
<rewards-wrapper
|
||||||
<div class="rewards-clan-wrapper bloodline-border">
|
title="Clan Reward"
|
||||||
<div class="rewards-body">
|
coin="$BLOOD"
|
||||||
<div class="rewards-coin">$BLOOD</div>
|
:amount="getCurrentCycleData?.rewards_clan"
|
||||||
<div class="rewards-amount">0</div>
|
image="/assets/img/vampir.png"
|
||||||
</div>
|
/>
|
||||||
<img src="@/assets/img/vampir.png" alt="vampir" />
|
</div> -->
|
||||||
</div>
|
<div class="rewards-list">
|
||||||
<div class="claim-button">
|
<rewards-wrapper
|
||||||
<div class="btn btn-immortal">Claim</div>
|
title="Sacrafice Reward"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsSacrifice)"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Staking Bonus"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsStaking)"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Clan Bonus"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsClan)"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="rewards-total-wrapper">
|
||||||
|
<div class="rewards-total-headline sub-header">Total Reward</div>
|
||||||
|
<div
|
||||||
|
class="rewards-total-inner bloodline-border bloodline-border--variant1"
|
||||||
|
:class="{ purple: rewardsTotal > 0 && activeCycle !== currentCycle }"
|
||||||
|
>
|
||||||
|
<token-name-price name="$BLOOD" :price="formatNumber(rewardsTotal)"></token-name-price>
|
||||||
|
<token-logo img="/assets/img/vampir.png" :alt="'vampire'"></token-logo>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="claim-button">
|
||||||
|
<template v-if="!walletStore.connected">
|
||||||
|
<button class="btn btn-immortal sub-header" @click="showPanel = true">Connect</button>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="activeCycle === currentCycle">
|
||||||
|
<button class="btn btn-immortal sub-header" @click="router.push({ name: 'home' })">Sacrifice</button>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="rewardsTotal > 0">
|
||||||
|
<Transition name="smooth">
|
||||||
|
<div class="stake-buttons" v-show="!stakeMenu">
|
||||||
|
<div class="btn btn-immortal" v-if="stateClaimedComp === 0" @click="claimRewards">Claim</div>
|
||||||
|
<div class="btn btn-immortal" disabled v-if="stateClaimedComp === 2">Sign Transaction</div>
|
||||||
|
<div class="btn btn-immortal" disabled v-if="stateClaimedComp === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal" @click="openStake">Stake</div>
|
||||||
|
</div>
|
||||||
|
</Transition>
|
||||||
|
<Transition name="smooth">
|
||||||
|
<stake-menu
|
||||||
|
v-model="tokenNumber"
|
||||||
|
@close="stakeMenu = false"
|
||||||
|
:stake="stake"
|
||||||
|
:amount="rewardsTotal"
|
||||||
|
v-if="stakeMenu"
|
||||||
|
>
|
||||||
|
<template v-slot:body>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStakeClaimComp === 0">
|
||||||
|
Enter Amount
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal stake-button"
|
||||||
|
v-else-if="stateStakeClaimComp === 1"
|
||||||
|
@click="stakeAndClaim"
|
||||||
|
>
|
||||||
|
Stake & Claim Rest
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStakeClaimComp === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-if="stateStakeClaimComp === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn transparent small-text cancel-button text-center"
|
||||||
|
@click="stakeMenu = false"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</stake-menu>
|
||||||
|
</Transition>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="btn btn-immortal btn--disabled sub-header">Nothing to claim</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup></script>
|
<script setup>
|
||||||
|
import { storeToRefs } from "pinia";
|
||||||
|
import RewardsWrapper from "@/components/RewardsWrapper.vue";
|
||||||
|
import { inject, ref, onMounted, computed } from "vue";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import StakeMenu from "@/components/StakeMenu.vue";
|
||||||
|
import { waitForTransaction } from "@wagmi/core";
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
import { formatNumber } from "@/helper/helper.js";
|
||||||
|
import { showSuccessToast } from "@/helper/toast.js";
|
||||||
|
|
||||||
|
const showPanel = inject("showPanel");
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const { activeCycle, currentCycle, getCurrentCycleData, rewardsSacrifice, rewardsStaking, rewardsClan, rewardsTotal } =
|
||||||
|
storeToRefs(cycleStore);
|
||||||
|
|
||||||
|
const stakeMenu = ref(false);
|
||||||
|
const stake = ref(null);
|
||||||
|
const tokenNumber = ref(null);
|
||||||
|
const stateClaim = ref(0);
|
||||||
|
const stateStakeClaim = ref(0);
|
||||||
|
|
||||||
|
async function stakeAndClaim() {
|
||||||
|
try {
|
||||||
|
console.log("stakeAndClaim");
|
||||||
|
console.log(tokenNumber.value);
|
||||||
|
console.log(rewardsTotal.value);
|
||||||
|
stateStakeClaim.value = 2;
|
||||||
|
console.log("hier1");
|
||||||
|
const coefficient = (10000n * BigInt(tokenNumber.value)) / rewardsTotal.value;
|
||||||
|
var hash = await rewardLockerStore.stakeAndClaimCycle(coefficient, cycleStore.activeCycle);
|
||||||
|
console.log("hier2");
|
||||||
|
stateStakeClaim.value = 3;
|
||||||
|
console.log("hash");
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
console.log("data", data);
|
||||||
|
stateStakeClaim.value = 4;
|
||||||
|
//ClaimedReward (address staker, uint256 reward)
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xd0813ff03c470dcc7baa9ce36914dc2febdfd276d639deffaac383fd3db42ba3"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
var stakeData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xf496bf2b14b1d178412b6f7a745900105b49b38b315cfdfbfabad31a6f995c6f"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
//
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
console.log("stakeData", stakeData);
|
||||||
|
const outputClaim = BigInt(rewardData?.topics[2]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
const outputStaked = BigInt(stakeData?.topics[3]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim + outputStaked),
|
||||||
|
"Success!",
|
||||||
|
"You just claimed and staked",
|
||||||
|
"Join the next cycle to increase your rewards and win with your clan."
|
||||||
|
);
|
||||||
|
tokenNumber.value = 0;
|
||||||
|
stakeMenu.value = false;
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("stakeAndClaim", error);
|
||||||
|
} finally {
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
console.log("finally1");
|
||||||
|
await cycleStore.fillCycle(activeCycle.value, true);
|
||||||
|
console.log("finally2");
|
||||||
|
stateStakeClaim.value = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function openStake() {
|
||||||
|
stake.value = true;
|
||||||
|
stakeMenu.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {});
|
||||||
|
|
||||||
|
async function claimRewards() {
|
||||||
|
try {
|
||||||
|
stateClaim.value = 2;
|
||||||
|
console.log("getCurrentCycleData", getCurrentCycleData);
|
||||||
|
console.log("activeCycle.value", activeCycle.value);
|
||||||
|
var hash = await rewardLockerStore.claim([activeCycle.value]);
|
||||||
|
stateClaim.value = 3;
|
||||||
|
console.log("hash", hash);
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
stateClaim.value = 4;
|
||||||
|
// ClaimedReward (address staker, uint256 reward)
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xd0813ff03c470dcc7baa9ce36914dc2febdfd276d639deffaac383fd3db42ba3"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
//
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
|
||||||
|
const outputClaim = BigInt(rewardData.topics[2]) / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim),
|
||||||
|
"Success!",
|
||||||
|
"You just claimed",
|
||||||
|
"Join the next cycle to increase your rewards and win with your clan."
|
||||||
|
);
|
||||||
|
|
||||||
|
await cycleStore.fillCycle(activeCycle.value, true);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
stateClaim.value = 0;
|
||||||
|
throw Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const stateClaimedComp = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
if (stateClaim.value === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (stateClaim.value === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
|
||||||
|
const stateStakeClaimComp = computed(() => {
|
||||||
|
console.log("stateStakeClaimComp");
|
||||||
|
let returnState = 0;
|
||||||
|
if (stateStakeClaim.value === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (stateStakeClaim.value === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
} else if (tokenNumber.value !== null || tokenNumber.value !== "" || tokenNumber.value > 0) {
|
||||||
|
returnState = 1;
|
||||||
|
} else if (
|
||||||
|
tokenNumber.value === null ||
|
||||||
|
tokenNumber.value === "" ||
|
||||||
|
tokenNumber.value === 0 ||
|
||||||
|
tokenNumber.value > walletStore.unclaimedRewards
|
||||||
|
) {
|
||||||
|
returnState = 0;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.claim
|
.claim
|
||||||
display: flex
|
display: flex
|
||||||
|
padding: 12px
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
padding: 32px 40px
|
gap: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 32px 40px
|
||||||
|
.claim-headline
|
||||||
|
text-align: left
|
||||||
.claim-button
|
.claim-button
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-top: 32px
|
.stake-buttons
|
||||||
.rewards-wrapper
|
display: flex
|
||||||
width: 100%
|
text-align: center
|
||||||
.rewards-headline
|
gap: 8px
|
||||||
font-size: 24px
|
@media (min-width: 992px)
|
||||||
padding: 0 0 4px 8px
|
gap: 32px
|
||||||
.rewards-divider
|
// div
|
||||||
text-align: center
|
// flex: 1 1 50%
|
||||||
.rewards-sacrifice-wrapper, .rewards-clan-wrapper
|
margin-bottom: 16px
|
||||||
|
.rewards-divider
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.rewards-total-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.rewards-total-headline
|
||||||
|
text-align: left
|
||||||
|
.rewards-total-inner
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
text-align: left
|
||||||
|
box-sizing: content-box
|
||||||
|
height: 56px
|
||||||
|
.rewards-left
|
||||||
display: flex
|
display: flex
|
||||||
.rewards-body
|
flex-direction: column
|
||||||
align-self: center
|
gap: 8px
|
||||||
.rewards-coin
|
.name
|
||||||
font-size: 24px
|
font-size: 16px
|
||||||
.rewards-amount
|
.amount
|
||||||
font-size: 40px
|
font-size: 24px
|
||||||
|
.rewards-right
|
||||||
img
|
img
|
||||||
margin-left: auto
|
height: 49px
|
||||||
|
width: 49px
|
||||||
|
border-radius: 50%
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
<template>
|
||||||
|
<div class="token-input">
|
||||||
|
<div class="sarcrifice-from-input">
|
||||||
|
<div class="left-side">
|
||||||
|
<input
|
||||||
|
@input="emit('update:modelValue', $event.target.value)"
|
||||||
|
:value="props.modelValue"
|
||||||
|
:placeholder="0"
|
||||||
|
type="number"
|
||||||
|
/>
|
||||||
|
<div class="value-adder">
|
||||||
|
<slot class="value-adder" name="message"></slot>
|
||||||
|
<slot name="message-end"></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right-side">
|
||||||
|
<token-logo img="/assets/img/vampir.png" :alt="'vampir'"></token-logo>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: [String, Number],
|
||||||
|
logo: String,
|
||||||
|
max: Number,
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(["update:modelValue"]);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.sarcrifice-from-input
|
||||||
|
display: flex
|
||||||
|
margin-bottom: 8px
|
||||||
|
gap: 8px
|
||||||
|
.left-side
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 12px
|
||||||
|
flex: 1 1 auto
|
||||||
|
input
|
||||||
|
width: 100%
|
||||||
|
height: 45px
|
||||||
|
font-size: 24px
|
||||||
|
border-radius: 16px
|
||||||
|
padding: 0 16px
|
||||||
|
&::-webkit-outer-spin-button,
|
||||||
|
&::-webkit-inner-spin-button
|
||||||
|
-webkit-appearance: none
|
||||||
|
margin: 0
|
||||||
|
&[type=number]
|
||||||
|
-moz-appearance: textfield
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 24px
|
||||||
|
.value-adder
|
||||||
|
display: flex
|
||||||
|
gap: 8px
|
||||||
|
.stake-adder-step
|
||||||
|
padding: 4px 16px
|
||||||
|
color: var(--black)
|
||||||
|
font-size: 12px
|
||||||
|
border-width: 1px
|
||||||
|
border-color: transparent
|
||||||
|
border-style: solid
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 14px
|
||||||
|
&:hover,&:active, &:focus
|
||||||
|
background-color: var(--grey-light)
|
||||||
|
cursor: pointer
|
||||||
|
.right-side
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
height: 45px
|
||||||
|
.sacrifice-logo
|
||||||
|
margin-left: 16px
|
||||||
|
height: 45px
|
||||||
|
img
|
||||||
|
width: 45px
|
||||||
|
height: 45px
|
||||||
|
border-radius: 50%
|
||||||
|
pointer-events: none
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 100%
|
||||||
|
width: auto
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<template>
|
||||||
|
<div class="token-logo">
|
||||||
|
<img :src="props.img" :alt="props.alt" :style="{ height: `${size}px`, width: `${size}px` }" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const props = defineProps({
|
||||||
|
img: String,
|
||||||
|
alt: String,
|
||||||
|
size: {
|
||||||
|
type: Number,
|
||||||
|
default: 45,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.token-logo
|
||||||
|
height: 100%
|
||||||
|
img
|
||||||
|
border-radius: 50%
|
||||||
|
pointer-events: none
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: auto
|
||||||
|
height: 100%
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<template>
|
||||||
|
<div class="token-price-wrapper">
|
||||||
|
<div class="token-name small-text">{{ props.name }}</div>
|
||||||
|
<div class="token-price sub-header">{{ props.price }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const props = defineProps({
|
||||||
|
name: String,
|
||||||
|
price: [Number, String],
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.token-price-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 6px
|
||||||
|
text-align: left
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
<template>
|
||||||
|
<div class="approve-card">
|
||||||
|
<div class="left-side low-mid-text">
|
||||||
|
Transaction<br />
|
||||||
|
Successful
|
||||||
|
</div>
|
||||||
|
<div class="right-side">
|
||||||
|
<div class="btn btn-immortal tiny-text" v-if="stateComputed === 1" @click="sacrificeClick">
|
||||||
|
Sacrifice 🩸
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal tiny-text" disabled v-if="stateComputed === 2">Sign Transaction</div>
|
||||||
|
<div class="btn btn-immortal tiny-text" disabled v-if="stateComputed === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
import { getCurrentInstance, computed, watch, inject } from "vue";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useSacrificeStore } from "@/stores/sacrifice";
|
||||||
|
|
||||||
|
import CardComponent from "@/components/CardComponent.vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
|
|
||||||
|
const emit = defineEmits(["sacrificed"]);
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
value: String,
|
||||||
|
header: String,
|
||||||
|
subheader: String,
|
||||||
|
info: String,
|
||||||
|
});
|
||||||
|
|
||||||
|
const toast = useToast();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const sacrificeStore = useSacrificeStore();
|
||||||
|
|
||||||
|
const instance = getCurrentInstance();
|
||||||
|
const id = instance.attrs["toast-id"];
|
||||||
|
const splashBlood = inject("splashBlood");
|
||||||
|
|
||||||
|
function closeToast() {
|
||||||
|
toast.dismiss(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const stateComputed = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
if (
|
||||||
|
sacrificeStore.sacrificeNumber === null ||
|
||||||
|
sacrificeStore.sacrificeNumber === "" ||
|
||||||
|
sacrificeStore.sacrificeNumber === 0
|
||||||
|
) {
|
||||||
|
returnState = 0;
|
||||||
|
} else if (sacrificeStore.sacrificeState === 2) {
|
||||||
|
returnState = 2;
|
||||||
|
} else if (sacrificeStore.sacrificeState === 3) {
|
||||||
|
returnState = 3;
|
||||||
|
} else if (
|
||||||
|
sacrificeStore.sacrificeNumber !== null ||
|
||||||
|
sacrificeStore.sacrificeNumber !== "" ||
|
||||||
|
sacrificeStore.sacrificeNumber > 0
|
||||||
|
) {
|
||||||
|
returnState = 1;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
|
|
||||||
|
async function sacrificeClick() {
|
||||||
|
try {
|
||||||
|
var result = await sacrificeStore.sacrificeToken(sacrificeStore.sacrificeNumber, tokenStore.activeToken);
|
||||||
|
if (result) {
|
||||||
|
emit("sacrificed");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("error", error);
|
||||||
|
} finally {
|
||||||
|
closeToast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="sass">
|
||||||
|
.Vue-Toastification__container
|
||||||
|
.Vue-Toastification__toast--default
|
||||||
|
&.approve-toast
|
||||||
|
background: transparent
|
||||||
|
&.toast-card
|
||||||
|
padding: 24px 16px
|
||||||
|
border-radius: 10px
|
||||||
|
border: 2px solid var(--dark-purple, #4B0082)
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
.Vue-Toastification__toast-component-body
|
||||||
|
.approve-card
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
display: flex
|
||||||
|
align-items: center
|
||||||
|
gap: 29px
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
<template>
|
||||||
|
<card-component class="modal-card">
|
||||||
|
<div class="body">
|
||||||
|
<div class="header">
|
||||||
|
<img alt="logo" class="logo" src="/assets/img/vampir.png" />
|
||||||
|
</div>
|
||||||
|
<div class="subheader toast-header">
|
||||||
|
{{ props.header }}<br />
|
||||||
|
{{ props.subheader }}
|
||||||
|
</div>
|
||||||
|
<div class="amount-number">
|
||||||
|
<div class="token-amount number-mobile">{{ props.value }}</div>
|
||||||
|
<div class="token-name">$Blood</div>
|
||||||
|
</div>
|
||||||
|
<div class="info toast-body">
|
||||||
|
{{ props.info }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal" @click="closeToast">Okay</div>
|
||||||
|
</card-component>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import { getCurrentInstance } from "vue";
|
||||||
|
|
||||||
|
import CardComponent from "@/components/CardComponent.vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
value: String,
|
||||||
|
header: String,
|
||||||
|
subheader: String,
|
||||||
|
info: String,
|
||||||
|
});
|
||||||
|
|
||||||
|
// element.classList.add("toast-open");
|
||||||
|
const toast = useToast();
|
||||||
|
|
||||||
|
const instance = getCurrentInstance();
|
||||||
|
instance.parent.parent.vnode.el.classList.add("toast-open");
|
||||||
|
const id = instance.attrs["toast-id"];
|
||||||
|
function closeToast() {
|
||||||
|
instance.parent.parent.vnode.el.classList.remove("toast-open");
|
||||||
|
toast.dismiss(id);
|
||||||
|
}
|
||||||
|
console.log("instance", instance.attrs["toast-id"]);
|
||||||
|
</script>
|
||||||
|
<style lang="sass">
|
||||||
|
.Vue-Toastification__container
|
||||||
|
&.toast-open
|
||||||
|
background-color: rgb(15, 15, 15, 0.7)
|
||||||
|
height: 100vh
|
||||||
|
width: 100vw
|
||||||
|
position: fixed
|
||||||
|
left: 0
|
||||||
|
bottom: 0
|
||||||
|
z-index: 10
|
||||||
|
@media (min-width: 992px)
|
||||||
|
background-color: unset
|
||||||
|
&.top-center
|
||||||
|
@media (min-width: 600px)
|
||||||
|
left: unset
|
||||||
|
margin-left: unset
|
||||||
|
.Vue-Toastification__toast
|
||||||
|
max-width: unset
|
||||||
|
min-width: unset
|
||||||
|
max-height: unset
|
||||||
|
min-height: unset
|
||||||
|
font-family: unset
|
||||||
|
margin-bottom: unset
|
||||||
|
box-shadow: unset
|
||||||
|
padding: unset
|
||||||
|
&.modal-overlay
|
||||||
|
background-color: unset
|
||||||
|
.modal-card
|
||||||
|
width: 342px
|
||||||
|
text-align: center
|
||||||
|
position: absolute
|
||||||
|
top: 50%
|
||||||
|
left: 50%
|
||||||
|
transform: translate(-50%, -50%)
|
||||||
|
border: 2px solid var(--dark-purple, #4B0082)
|
||||||
|
background: var(--midnight-black, #0F0F0F)
|
||||||
|
z-index: 100
|
||||||
|
gap: 16px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
top: 142px
|
||||||
|
right: 24px
|
||||||
|
left: unset
|
||||||
|
transform: unset
|
||||||
|
.body
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.amount-number
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
align-items: end
|
||||||
|
gap: 8px
|
||||||
|
img
|
||||||
|
width: 74px
|
||||||
|
height: 74px
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
|
||||||
|
export function createPermitObject(fromAddress, spender, nonce, deadline, value) {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const message = {
|
||||||
|
owner: fromAddress,
|
||||||
|
spender: spender,
|
||||||
|
nonce: nonce,
|
||||||
|
deadline: deadline,
|
||||||
|
value: value,
|
||||||
|
};
|
||||||
|
|
||||||
|
const domainType = [
|
||||||
|
{ name: "name", type: "string" },
|
||||||
|
{ name: "version", type: "string" },
|
||||||
|
{ name: "chainId", type: "uint256" },
|
||||||
|
{ name: "verifyingContract", type: "address" },
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
const primaryType = "Permit";
|
||||||
|
|
||||||
|
const types = {
|
||||||
|
EIP712Domain: domainType,
|
||||||
|
Permit: [
|
||||||
|
{
|
||||||
|
name: "owner",
|
||||||
|
type: "address",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "spender",
|
||||||
|
type: "address",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "value",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nonce",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "deadline",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
const domain = {
|
||||||
|
name: "Bloodline",
|
||||||
|
version: "1",
|
||||||
|
chainId: 5,
|
||||||
|
verifyingContract: tokenStore.memeToken.contractAddress,
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
types,
|
||||||
|
message,
|
||||||
|
domain,
|
||||||
|
primaryType,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSignatureRSV(sig) {
|
||||||
|
// splits the signature to r, s, and v values.
|
||||||
|
// const pureSig = sig.replace("0x", "");
|
||||||
|
const r = sig.slice(0, 66);
|
||||||
|
const s = "0x" + sig.slice(66, 130);
|
||||||
|
const v = Number("0x" + sig.slice(130, 132));
|
||||||
|
return { v, r, s };
|
||||||
|
};
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
|
||||||
|
export function getImageUrl(url) {
|
||||||
|
return new URL(url, import.meta.url).href;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getPercentage(amount, goal) {
|
||||||
|
return ((Number(amount) / Number(goal)) * 100).toFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function compactNumber(number) {
|
||||||
|
return Intl.NumberFormat("en-US", {
|
||||||
|
notation: "compact",
|
||||||
|
maximumFractionDigits: 2,
|
||||||
|
}).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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// input type bigint
|
||||||
|
export function formatBigIntDivision(nominator, denominator) {
|
||||||
|
const integer = (nominator / denominator).toString();
|
||||||
|
// pick how much digits after point to show
|
||||||
|
const fraction = (nominator % denominator).toString().substring(0,10);
|
||||||
|
// output type string
|
||||||
|
return integer + '.' + fraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAddressShortName(address) {
|
||||||
|
// const address = "0x66422602B2f4885c57EE794174f98d9E4DDBBBC6";
|
||||||
|
const addressBegin = address.substring(0, 6);
|
||||||
|
const addressEnd = address.substring(address.length - 4, address.length)
|
||||||
|
return addressBegin + "..." + addressEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function numberWithCommas(x, ) {
|
||||||
|
x = x.toString();
|
||||||
|
var pattern = /(-?\d+)(\d{3})/;
|
||||||
|
while (pattern.test(x)) x = x.replace(pattern, "$1,$2");
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getblocky(address) {
|
||||||
|
var blockiesData = blockies
|
||||||
|
.create({
|
||||||
|
seed: address.toLowerCase(),
|
||||||
|
size: 8,
|
||||||
|
scale: 4,
|
||||||
|
})
|
||||||
|
.toDataURL();
|
||||||
|
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import StakeSuccessToast from "@/components/toasts/StakeSuccessToast.vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
|
const toast = useToast();
|
||||||
|
|
||||||
|
export 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: {
|
||||||
|
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,
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,9 +1,33 @@
|
|||||||
import './assets/sass/main.sass'
|
import './assets/sass/main.sass'
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
import { useUniswapStore } from "@/stores/uniswap";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
|
||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
import { createPinia } from 'pinia'
|
import { createPinia } from 'pinia'
|
||||||
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
|
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
|
||||||
|
|
||||||
|
import {
|
||||||
|
createConfig,
|
||||||
|
configureChains,
|
||||||
|
getNetwork,
|
||||||
|
watchAccount,
|
||||||
|
watchContractEvent,
|
||||||
|
watchNetwork,
|
||||||
|
getWalletClient,
|
||||||
|
} from "@wagmi/core";
|
||||||
|
import { WalletConnectConnector } from "@wagmi/core/connectors/walletConnect";
|
||||||
|
import { MetaMaskConnector } from "@wagmi/core/connectors/metaMask";
|
||||||
|
import { CoinbaseWalletConnector } from "@wagmi/core/connectors/coinbaseWallet";
|
||||||
|
import { InjectedConnector } from "@wagmi/core/connectors/injected";
|
||||||
|
|
||||||
|
import { goerli, mainnet } from "@wagmi/core/chains";
|
||||||
|
import { publicProvider } from "@wagmi/core/providers/public";
|
||||||
|
import { alchemyProvider } from "@wagmi/core/providers/alchemy";
|
||||||
|
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
|
|
||||||
@@ -14,20 +38,189 @@ import { library } from '@fortawesome/fontawesome-svg-core'
|
|||||||
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
|
||||||
|
|
||||||
/* import specific icons */
|
/* import specific icons */
|
||||||
import { faArrowDown, faSpinner ,faPlus } from "@fortawesome/free-solid-svg-icons";
|
import { faArrowDown, faArrowRight, faSpinner, faPlus, faCaretLeft, faCaretRight, faBars, faAnglesRight, faChevronDown, faChevronUp, faArrowRightToBracket, faArrowRightFromBracket, faDroplet, faMoon, faPerson, faWallet } from "@fortawesome/free-solid-svg-icons";
|
||||||
|
|
||||||
import { faDiscord, faTwitter, faTelegram } from "@fortawesome/free-brands-svg-icons";
|
import { faDiscord, faTwitter, faTelegram } from "@fortawesome/free-brands-svg-icons";
|
||||||
|
|
||||||
|
import Toast from "vue-toastification";
|
||||||
|
// Import the CSS or use your own!
|
||||||
|
import "vue-toastification/dist/index.css";
|
||||||
|
|
||||||
/* add icons to the library */
|
/* add icons to the library */
|
||||||
library.add(faArrowDown, faDiscord, faTwitter, faTelegram, faSpinner, faPlus);
|
library.add(
|
||||||
|
faArrowDown,
|
||||||
|
faArrowRight,
|
||||||
|
faDiscord,
|
||||||
|
faTwitter,
|
||||||
|
faTelegram,
|
||||||
|
faSpinner,
|
||||||
|
faPlus,
|
||||||
|
faCaretLeft,
|
||||||
|
faCaretRight,
|
||||||
|
faBars,
|
||||||
|
faAnglesRight,
|
||||||
|
faArrowRightToBracket,
|
||||||
|
faArrowRightFromBracket,
|
||||||
|
faChevronDown,
|
||||||
|
faChevronUp,
|
||||||
|
faDroplet,
|
||||||
|
faMoon,
|
||||||
|
faPerson,
|
||||||
|
faWallet
|
||||||
|
);
|
||||||
|
|
||||||
|
var logging = localStorage.getItem("LOGGING");
|
||||||
|
if (logging === "true") {
|
||||||
|
} else {
|
||||||
|
if (!window.console) window.console = {};
|
||||||
|
var methods = ["log", "debug", "warn", "info"];
|
||||||
|
for (let i = 0; i < methods.length; i++) {
|
||||||
|
console[methods[i]] = function () {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const app = createApp(App)
|
const app = createApp(App)
|
||||||
|
|
||||||
|
|
||||||
const pinia = createPinia();
|
const pinia = createPinia();
|
||||||
pinia.use(piniaPluginPersistedstate);
|
pinia.use(piniaPluginPersistedstate);
|
||||||
|
|
||||||
app.use(pinia);
|
app.use(pinia);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.use(Toast, {
|
||||||
|
transition: "Vue-Toastification__fade",
|
||||||
|
containerClassName: "bloodline-toast-container",
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const uniswapStore = useUniswapStore();
|
||||||
|
|
||||||
|
const goerliKey = import.meta.env.VITE_GOERLI_KEY;
|
||||||
|
const projectId = "d8e5ecb0353c02e21d4c0867d4473ac5";
|
||||||
|
console.log("hier chains");
|
||||||
|
const { chains, publicClient, webSocketPublicClient } = configureChains(
|
||||||
|
[goerli, mainnet],
|
||||||
|
[alchemyProvider({ apiKey: goerliKey }), publicProvider()]
|
||||||
|
);
|
||||||
|
|
||||||
|
walletStore.config = createConfig({
|
||||||
|
autoConnect: true,
|
||||||
|
connectors: [
|
||||||
|
new CoinbaseWalletConnector({
|
||||||
|
chains,
|
||||||
|
options: {
|
||||||
|
appName: "wagmi demo",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
new MetaMaskConnector({ chains }),
|
||||||
|
new InjectedConnector({
|
||||||
|
chains,
|
||||||
|
getProvider: () => (typeof window !== "undefined" ? window.myInjectedWallet : undefined),
|
||||||
|
}),
|
||||||
|
new WalletConnectConnector({
|
||||||
|
chains,
|
||||||
|
options: {
|
||||||
|
projectId: projectId,
|
||||||
|
showQrModal: true,
|
||||||
|
metadata: {
|
||||||
|
name: "Bloodline-App",
|
||||||
|
description: "TODO Bloodline Description",
|
||||||
|
url: "https://gitea.loseyourip.com/",
|
||||||
|
icons: ["https://gitea.loseyourip.com/assets/img/vampir.png"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
publicClient,
|
||||||
|
webSocketPublicClient,
|
||||||
|
});
|
||||||
|
walletStore.publicClient = publicClient;
|
||||||
|
|
||||||
|
watchContractEvent(
|
||||||
|
{
|
||||||
|
address: memeBurnerStore.config.contractAddress,
|
||||||
|
abi: memeBurnerStore.config.abi,
|
||||||
|
eventName: "MemeSacrificed",
|
||||||
|
},
|
||||||
|
async (log) => {
|
||||||
|
console.log("memeSacrificedEvent", log);
|
||||||
|
const token = log[0].args.sacrificedToken;
|
||||||
|
await cycleStore.updateCurrentCycle(token);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
watchContractEvent(
|
||||||
|
{
|
||||||
|
address: rewardLockerStore.config.contractAddress,
|
||||||
|
abi: rewardLockerStore.config.abi,
|
||||||
|
eventName: "CycleCompleted",
|
||||||
|
},
|
||||||
|
async (log) => {
|
||||||
|
console.log("CycleCompleted", log);
|
||||||
|
await cycleStore.fillCycle(cycleStore.currentCycle, true);
|
||||||
|
cycleStore.currentCycle++;
|
||||||
|
await cycleStore.fillCycle(cycleStore.currentCycle, true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
watchAccount(async (account) => {
|
||||||
|
console.log("watchAccount", account);
|
||||||
|
|
||||||
|
// {chainId: }
|
||||||
|
if (account.address) {
|
||||||
|
walletStore.address = account.address;
|
||||||
|
walletStore.connected = true;
|
||||||
|
let chainObject = walletStore.chain;
|
||||||
|
if (!walletStore.chain) {
|
||||||
|
const { chain, chains } = getNetwork();
|
||||||
|
chainObject = chain;
|
||||||
|
}
|
||||||
|
var walletClient = await getWalletClient({
|
||||||
|
account: account.address,
|
||||||
|
chainId: chainObject.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
walletStore.walletClient = walletClient;
|
||||||
|
|
||||||
|
await memeBurnerStore.init();
|
||||||
|
await tokenStore.initV2();
|
||||||
|
await rewardLockerStore.init();
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
// console.log("cycleStore.currentCycle", cycleStore.currentCycle);
|
||||||
|
// await cycleStore.fillCycle(cycleStore.currentCycle);
|
||||||
|
await uniswapStore.init();
|
||||||
|
} else {
|
||||||
|
walletStore.address = null;
|
||||||
|
walletStore.connected = false;
|
||||||
|
walletStore.walletClient = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
watchNetwork((network) => {
|
||||||
|
if (network.chain) {
|
||||||
|
walletStore.chain = network.chain;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
await walletStore.init();
|
||||||
|
await tokenStore.initV2();
|
||||||
|
await memeBurnerStore.init();
|
||||||
|
await rewardLockerStore.init();
|
||||||
|
await memeBurnerStore.init();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("main-init", error)
|
||||||
|
}
|
||||||
|
|
||||||
app.use(router)
|
app.use(router)
|
||||||
app.component('font-awesome-icon', FontAwesomeIcon)
|
app.component('font-awesome-icon', FontAwesomeIcon)
|
||||||
app.mount('#app')
|
app.mount('#app')
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { createRouter, createWebHistory } from 'vue-router'
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
import HomeView from '../views/HomeView.vue'
|
import HomeView from '../views/HomeView.vue'
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(import.meta.env.BASE_URL),
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
@@ -22,7 +24,42 @@ const router = createRouter({
|
|||||||
name: "Test",
|
name: "Test",
|
||||||
component: () => import("../views/TestView.vue"),
|
component: () => import("../views/TestView.vue"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/wagmi",
|
||||||
|
name: "Wagmi",
|
||||||
|
component: () => import("../views/WagmiView.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/profile",
|
||||||
|
name: "profile",
|
||||||
|
meta: {
|
||||||
|
middleware: ["connected"],
|
||||||
|
},
|
||||||
|
component: () => import("../views/ProfileView.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/cycle",
|
||||||
|
name: "cycle",
|
||||||
|
meta: {
|
||||||
|
middleware: ["connected"],
|
||||||
|
},
|
||||||
|
component: () => import("../views/CycleView.vue"),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.beforeEach(async (to, from) => {
|
||||||
|
//init
|
||||||
|
|
||||||
|
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
//middleware
|
||||||
|
// if (to.meta.middleware) {
|
||||||
|
// if (!walletStore.connected) {
|
||||||
|
// return '/';
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import { defineStore } from "pinia";
|
|
||||||
export const useContractStore = defineStore("contracts", {
|
|
||||||
state: () => ({
|
|
||||||
list: {
|
|
||||||
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
getters: {
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
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 useCycleStore = defineStore("cycles", {
|
||||||
|
state: () => ({
|
||||||
|
cycles: [],
|
||||||
|
activeCycle: null,
|
||||||
|
currentCycle: null,
|
||||||
|
}),
|
||||||
|
getters: {
|
||||||
|
//cycle winner is the token who reached the goal
|
||||||
|
//todo winner is now in the cycle object, no reason for that function anymore
|
||||||
|
getCycleWinner() {
|
||||||
|
const goal = this.getCurrentCycleData?.goal;
|
||||||
|
if (!goal) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const winnerCoin = this.cycles[this.activeCycle]?.token.find((token) => token.amount === goal);
|
||||||
|
if (winnerCoin) {
|
||||||
|
return winnerCoin;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getCurrentCycleData() {
|
||||||
|
return this.cycles[this.activeCycle];
|
||||||
|
},
|
||||||
|
rewardsSacrifice() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_sacrifice) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_sacrifice / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
},
|
||||||
|
rewardsStaking() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_staking) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_staking / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
},
|
||||||
|
rewardsClan() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_clan) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_clan / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
},
|
||||||
|
rewardsTotal() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_total) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_total / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
//todo check if still needed
|
||||||
|
// async loadRewardsCycles() {
|
||||||
|
// const walletStore = useWalletStoreV2();
|
||||||
|
// const rewardLockerStore = useRewardLockerStore();
|
||||||
|
|
||||||
|
// console.log("this.currentCycle", this.currentCycle);
|
||||||
|
// const contracts = [];
|
||||||
|
// for (let index = 0; index < this.currentCycle; index++) {
|
||||||
|
// console.log("load cycle: " + index);
|
||||||
|
// console.log({ index, address: walletStore.address });
|
||||||
|
// contracts.push({
|
||||||
|
// ...rewardLockerStore.contract,
|
||||||
|
// functionName: "getTotalRewardsOf",
|
||||||
|
// args: [walletStore.address, [index + 1]],
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const data = await multicall({
|
||||||
|
// contracts,
|
||||||
|
// });
|
||||||
|
// for (let index = 0; index < data.length; index++) {
|
||||||
|
// const element = data[index];
|
||||||
|
// if (!this.cycles[index]) {
|
||||||
|
// this.cycles[index] = {};
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
//todo check if needed, or use fillcycle
|
||||||
|
async updateCurrentCycle(sacrificedToken) {
|
||||||
|
console.log("updateCurrentCycle");
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
// TODO: Could be combined in one multicall and could be simplified to request data only for sacrificedToken
|
||||||
|
var data = await memeBurnerStore.getSacrificedCycle(this.currentCycle);
|
||||||
|
var tokenTotalSacrificed = await rewardLockerStore.getTotalSacrificeRewardsForAllToken(this.currentCycle);
|
||||||
|
console.log("this.currentCycle", this.currentCycle);
|
||||||
|
console.log("this.cycles", this.cycles);
|
||||||
|
if (this.cycles[this.currentCycle]) {
|
||||||
|
var tokenIndex = this.cycles[this.currentCycle].token.findIndex(
|
||||||
|
(tokenData) => tokenData.contractAddress === sacrificedToken
|
||||||
|
);
|
||||||
|
this.cycles[this.currentCycle].token[tokenIndex].amount = data[tokenIndex].result[1];
|
||||||
|
// was missed update totalSacrificeRewards for sacrificedToken
|
||||||
|
this.cycles[this.currentCycle].token[tokenIndex].amountInBLD = tokenTotalSacrificed[tokenIndex].result;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* main function to fill a round, will not be filled when already loaded
|
||||||
|
* you can use the refillcycle to overwrite information, because if you claim or stake the values will change
|
||||||
|
*/
|
||||||
|
async fillCycle(cycleNumber, refillCycle = false) {
|
||||||
|
console.log("fillCycle", cycleNumber);
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
if (!this.cycles[cycleNumber]?.goal || refillCycle || !this.cycles[cycleNumber]?.connected) {
|
||||||
|
console.log("fill cycle");
|
||||||
|
|
||||||
|
//multicall getSacrificedMeme for each token for this cycle
|
||||||
|
var data = await memeBurnerStore.getSacrificedCycle(cycleNumber);
|
||||||
|
let rewardData = null;
|
||||||
|
|
||||||
|
if (walletStore.connected) {
|
||||||
|
//getRewards multicall for all tokens
|
||||||
|
rewardData = await rewardLockerStore.getRewardsForAllToken(cycleNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("hier");
|
||||||
|
//getTotalSacrificeRewardsForToken multicall for all tokens
|
||||||
|
const tokenTotalSacrificed = await rewardLockerStore.getTotalSacrificeRewardsForAllToken(cycleNumber);
|
||||||
|
console.log("hier1");
|
||||||
|
var goal = await memeBurnerStore.getGoal(cycleNumber);
|
||||||
|
console.log("hier123");
|
||||||
|
var tokenArray = [];
|
||||||
|
var rewards_clan = 0n;
|
||||||
|
var rewards_sacrifice = 0n;
|
||||||
|
var rewards_staking = 0n;
|
||||||
|
|
||||||
|
console.log("hier123");
|
||||||
|
for (let index = 0; index < data.length; index++) {
|
||||||
|
var tokenData = {};
|
||||||
|
const token = tokenStore.token[index];
|
||||||
|
//why no multicall? todo
|
||||||
|
var coefficent = await rewardLockerStore.getSacrificedTokenCoefficient(
|
||||||
|
cycleNumber,
|
||||||
|
token.contractAddress
|
||||||
|
);
|
||||||
|
console.log("coefficent", coefficent);
|
||||||
|
tokenData.name = token.name;
|
||||||
|
tokenData.contractAddress = token.contractAddress;
|
||||||
|
tokenData.vamplogo = token.vamp.logo;
|
||||||
|
tokenData.vampwinner = token.vamp.winner;
|
||||||
|
tokenData.vampwinner2 = token.vamp.winner2;
|
||||||
|
tokenData.vampname = token.vamp.name;
|
||||||
|
tokenData.amount = data[index].result[1];
|
||||||
|
tokenData.amountInBLD = tokenTotalSacrificed[index].result;
|
||||||
|
|
||||||
|
if (walletStore.connected) {
|
||||||
|
//if user is connected fill user specific data for the token
|
||||||
|
const sacrificeClanReward = rewardData[index].result[1];
|
||||||
|
let clanwin = 0n;
|
||||||
|
if (cycleNumber !== this.currentCycle) {
|
||||||
|
// previous version would not work due to missing remainder
|
||||||
|
clanwin = (sacrificeClanReward * coefficent / 10000n) - sacrificeClanReward;
|
||||||
|
console.log("clanwin", clanwin);
|
||||||
|
}
|
||||||
|
const sacrificeRewards = sacrificeClanReward;
|
||||||
|
|
||||||
|
tokenData.rewards_ges = rewardData[index].result[1] + rewardData[index].result[0];
|
||||||
|
|
||||||
|
tokenData.rewards_clan = clanwin;
|
||||||
|
|
||||||
|
tokenData.rewards_staking = rewardData[index].result[0];
|
||||||
|
tokenData.rewards_sacrifice = sacrificeRewards;
|
||||||
|
|
||||||
|
console.log("rewards_clan", rewards_clan);
|
||||||
|
console.log("tokenData.rewards_clan", tokenData.rewards_clan);
|
||||||
|
console.log("tokenData.rewards_sacrifice", tokenData.rewards_sacrifice);
|
||||||
|
rewards_clan = rewards_clan + tokenData.rewards_clan;
|
||||||
|
rewards_sacrifice = rewards_sacrifice + tokenData.rewards_sacrifice;
|
||||||
|
rewards_staking = rewards_staking + tokenData.rewards_staking;
|
||||||
|
}
|
||||||
|
tokenArray.push(tokenData);
|
||||||
|
}
|
||||||
|
|
||||||
|
const goalDecimal = goal[0];
|
||||||
|
const winner = tokenArray.find((token) => token.amount === goalDecimal);
|
||||||
|
const goalInBLD = await memeBurnerStore.getGoalInBLOOD(cycleNumber);
|
||||||
|
//replace vamplogo cause it will automatically change the token for the cycle view (new design)
|
||||||
|
if (winner) {
|
||||||
|
winner.vamplogo = winner.vampwinner;
|
||||||
|
}
|
||||||
|
this.cycles[cycleNumber] = {
|
||||||
|
goal: goal[0],
|
||||||
|
goalInBLD: goalInBLD,
|
||||||
|
expirationTimestamp: goal[2],
|
||||||
|
rewards_clan: rewards_clan,
|
||||||
|
rewards_staking: rewards_staking,
|
||||||
|
rewards_sacrifice: rewards_sacrifice,
|
||||||
|
rewards_total: rewards_clan + rewards_sacrifice + rewards_staking,
|
||||||
|
token: tokenArray,
|
||||||
|
connected: walletStore.connected,
|
||||||
|
winner: winner,
|
||||||
|
};
|
||||||
|
console.log("this.cycles[cycleNumber]", this.cycles[cycleNumber]);
|
||||||
|
} else {
|
||||||
|
console.log("cycle already filled");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getFinshedCycleNumbers() {
|
||||||
|
const array = [];
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const lastCompletedCycle = await rewardLockerStore.lastCompletedCycle();
|
||||||
|
// Question: cycle 0 doesn't exist, does it make sense to start from index 1?
|
||||||
|
for (let index = 0; index <= Number(lastCompletedCycle); index++) {
|
||||||
|
array.push(index);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import MemeAltarJson from "@/assets/contracts/MemeAltar.json";
|
||||||
|
import { useTokenStore } from "./tokens";
|
||||||
|
import { useWalletStoreV2 } from "./walletV2";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
|
||||||
|
import { multicall, getContract, fetchToken, waitForTransaction, getWalletClient } from "@wagmi/core";
|
||||||
|
|
||||||
|
|
||||||
|
export const useMemeburnerStore = defineStore("memeburner", {
|
||||||
|
state: () => ({
|
||||||
|
config: MemeAltarJson,
|
||||||
|
contract: null,
|
||||||
|
loading: false,
|
||||||
|
}),
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
async init() {
|
||||||
|
console.log("-----------init memeburner-------------");
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
// const cycleStore = useCycleStore();
|
||||||
|
console.log("walletStore.walletClient", walletStore.walletClient);
|
||||||
|
this.contract = getContract({
|
||||||
|
address: this.config.contractAddress,
|
||||||
|
abi: this.config.abi,
|
||||||
|
walletClient: walletStore.walletClient || walletStore.publicClient,
|
||||||
|
});
|
||||||
|
console.log("this.contract", this.contract);
|
||||||
|
},
|
||||||
|
async getRewardFor(amount) {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const rewards = await this.contract.read.getRewardForSacrifice([
|
||||||
|
tokenStore.activeToken.contractAddress,
|
||||||
|
amount,
|
||||||
|
]);
|
||||||
|
console.log("amount", amount);
|
||||||
|
console.log("rewards", rewards);
|
||||||
|
return rewards;
|
||||||
|
},
|
||||||
|
async getCurrentCycle() {
|
||||||
|
return await this.contract.read.currentCycle();
|
||||||
|
},
|
||||||
|
async getGoal(cycleNumber) {
|
||||||
|
console.log("hier123", cycleNumber);
|
||||||
|
return await this.contract.read.cycles([cycleNumber]);
|
||||||
|
},
|
||||||
|
//returns participated, amount achieved
|
||||||
|
async getSacrificedMeme(cycleNumber, tokenAddress) {
|
||||||
|
return await this.contract.read.getSacrificedMeme([cycleNumber, tokenAddress]);
|
||||||
|
},
|
||||||
|
async getAmountToReachGoal(tokenAddress) {
|
||||||
|
return await this.contract.read.getAmountToReachGoal([tokenAddress]);
|
||||||
|
},
|
||||||
|
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,
|
||||||
|
functionName: "getSacrificedMeme",
|
||||||
|
args: [cycleNumber, token.contractAddress],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// console.log("this.contract", this.contract);
|
||||||
|
// const multicallStore = useMultiCallStore();
|
||||||
|
// return await multicallStore.aggregate(calls);
|
||||||
|
const data = await multicall({
|
||||||
|
contracts,
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
async sacrificeMeme(amount, minETH) {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
try {
|
||||||
|
if (!amount || amount == 0) {
|
||||||
|
//todo error
|
||||||
|
console.error("amount is 0 or null or undefined");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
|
||||||
|
var hash = await this.contract.write.sacrificeMeme([
|
||||||
|
tokenStore.activeToken.contractAddress,
|
||||||
|
amount,
|
||||||
|
minETH
|
||||||
|
]);
|
||||||
|
return hash;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
this.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async sacrificeMemeAndBuyBLOOD(amount, minBLOOD) {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const amountDecimal = BigInt(amount) * 10n ** BigInt(tokenStore.activeToken.decimals);
|
||||||
|
var hash = await this.contract.write.sacrificeMemeAndBuyBLOOD([
|
||||||
|
tokenStore.activeToken.contractAddress,
|
||||||
|
amountDecimal.toString(),
|
||||||
|
minBLOOD.toString()
|
||||||
|
]);
|
||||||
|
return hash;
|
||||||
|
},
|
||||||
|
async getGoalInBLOOD(cycleNumber) {
|
||||||
|
return await this.contract.read.getGoalInBLOOD([cycleNumber]);
|
||||||
|
},
|
||||||
|
async getAmountETHBase(amount) {
|
||||||
|
console.log("getAmountETHBase");
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
return await this.contract.read.getAmountETHBase([tokenStore.activeToken.contract.address, amount, true]);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import RewardLockerJson from "@/assets/contracts/RewardLocker.json";
|
||||||
|
import { useTokenStore } from "./tokens";
|
||||||
|
import { useWalletStoreV2 } from "./walletV2";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { createPermitObject, getSignatureRSV } from "@/helper/blockchain.js";
|
||||||
|
import { multicall, getContract, signTypedData, getAccount, waitForTransaction } from "@wagmi/core";
|
||||||
|
|
||||||
|
|
||||||
|
export const useRewardLockerStore = defineStore("rewardlocker", {
|
||||||
|
state: () => ({
|
||||||
|
config: RewardLockerJson,
|
||||||
|
contract: null,
|
||||||
|
ethcontract: null,
|
||||||
|
}),
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
async init() {
|
||||||
|
console.log("-----------init rewardlocker-------------");
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
this.contract = getContract({
|
||||||
|
address: this.config.contractAddress,
|
||||||
|
abi: this.config.abi,
|
||||||
|
walletClient: walletStore.walletClient || walletStore.publicClient,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* @param {*} walletAddress
|
||||||
|
* @param {*} cycleNumber
|
||||||
|
* @param {*} tokenAddress
|
||||||
|
* @returns Rewards for specific token and specific cycle
|
||||||
|
*/
|
||||||
|
async getRewards(walletAddress, cycleNumber, tokenAddress) {
|
||||||
|
try {
|
||||||
|
// rewards function doesn't exist, getRewards instead
|
||||||
|
return await this.contract.read.getRewards([walletAddress, cycleNumber, tokenAddress]);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("getRewards", error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
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, cycleNumber, token.contractAddress));
|
||||||
|
contracts.push({
|
||||||
|
...this.contract,
|
||||||
|
functionName: "getRewards",
|
||||||
|
args: [walletStore.address, cycleNumber, token.contractAddress],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const data = await multicall({
|
||||||
|
contracts,
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
async getTotalSacrificeRewardsForAllToken(cycleNumber) {
|
||||||
|
try {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const contracts = [];
|
||||||
|
for (let index = 0; index < tokenStore.sacrificeToken.length; index++) {
|
||||||
|
const token = tokenStore.sacrificeToken[index];
|
||||||
|
contracts.push({
|
||||||
|
...this.contract,
|
||||||
|
functionName: "getTotalSacrificeRewardsForToken",
|
||||||
|
args: [cycleNumber, token.contractAddress],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const data = await multicall({
|
||||||
|
contracts,
|
||||||
|
});
|
||||||
|
// const multicallStore = useMultiCallStore();
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getSacrificedTokenCoefficient(cycleNumber, sacrificedToken) {
|
||||||
|
return await this.contract.read.getSacrificedTokenCoefficient([cycleNumber, sacrificedToken]);
|
||||||
|
},
|
||||||
|
async getStakeRewardForSacrificeReward(sacrificedToken, reward) {
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
return await this.contract.read.getStakeRewardForSacrificeReward([
|
||||||
|
walletStore.address,
|
||||||
|
sacrificedToken,
|
||||||
|
reward,
|
||||||
|
]);
|
||||||
|
|
||||||
|
},
|
||||||
|
async lastCompletedCycle() {
|
||||||
|
return await this.contract.read.lastCompletedCycle();
|
||||||
|
},
|
||||||
|
async claim(cycle) {
|
||||||
|
console.log("claim");
|
||||||
|
return await this.contract.write.claim([cycle]);
|
||||||
|
},
|
||||||
|
async claimAll() {
|
||||||
|
console.log("claimAll");
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const account = getAccount();
|
||||||
|
console.log("acocunt", account);
|
||||||
|
|
||||||
|
const cycles = await cycleStore.getFinshedCycleNumbers();
|
||||||
|
return await this.contract.write.claim([cycles]);
|
||||||
|
},
|
||||||
|
async getTotalRewardsOf(address, cycles) {
|
||||||
|
return await this.contract.read.getTotalRewardsOf([address, cycles]);
|
||||||
|
},
|
||||||
|
async getTotalRewards(address) {
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const cycles = await cycleStore.getFinshedCycleNumbers();
|
||||||
|
return await this.contract.read.getTotalRewardsOf([address, cycles]);
|
||||||
|
},
|
||||||
|
async getStaked(address) {
|
||||||
|
return await this.contract.read.staked([address]);
|
||||||
|
},
|
||||||
|
async getUnstakeOrdered(address, cycleNumber) {
|
||||||
|
// returns unstake amount of BDL ordered and ready to be unstaked in a cycleNumber
|
||||||
|
return await this.contract.read.unstakeOrdered([cycleNumber,address]);
|
||||||
|
},
|
||||||
|
async orderUnstake() {
|
||||||
|
return await this.contract.write.orderUnstake();
|
||||||
|
},
|
||||||
|
async unstake(unstakeCycle) {
|
||||||
|
return await this.contract.write.unstake([unstakeCycle]);
|
||||||
|
},
|
||||||
|
async stakeBloodline(tokenNumber) {
|
||||||
|
console.log("tokenNumber", tokenNumber);
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const fromAddress = walletStore.address;
|
||||||
|
const spender = this.config.contractAddress;
|
||||||
|
// timestamp is denominated in seconds
|
||||||
|
const deadline = BigInt(Date.now()) / 1000n + 1200n;
|
||||||
|
const decimals = tokenStore.getToken(walletStore.memeToken.contractAddress).decimals;
|
||||||
|
const value = BigInt(tokenNumber) * 10n ** decimals;
|
||||||
|
const nonce = await tokenStore.memeToken.contract.read.nonces([fromAddress]);
|
||||||
|
console.log("nonce", nonce);
|
||||||
|
const { types, message, domain, primaryType } = createPermitObject(
|
||||||
|
fromAddress,
|
||||||
|
spender,
|
||||||
|
nonce,
|
||||||
|
deadline,
|
||||||
|
value
|
||||||
|
);
|
||||||
|
|
||||||
|
const signature = await signTypedData({
|
||||||
|
domain: domain,
|
||||||
|
message: message,
|
||||||
|
primaryType: primaryType,
|
||||||
|
types: types,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { r, s, v } = getSignatureRSV(signature);
|
||||||
|
console.log("value, deadline, v, r, s", value, deadline, v, r, s);
|
||||||
|
const hash = await this.contract.write.stakeToBeSecured([value, deadline, v, r, s]);
|
||||||
|
return hash;
|
||||||
|
},
|
||||||
|
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, [cycle], addresses]);
|
||||||
|
return hash;
|
||||||
|
},
|
||||||
|
async stakeAndClaimAllCycles(stakeCoefficient) {
|
||||||
|
console.log("stakeAndClaimAllCycles", stakeCoefficient);
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const cycles = await cycleStore.getFinshedCycleNumbers();
|
||||||
|
const addresses = tokenStore.sacrificeToken.map((obj) => obj.contractAddress);
|
||||||
|
const hash = await this.contract.write.stakeAndClaim([stakeCoefficient, cycles, addresses]);
|
||||||
|
return hash;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { useUniswapStore } from "@/stores/uniswap";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
|
||||||
|
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { waitForTransaction, readContract, watchBlockNumber, multicall } from "@wagmi/core";
|
||||||
|
import { showSuccessToast } from "@/helper/toast.js";
|
||||||
|
import { formatNumber, formatBigIntDivision } from "@/helper/helper.js";
|
||||||
|
|
||||||
|
export const useSacrificeStore = defineStore("sacrifice", {
|
||||||
|
state: () => ({
|
||||||
|
sacrificeNumber: 0n,
|
||||||
|
sacrificeState: 0,
|
||||||
|
}),
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
async sacrificeToken(amount, token) {
|
||||||
|
console.log("sacrificeToken", { amount, token });
|
||||||
|
|
||||||
|
const memeburnerStore = useMemeburnerStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.sacrificeState = 2;
|
||||||
|
console.log("hier");
|
||||||
|
const getRewards = await this.getRewardsFor(amount, token);
|
||||||
|
console.log("hier1");
|
||||||
|
console.log("getRewards", getRewards);
|
||||||
|
let hash = null;
|
||||||
|
if (getRewards.variant === "sacrifice") {
|
||||||
|
console.log("sacrifice");
|
||||||
|
hash = await memeburnerStore.sacrificeMeme(amount, getRewards.minETH);
|
||||||
|
console.log("hash", hash);
|
||||||
|
} else {
|
||||||
|
console.log("buy");
|
||||||
|
hash = await memeburnerStore.sacrificeMemeAndBuyBLOOD(amount, getRewards.minBLOOD);
|
||||||
|
console.log("hash", hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sacrificeState = 3;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
onReplaced: (transaction) => console.log("check transaction canceled", transaction),
|
||||||
|
});
|
||||||
|
console.log("data", data);
|
||||||
|
|
||||||
|
// var rewardData = data.logs.find((logObject) => {
|
||||||
|
// return logObject.topics.find(
|
||||||
|
// (topic) => topic === "0x5e60ccd3c81486143d815dce24867a494d7fee585a0a44282cf479b19a5186ee"
|
||||||
|
// );
|
||||||
|
// });
|
||||||
|
|
||||||
|
var rewardData = data.logs.filter((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0x5e60ccd3c81486143d815dce24867a494d7fee585a0a44282cf479b19a5186ee"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
//output
|
||||||
|
let outputSacrifice = rewardData.reduce((x, y) => {
|
||||||
|
return x + BigInt(y.data);
|
||||||
|
}, 0n);
|
||||||
|
outputSacrifice = formatBigIntDivision(outputSacrifice, 10n ** token.decimals);
|
||||||
|
|
||||||
|
console.log("outputSacrifice", outputSacrifice);
|
||||||
|
token.allowance = await tokenStore.allowance();
|
||||||
|
this.sacrificeState = 4;
|
||||||
|
|
||||||
|
showSuccessToast(
|
||||||
|
outputSacrifice,
|
||||||
|
"Success!",
|
||||||
|
"You turned your meme into:",
|
||||||
|
"You can claim once the current cycle is finished and your clan bonus was calculated."
|
||||||
|
);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
console.log("cycleStore.currentCycle", cycleStore.currentCycle);
|
||||||
|
await cycleStore.fillCycle(cycleStore.currentCycle, true);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
//we should show the user an issue
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
this.sacrificeState = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getRewardsFor(amount, token) {
|
||||||
|
console.log("getRewardsFor", {amount, token});
|
||||||
|
const memeburnerStore = useMemeburnerStore();
|
||||||
|
const uniswapStore = useUniswapStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
let output = 0;
|
||||||
|
|
||||||
|
let minBLOOD;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (!amount) {
|
||||||
|
this.sacrificeState = 0;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
const amountETHBase = await memeburnerStore.getAmountETHBase(amount);
|
||||||
|
// take 99.5% of amount ETH got for selling meme, 0.5% allowed slippage
|
||||||
|
const minETH = (amountETHBase[1] * 995n) / 1000n;
|
||||||
|
|
||||||
|
const rewardsForResult = await memeburnerStore.getRewardFor(amount);
|
||||||
|
const rewardsForResultSum = rewardsForResult[0] + rewardsForResult[1];
|
||||||
|
// quote blood amount against ETH base amount
|
||||||
|
var quoteRewards = await uniswapStore.quoteExactInputSingle(amount, amountETHBase[0]);
|
||||||
|
|
||||||
|
let variant = "sacrifice";
|
||||||
|
if (quoteRewards.result) {
|
||||||
|
// take 99.5% of quoted amount, 0.5% allowed slippage
|
||||||
|
minBLOOD = quoteRewards.amount * 995n / 1000n;
|
||||||
|
|
||||||
|
if (quoteRewards.amount * 95n / 100n > rewardsForResultSum) {
|
||||||
|
variant = "buy";
|
||||||
|
console.log("use Buy-function", {
|
||||||
|
quoteRewardsNumber: quoteRewards.amount,
|
||||||
|
rewardsForResultSum,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log("use sacrifice-function", {
|
||||||
|
quoteRewardsNumber: quoteRewards.amount,
|
||||||
|
rewardsForResultSum,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* case 4
|
||||||
|
* quoter threw an error
|
||||||
|
*/
|
||||||
|
//
|
||||||
|
output = rewardsForResultSum;
|
||||||
|
}
|
||||||
|
console.log("variant", variant);
|
||||||
|
console.log("amount", amount);
|
||||||
|
if (!walletStore.connected || (walletStore.connected && token.allowance < amount)) {
|
||||||
|
/**
|
||||||
|
* case 1
|
||||||
|
* user is not logged in or Allowance is less than Input, then I show getRewardsForSacrifice Value
|
||||||
|
* variante not relevant
|
||||||
|
*/
|
||||||
|
output = rewardsForResultSum;
|
||||||
|
if (variant === "buy") {
|
||||||
|
output = quoteRewards.amount
|
||||||
|
}
|
||||||
|
} else if (walletStore.connected && variant === "sacrifice") {
|
||||||
|
/**
|
||||||
|
* case 2
|
||||||
|
* user is logged in and allowance is greater or equal input and variant is sacrifice
|
||||||
|
*/
|
||||||
|
output = rewardsForResultSum;
|
||||||
|
} else if (walletStore.connected && variant === "buy") {
|
||||||
|
/**
|
||||||
|
* case 3
|
||||||
|
* user is logged in and allowance is greater or equal input and variant is buy
|
||||||
|
* compare sacrificeMeme-result and sacrificeMemeAndBuyBLOOD-result
|
||||||
|
*/
|
||||||
|
const amountSacrifice = await readContract({
|
||||||
|
address: memeburnerStore.contract.address,
|
||||||
|
abi: memeburnerStore.contract.abi,
|
||||||
|
functionName: "sacrificeMeme",
|
||||||
|
args: [token.contractAddress, amount.toString(), minETH.toString()],
|
||||||
|
account: walletStore.address,
|
||||||
|
});
|
||||||
|
|
||||||
|
const amountBuy = await readContract({
|
||||||
|
address: memeburnerStore.contract.address,
|
||||||
|
abi: memeburnerStore.contract.abi,
|
||||||
|
functionName: "sacrificeMemeAndBuyBLOOD",
|
||||||
|
args: [token.contractAddress, amount.toString(), minBLOOD.toString()],
|
||||||
|
account: walletStore.address,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (amountBuy * 95n / 100n > amountSacrifice) {
|
||||||
|
variant = "buy";
|
||||||
|
output = amountBuy;
|
||||||
|
console.log("use buy after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme");
|
||||||
|
} else {
|
||||||
|
variant = "sacrifice";
|
||||||
|
output = amountSacrifice;
|
||||||
|
console.log("use sacrifice after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//potential staking rewards
|
||||||
|
let stakingRewardsNumber = 0;
|
||||||
|
if (output > 0 && walletStore.connected) {
|
||||||
|
const stakingReward = await rewardLockerStore.getStakeRewardForSacrificeReward(
|
||||||
|
token.contractAddress,
|
||||||
|
output
|
||||||
|
);
|
||||||
|
stakingRewardsNumber = stakingReward / 10n ** token.decimals
|
||||||
|
}
|
||||||
|
const outputNumber = output / 10n ** BigInt(token.decimals);
|
||||||
|
return { output: outputNumber, variant: variant, minETH: minETH, minBLOOD: minBLOOD, staking: stakingRewardsNumber };
|
||||||
|
} catch (error) {
|
||||||
|
console.error("getRewardsFor", error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,488 +1,215 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import Web3 from "web3";
|
import { markRaw } from "vue";
|
||||||
import { useWalletStore } from "./wallet";
|
import { useWalletStoreV2 } from "./walletV2";
|
||||||
import { useContractStore } from "./contracts";
|
import { useMemeburnerStore } from "./memeburner";
|
||||||
import Meme1Json from "@/assets/contracts/Meme1.json";
|
import Meme1Json from "@/assets/contracts/Meme1.json";
|
||||||
import Meme2Json from "@/assets/contracts/Meme2.json";
|
import Meme2Json from "@/assets/contracts/Meme2.json";
|
||||||
import MemeBurnerJson from "@/assets/contracts/MemeBurner.json";
|
import Meme3Json from "@/assets/contracts/Meme3.json";
|
||||||
|
import Meme4Json from "@/assets/contracts/Meme4.json";
|
||||||
|
import Meme5Json from "@/assets/contracts/Meme5.json";
|
||||||
|
import BloodlineJson from "@/assets/contracts/Bloodline.json";
|
||||||
|
import { multicall, getContract, fetchToken, getWalletClient, waitForTransaction } from "@wagmi/core";
|
||||||
|
|
||||||
|
|
||||||
export const useTokenStore = defineStore("token", {
|
export const useTokenStore = defineStore("token", {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
|
//some static data for the coin
|
||||||
token: [
|
token: [
|
||||||
// {
|
|
||||||
// name: "PEPE",
|
|
||||||
// contractAddress: "0x6982508145454Ce325dDbE47a25d4ec3d2311933",
|
|
||||||
// abi: [
|
|
||||||
// {
|
|
||||||
// inputs: [{ internalType: "uint256", name: "_totalSupply", type: "uint256" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "constructor",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// anonymous: false,
|
|
||||||
// inputs: [
|
|
||||||
// { indexed: true, internalType: "address", name: "owner", type: "address" },
|
|
||||||
// { indexed: true, internalType: "address", name: "spender", type: "address" },
|
|
||||||
// { indexed: false, internalType: "uint256", name: "value", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "Approval",
|
|
||||||
// type: "event",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// anonymous: false,
|
|
||||||
// inputs: [
|
|
||||||
// { indexed: true, internalType: "address", name: "previousOwner", type: "address" },
|
|
||||||
// { indexed: true, internalType: "address", name: "newOwner", type: "address" },
|
|
||||||
// ],
|
|
||||||
// name: "OwnershipTransferred",
|
|
||||||
// type: "event",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// anonymous: false,
|
|
||||||
// inputs: [
|
|
||||||
// { indexed: true, internalType: "address", name: "from", type: "address" },
|
|
||||||
// { indexed: true, internalType: "address", name: "to", type: "address" },
|
|
||||||
// { indexed: false, internalType: "uint256", name: "value", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "Transfer",
|
|
||||||
// type: "event",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "owner", type: "address" },
|
|
||||||
// { internalType: "address", name: "spender", type: "address" },
|
|
||||||
// ],
|
|
||||||
// name: "allowance",
|
|
||||||
// outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "spender", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "amount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "approve",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [{ internalType: "address", name: "account", type: "address" }],
|
|
||||||
// name: "balanceOf",
|
|
||||||
// outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "_address", type: "address" },
|
|
||||||
// { internalType: "bool", name: "_isBlacklisting", type: "bool" },
|
|
||||||
// ],
|
|
||||||
// name: "blacklist",
|
|
||||||
// outputs: [],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [{ internalType: "address", name: "", type: "address" }],
|
|
||||||
// name: "blacklists",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [{ internalType: "uint256", name: "value", type: "uint256" }],
|
|
||||||
// name: "burn",
|
|
||||||
// outputs: [],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "decimals",
|
|
||||||
// outputs: [{ internalType: "uint8", name: "", type: "uint8" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "spender", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "subtractedValue", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "decreaseAllowance",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "spender", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "addedValue", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "increaseAllowance",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "limited",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "maxHoldingAmount",
|
|
||||||
// outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "minHoldingAmount",
|
|
||||||
// outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "name",
|
|
||||||
// outputs: [{ internalType: "string", name: "", type: "string" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "owner",
|
|
||||||
// outputs: [{ internalType: "address", name: "", type: "address" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "renounceOwnership",
|
|
||||||
// outputs: [],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "bool", name: "_limited", type: "bool" },
|
|
||||||
// { internalType: "address", name: "_uniswapV2Pair", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "_maxHoldingAmount", type: "uint256" },
|
|
||||||
// { internalType: "uint256", name: "_minHoldingAmount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "setRule",
|
|
||||||
// outputs: [],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "symbol",
|
|
||||||
// outputs: [{ internalType: "string", name: "", type: "string" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "totalSupply",
|
|
||||||
// outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "recipient", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "amount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "transfer",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { internalType: "address", name: "sender", type: "address" },
|
|
||||||
// { internalType: "address", name: "recipient", type: "address" },
|
|
||||||
// { internalType: "uint256", name: "amount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "transferFrom",
|
|
||||||
// outputs: [{ internalType: "bool", name: "", type: "bool" }],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [{ internalType: "address", name: "newOwner", type: "address" }],
|
|
||||||
// name: "transferOwnership",
|
|
||||||
// outputs: [],
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [],
|
|
||||||
// name: "uniswapV2Pair",
|
|
||||||
// outputs: [{ internalType: "address", name: "", type: "address" }],
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// name: "SHIBA INU",
|
|
||||||
// contractAddress: "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE",
|
|
||||||
// abi: [
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [],
|
|
||||||
// name: "name",
|
|
||||||
// outputs: [{ name: "", type: "string" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "spender", type: "address" },
|
|
||||||
// { name: "value", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "approve",
|
|
||||||
// outputs: [{ name: "", type: "bool" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [],
|
|
||||||
// name: "totalSupply",
|
|
||||||
// outputs: [{ name: "", type: "uint256" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "sender", type: "address" },
|
|
||||||
// { name: "recipient", type: "address" },
|
|
||||||
// { name: "amount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "transferFrom",
|
|
||||||
// outputs: [{ name: "", type: "bool" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [],
|
|
||||||
// name: "decimals",
|
|
||||||
// outputs: [{ name: "", type: "uint8" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "spender", type: "address" },
|
|
||||||
// { name: "addedValue", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "increaseAllowance",
|
|
||||||
// outputs: [{ name: "", type: "bool" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [{ name: "value", type: "uint256" }],
|
|
||||||
// name: "burn",
|
|
||||||
// outputs: [],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [{ name: "account", type: "address" }],
|
|
||||||
// name: "balanceOf",
|
|
||||||
// outputs: [{ name: "", type: "uint256" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [],
|
|
||||||
// name: "symbol",
|
|
||||||
// outputs: [{ name: "", type: "string" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "spender", type: "address" },
|
|
||||||
// { name: "subtractedValue", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "decreaseAllowance",
|
|
||||||
// outputs: [{ name: "", type: "bool" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: false,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "recipient", type: "address" },
|
|
||||||
// { name: "amount", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "transfer",
|
|
||||||
// outputs: [{ name: "", type: "bool" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "nonpayable",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// constant: true,
|
|
||||||
// inputs: [
|
|
||||||
// { name: "owner", type: "address" },
|
|
||||||
// { name: "spender", type: "address" },
|
|
||||||
// ],
|
|
||||||
// name: "allowance",
|
|
||||||
// outputs: [{ name: "", type: "uint256" }],
|
|
||||||
// payable: false,
|
|
||||||
// stateMutability: "view",
|
|
||||||
// type: "function",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// inputs: [
|
|
||||||
// { name: "name", type: "string" },
|
|
||||||
// { name: "symbol", type: "string" },
|
|
||||||
// { name: "decimals", type: "uint8" },
|
|
||||||
// { name: "totalSupply", type: "uint256" },
|
|
||||||
// { name: "feeReceiver", type: "address" },
|
|
||||||
// { name: "tokenOwnerAddress", type: "address" },
|
|
||||||
// ],
|
|
||||||
// payable: true,
|
|
||||||
// stateMutability: "payable",
|
|
||||||
// type: "constructor",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// anonymous: false,
|
|
||||||
// inputs: [
|
|
||||||
// { indexed: true, name: "from", type: "address" },
|
|
||||||
// { indexed: true, name: "to", type: "address" },
|
|
||||||
// { indexed: false, name: "value", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "Transfer",
|
|
||||||
// type: "event",
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// anonymous: false,
|
|
||||||
// inputs: [
|
|
||||||
// { indexed: true, name: "owner", type: "address" },
|
|
||||||
// { indexed: true, name: "spender", type: "address" },
|
|
||||||
// { indexed: false, name: "value", type: "uint256" },
|
|
||||||
// ],
|
|
||||||
// name: "Approval",
|
|
||||||
// type: "event",
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
name: "Meme1",
|
name: "$PEPE",
|
||||||
|
logo: "/assets/img/token/pepe.png",
|
||||||
|
logoMobile: "/assets/img/token/pepeMobile.png",
|
||||||
|
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,
|
abi: Meme1Json.abi,
|
||||||
contractAddress: Meme1Json.contractAddress,
|
contractAddress: Meme1Json.contractAddress,
|
||||||
|
addSteps: [
|
||||||
|
{
|
||||||
|
amount: 10000000000000000000000000n,
|
||||||
|
name: "10m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 100000000000000000000000000n,
|
||||||
|
name: "100m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 1000000000000000000000000000n,
|
||||||
|
name: "1b",
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Meme2",
|
name: "$SHIB",
|
||||||
|
logo: "/assets/img/token/shib.png",
|
||||||
|
logoMobile: "/assets/img/token/shibMobile.png",
|
||||||
|
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,
|
abi: Meme2Json.abi,
|
||||||
contractAddress: Meme2Json.contractAddress,
|
contractAddress: Meme2Json.contractAddress,
|
||||||
|
addSteps: [
|
||||||
|
{
|
||||||
|
amount: 1000000000000000000000000n,
|
||||||
|
name: "10m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 10000000000000000000000000n,
|
||||||
|
name: "100m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 100000000000000000000000000n,
|
||||||
|
name: "1b",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "$ELON",
|
||||||
|
logo: "/assets/img/token/elon.png",
|
||||||
|
logoMobile: "/assets/img/token/elonMobile.png",
|
||||||
|
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,
|
||||||
|
addSteps: [
|
||||||
|
{
|
||||||
|
amount: 10000000000000000000000000n,
|
||||||
|
name: "10m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 100000000000000000000000000n,
|
||||||
|
name: "100m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: 1000000000000000000000000000n,
|
||||||
|
name: "1b",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// name: "$BITCOIN",
|
||||||
|
// logo: "/assets/img/token/bitcoin.png",
|
||||||
|
// logoMobile: "/assets/img/token/bitcoin.png",
|
||||||
|
// 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,
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: "$BAD",
|
||||||
|
// logo: "/assets/img/token/bad.png",
|
||||||
|
// logoMobile: "/assets/img/token/bad.png",
|
||||||
|
// vamp: {
|
||||||
|
// logo: "/assets/img/token/bad.png",
|
||||||
|
// name: "$ELON Vamp Token",
|
||||||
|
// },
|
||||||
|
// abi: Meme5Json.abi,
|
||||||
|
// contractAddress: Meme5Json.contractAddress,
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
name: "$BLOOD",
|
||||||
|
abi: BloodlineJson.abi,
|
||||||
|
contractAddress: BloodlineJson.contractAddress,
|
||||||
|
logo: "/assets/img/token/bloodline.png",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
activeToken: {
|
activeToken: {
|
||||||
address: null,
|
address: null,
|
||||||
abi: null,
|
abi: null,
|
||||||
balance: null,
|
balance: null,
|
||||||
contract: null,
|
contract: null,
|
||||||
allowance: null,
|
allowance: null,
|
||||||
|
rewards: null,
|
||||||
},
|
},
|
||||||
loading: false,
|
loading: false,
|
||||||
memeBurner: {
|
|
||||||
config: MemeBurnerJson,
|
|
||||||
contract: null
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
getters: {},
|
getters: {
|
||||||
|
memeToken: (state) => state.token.find((obj) => obj.contractAddress === BloodlineJson.contractAddress),
|
||||||
|
sacrificeToken: (state) => state.token.filter((obj) => obj.contractAddress !== BloodlineJson.contractAddress),
|
||||||
|
},
|
||||||
actions: {
|
actions: {
|
||||||
async changeActiveToken(token) {
|
getToken(address) {
|
||||||
this.activeToken = token;
|
console.log("address", address);
|
||||||
const web3 = new Web3(window.ethereum);
|
const token = this.token.find((obj) => obj.contractAddress === address);
|
||||||
this.contract = new web3.eth.Contract(token.abi, token.contractAddress);
|
return token;
|
||||||
const walletStore = useWalletStore();
|
|
||||||
if (walletStore.connected) {
|
|
||||||
this.activeToken.balance = await walletStore.getTokenBalance(token);
|
|
||||||
this.activeToken.allowance = await this.allowance();
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async allowance() {
|
|
||||||
const walletStore = useWalletStore();
|
|
||||||
console.log("walletStore.address", walletStore.address);
|
|
||||||
const allowance = await this.contract.methods.allowance(walletStore.address, MemeBurnerJson.contractAddress).call();
|
|
||||||
console.log("allowance", allowance);
|
|
||||||
return allowance;
|
|
||||||
},
|
|
||||||
async approveToken(amount) {
|
|
||||||
const walletStore = useWalletStore();
|
|
||||||
this.loading = true;
|
|
||||||
var approve = await this.contract.methods
|
|
||||||
.approve(this.memeBurner.config.contractAddress, amount)
|
|
||||||
.send({ from: walletStore.address });
|
|
||||||
console.log("approve", approve);
|
|
||||||
this.loading = false;
|
|
||||||
return approve;
|
|
||||||
},
|
},
|
||||||
async sacrificeToken(amount) {
|
async initV2() {
|
||||||
try {
|
console.log("-----------init token-------------");
|
||||||
this.loading = true;
|
try {
|
||||||
console.log("this.activeToken.", this.activeToken.contractAddress);
|
const walletStore = useWalletStoreV2();
|
||||||
const walletStore = useWalletStore();
|
for (let index = 0; index < this.token.length; index++) {
|
||||||
console.log("walletStore.address", walletStore.address);
|
const contracts = [];
|
||||||
var reward = await this.memeBurner.contract.methods
|
const token = this.token[index];
|
||||||
.sacrificeMeme(this.activeToken.contractAddress, "400000000000000000")
|
token.contract = getContract({
|
||||||
.send({ from: walletStore.address });
|
address: token.contractAddress,
|
||||||
console.log("reward", reward);
|
abi: token.abi,
|
||||||
} catch (error) {
|
walletClient: walletStore.walletClient || walletStore.publicClient,
|
||||||
error.log(error);
|
});
|
||||||
|
|
||||||
} finally {
|
contracts.push({ ...token.contract, functionName: "decimals" });
|
||||||
this.loading = false;
|
// contracts.push({ ...token.contract, functionName: "name" });
|
||||||
}
|
contracts.push({ ...token.contract, functionName: "symbol" });
|
||||||
},
|
contracts.push({ ...token.contract, functionName: "totalSupply" });
|
||||||
async getRewardsFor(amount) {
|
const data = await multicall({
|
||||||
const contractsStore = useContractStore();
|
contracts,
|
||||||
var rewards = await contractsStore.list.memeBurnerPublic.methods
|
});
|
||||||
.getRewardFor(this.activeToken.contractAddress, amount)
|
token.decimals = BigInt(data[0].result);
|
||||||
.call();
|
// token.name = data[1].result;
|
||||||
return rewards
|
token.symbol = data[1].result;
|
||||||
},
|
token.totalSupply = data[2].result;
|
||||||
getTokenContract(token) {
|
}
|
||||||
console.log("token", token);
|
} catch (error) {
|
||||||
const contractAddress = token.contractAddress;
|
console.error("initV2", error);
|
||||||
console.log("contractAddress", contractAddress);
|
}
|
||||||
const activeToken = this.token.find((obj) => obj.contractAddress === contractAddress);
|
},
|
||||||
console.log("activeToken", activeToken);
|
async allowance() {
|
||||||
const web3 = new Web3(window.ethereum);
|
console.log("allowance");
|
||||||
const contract = new web3.eth.Contract(activeToken.abi, contractAddress);
|
const walletStore = useWalletStoreV2();
|
||||||
return contract;
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
var allowance = await this.activeToken.contract.read.allowance([
|
||||||
|
walletStore.address,
|
||||||
|
memeBurnerStore.config.contractAddress,
|
||||||
|
]);
|
||||||
|
|
||||||
|
console.log("allowance", allowance);
|
||||||
|
return allowance;
|
||||||
|
},
|
||||||
|
async approveToken(amount) {
|
||||||
|
try {
|
||||||
|
console.log("amount", amount);
|
||||||
|
this.loading = true;
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
var approveHash = await this.activeToken.contract.write.approve([
|
||||||
|
memeBurnerStore.config.contractAddress,
|
||||||
|
amount,
|
||||||
|
]);
|
||||||
|
console.log("approveHash", approveHash);
|
||||||
|
|
||||||
|
return approveHash;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
this.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async nonces(userAddress) {
|
||||||
|
return this.BloodlineJson.contract.read.nonces([userAddress]);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import QuoterJson from "@/assets/contracts/Quoter.json";
|
||||||
|
import UniswapPoolJson from "@/assets/contracts/UniswapPool.json";
|
||||||
|
import BloodlineJson from "@/assets/contracts/Bloodline.json";
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
|
||||||
|
import { getContract, multicall } from "@wagmi/core";
|
||||||
|
|
||||||
|
export const useUniswapStore = defineStore("uniswap", {
|
||||||
|
state: () => ({
|
||||||
|
quoateV3Contract: {},
|
||||||
|
quoateV2Contract: {},
|
||||||
|
uniswapPoolContract: {},
|
||||||
|
poolData: {
|
||||||
|
token0: null,
|
||||||
|
token1: null,
|
||||||
|
fee: null,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
init() {
|
||||||
|
console.log("init uniswap");
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
|
||||||
|
this.quoateV3Contract = getContract({
|
||||||
|
address: QuoterJson.contractAddress,
|
||||||
|
abi: QuoterJson.abi,
|
||||||
|
walletClient: walletStore.walletClient || walletStore.publicClient,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.uniswapPoolContract = getContract({
|
||||||
|
address: UniswapPoolJson.contractAddress,
|
||||||
|
abi: UniswapPoolJson.abi,
|
||||||
|
walletClient: walletStore.walletClient || walletStore.publicClient,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.getPoolData();
|
||||||
|
},
|
||||||
|
|
||||||
|
async quoteExactInputSingle(amount, ethBase) {
|
||||||
|
try {
|
||||||
|
console.log("quoteExactInputSingle");
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const tokenOut = tokenStore.memeToken.contractAddress;
|
||||||
|
// tokenIn - WETH
|
||||||
|
const tokenIn = BigInt(this.poolData.token0) == BigInt(tokenOut) ? this.poolData.token1 : this.poolData.token0;
|
||||||
|
console.log("quoteExactInputSingle-parameter", {
|
||||||
|
tokenIn: tokenIn, // WETH
|
||||||
|
tokenOut: tokenOut, // BLOOD
|
||||||
|
fee: this.poolData.fee,
|
||||||
|
amountEthBase: ethBase,
|
||||||
|
pricelimit: 0, //sqrtPriceLimitX96
|
||||||
|
});
|
||||||
|
|
||||||
|
const quotedAmountOut = await this.quoateV3Contract.read.quoteExactInputSingle([
|
||||||
|
tokenIn, //weth
|
||||||
|
tokenOut, //bloodline
|
||||||
|
this.poolData.fee,
|
||||||
|
ethBase,
|
||||||
|
0, //sqrtPriceLimitX96
|
||||||
|
]);
|
||||||
|
console.log("quotedAmountOut", quotedAmountOut);
|
||||||
|
return {result: true, amount: quotedAmountOut};
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
return { result: false, amount: null };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getPoolData() {
|
||||||
|
console.log("getPoolData");
|
||||||
|
const contracts = [];
|
||||||
|
contracts.push(
|
||||||
|
{
|
||||||
|
...this.uniswapPoolContract,
|
||||||
|
functionName: "token0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...this.uniswapPoolContract,
|
||||||
|
functionName: "token1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...this.uniswapPoolContract,
|
||||||
|
functionName: "fee",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const data = await multicall({
|
||||||
|
contracts,
|
||||||
|
});
|
||||||
|
this.poolData.token0 = data[0].result;
|
||||||
|
this.poolData.token1 = data[1].result;
|
||||||
|
this.poolData.fee = data[2].result;
|
||||||
|
console.log("this.poolData", this.poolData);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
import { defineStore } from "pinia";
|
|
||||||
import { useTokenStore } from "./tokens";
|
|
||||||
import Web3 from "web3";
|
|
||||||
export const useWalletStore = defineStore("wallet", {
|
|
||||||
state: () => ({
|
|
||||||
count: 0,
|
|
||||||
alchemy: null,
|
|
||||||
connected: false,
|
|
||||||
address: null,
|
|
||||||
}),
|
|
||||||
getters: {
|
|
||||||
double: (state) => state.count * 2,
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
increment() {
|
|
||||||
this.count++;
|
|
||||||
},
|
|
||||||
connectWallet() {
|
|
||||||
console.log("window.ethereum", window.ethereum);
|
|
||||||
// if (window.ethereum) {
|
|
||||||
window.ethereum
|
|
||||||
.request({ method: "eth_requestAccounts" })
|
|
||||||
.then((data) => {
|
|
||||||
console.log("data", data);
|
|
||||||
this.isConnected();
|
|
||||||
// this.address = data[0];
|
|
||||||
// this.connected = true;
|
|
||||||
// const tokenStore = useTokenStore();
|
|
||||||
// if (tokenStore.activeToken.address) {
|
|
||||||
// //Token selected but not refreshed
|
|
||||||
// this.getTokenBalance(tokenStore.activeToken.address).then(
|
|
||||||
// (data) => (tokenStore.activeToken.balance = data)
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// console.log("permissions", permissions);
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
if (error.code === 4001) {
|
|
||||||
// EIP-1193 userRejectedRequest error
|
|
||||||
console.log("Please connect to MetaMask.");
|
|
||||||
} else {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// }
|
|
||||||
},
|
|
||||||
async getTokenBalance(token) {
|
|
||||||
const tokenStore = useTokenStore();
|
|
||||||
const contract = tokenStore.getTokenContract(token);
|
|
||||||
const result = await contract.methods.balanceOf(this.address).call();
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
async isConnected() {
|
|
||||||
try {
|
|
||||||
this.loading = true;
|
|
||||||
const accounts = await window.ethereum.request({ method: "eth_accounts" });
|
|
||||||
if (accounts.length) {
|
|
||||||
this.connected = true;
|
|
||||||
this.address = accounts[0];
|
|
||||||
console.log(`You're connected to: ${accounts[0]}`);
|
|
||||||
const web3 = new Web3(window.ethereum);
|
|
||||||
const tokenStore = useTokenStore();
|
|
||||||
console.log("tokenStore.activeToken", tokenStore.activeToken);
|
|
||||||
if (tokenStore.activeToken.contractAddress) {
|
|
||||||
tokenStore.activeToken.balance = await this.getTokenBalance(
|
|
||||||
tokenStore.activeToken
|
|
||||||
);
|
|
||||||
tokenStore.activeToken.allowance = await tokenStore.allowance();
|
|
||||||
}
|
|
||||||
tokenStore.memeBurner.contract = new web3.eth.Contract(
|
|
||||||
tokenStore.memeBurner.config.abi,
|
|
||||||
tokenStore.memeBurner.config.contractAddress
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log("Metamask is not connected");
|
|
||||||
this.connected = false;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log("error", error);
|
|
||||||
} finally {
|
|
||||||
this.loading = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
persist: true,
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import { markRaw } from "vue";
|
||||||
|
import { useTokenStore } from "./tokens";
|
||||||
|
import { useRewardLockerStore } from "./rewardlocker";
|
||||||
|
|
||||||
|
import {
|
||||||
|
createConfig,
|
||||||
|
configureChains,
|
||||||
|
getAccount,
|
||||||
|
getContract,
|
||||||
|
connect,
|
||||||
|
disconnect,
|
||||||
|
InjectedConnector,
|
||||||
|
watchAccount,
|
||||||
|
getWalletClient,
|
||||||
|
fetchBalance,
|
||||||
|
multicall,
|
||||||
|
getNetwork,
|
||||||
|
} from "@wagmi/core";
|
||||||
|
|
||||||
|
import { WalletConnectConnector } from "@wagmi/core/connectors/walletConnect";
|
||||||
|
import { MetaMaskConnector } from "@wagmi/core/connectors/metaMask";
|
||||||
|
import { CoinbaseWalletConnector } from "@wagmi/core/connectors/coinbaseWallet";
|
||||||
|
|
||||||
|
import { goerli, mainnet } from "@wagmi/core/chains";
|
||||||
|
import { publicProvider } from "@wagmi/core/providers/public";
|
||||||
|
import { alchemyProvider } from "@wagmi/core/providers/alchemy";
|
||||||
|
|
||||||
|
|
||||||
|
export const useWalletStoreV2 = defineStore("walletV2", {
|
||||||
|
state: () => ({
|
||||||
|
alchemy: null,
|
||||||
|
connected: false,
|
||||||
|
address: null,
|
||||||
|
provider: null,
|
||||||
|
client: null,
|
||||||
|
publicClient: null,
|
||||||
|
walletClient: null,
|
||||||
|
config: null,
|
||||||
|
chain: null,
|
||||||
|
token: [],
|
||||||
|
}),
|
||||||
|
getters: {
|
||||||
|
sacrificeToken: (state) =>
|
||||||
|
state.token.filter((obj) => {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
return obj.contractAddress !== tokenStore.memeToken.contractAddress;
|
||||||
|
}),
|
||||||
|
memeToken: (state) =>
|
||||||
|
state.token.find((obj) => {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
return obj.contractAddress === tokenStore.memeToken.contractAddress;
|
||||||
|
}),
|
||||||
|
unclaimedRewards() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.memeToken?.unclaimedRewards) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.memeToken.unclaimedRewards / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
async init() {
|
||||||
|
console.log("wallet init");
|
||||||
|
|
||||||
|
const account = getAccount();
|
||||||
|
|
||||||
|
if (account.address) {
|
||||||
|
this.address = account.address;
|
||||||
|
this.connected = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(connector) {
|
||||||
|
try {
|
||||||
|
console.log("connector.name", connector.name);
|
||||||
|
// if (!account.isConnected) {
|
||||||
|
const connection = await connect({
|
||||||
|
chainId: goerli.id,
|
||||||
|
connector: connector,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("connection", connection);
|
||||||
|
} catch (error) {
|
||||||
|
if (error.message.includes("Connector not found")) {
|
||||||
|
console.warn("Connector not found");
|
||||||
|
}
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
// this.address = connection.account;
|
||||||
|
},
|
||||||
|
async getTokenBalance(token) {
|
||||||
|
const result = await token.contract.read.balanceOf([this.address]);
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
async getTokenBalances() {
|
||||||
|
console.log("getTokenBalances");
|
||||||
|
this.token = [];
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
var contracts = [];
|
||||||
|
for (let index = 0; index < tokenStore.token.length; index++) {
|
||||||
|
const token = tokenStore.token[index];
|
||||||
|
contracts.push({ ...token.contract, functionName: "balanceOf", args: [this.address] });
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await multicall({
|
||||||
|
contracts,
|
||||||
|
});
|
||||||
|
for (let index = 0; index < tokenStore.token.length; index++) {
|
||||||
|
const token = tokenStore.token[index];
|
||||||
|
this.token.push({
|
||||||
|
contractAddress: token.contractAddress,
|
||||||
|
balanceOf: data[index].result,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async loadWalletData() {
|
||||||
|
if (!this.connected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("loadWalletData");
|
||||||
|
const rewardlockerStore = useRewardLockerStore();
|
||||||
|
|
||||||
|
await this.getTokenBalances();
|
||||||
|
//MemeToken Staked
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
this.memeToken.staked = await rewardlockerStore.getStaked(this.address);
|
||||||
|
const unclaimedRewardsArray = await rewardlockerStore.getTotalRewards(this.address);
|
||||||
|
const unclaimedRewards = unclaimedRewardsArray[0] + unclaimedRewardsArray[1];
|
||||||
|
this.memeToken.unclaimedRewards = unclaimedRewards;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// persist: true,
|
||||||
|
});
|
||||||
@@ -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);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
<template>
|
||||||
|
<div class="cycle-page">
|
||||||
|
<div class="cycle-header container container--variant1">
|
||||||
|
<div class="bloodline-page-headline header" ref="observerElement">Bloodline Cycle</div>
|
||||||
|
<div class="bloodline-page-description low-mid-text">
|
||||||
|
Claim and trade your $BDL at each cycle's end. Become the most powerful bloodline and win extra rewards.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="slider-wrapper" :class="{ sticking: sticking }" ref="target">
|
||||||
|
<font-awesome-icon
|
||||||
|
:class="{ 'slider-prev': true, disabled: cycleStore.activeCycle <= 1 }"
|
||||||
|
@click="prevSlide"
|
||||||
|
:icon="['fas', 'caret-left']"
|
||||||
|
/>
|
||||||
|
<div class="slider-text sub-header">Cycle {{ cycleStore.activeCycle }}</div>
|
||||||
|
<font-awesome-icon
|
||||||
|
:class="{ 'slider-next': true, disabled: cycleStore.currentCycle === cycleStore.activeCycle }"
|
||||||
|
@click="nextSlide"
|
||||||
|
:icon="['fas', 'caret-right']"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="cycle card card--glow container container--variant1 bloodline-wrapper">
|
||||||
|
<div
|
||||||
|
class="bloodline-border round-finish-info low-mid-text"
|
||||||
|
:class="{ loading: difference <= 0 }"
|
||||||
|
v-if="cycleStore.currentCycle === cycleStore.activeCycle"
|
||||||
|
>
|
||||||
|
<template v-if="difference > 0">
|
||||||
|
<div class="round-finish-info-key">Sacrifice Goal:</div>
|
||||||
|
<div class="round-finish-info-value">
|
||||||
|
{{ cycleStore.getCurrentCycleData?.goalInBLD / 10n ** tokenStore.memeToken.decimals }} $BDL
|
||||||
|
</div>
|
||||||
|
<div class="round-finish-info-key">Time left:</div>
|
||||||
|
<div class="round-finish-info-value">{{ days }} {{ hours }} {{ minutes }}</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<template v-if="cycleStore.currentCycle !== cycleStore.activeCycle">
|
||||||
|
<div class="bloodline-border bloodline-border purple cycle-winner" v-if="cycleStore.getCycleWinner">
|
||||||
|
<div class="cycle-winner-left">
|
||||||
|
<div class="cycle-winner-headline">Clan Winner</div>
|
||||||
|
<div class="cycle-winner-subheadline">+25% Clan Bonus</div>
|
||||||
|
</div>
|
||||||
|
<div class="cycle-winner-right">
|
||||||
|
<div class="cycle-winner-logo">
|
||||||
|
<img :src="cycleStore.getCycleWinner.vampwinner" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="cycle-winner-name">{{ cycleStore.getCycleWinner.name }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bloodline-border bloodline-border__thin grey cycle-winner" v-else>
|
||||||
|
<template v-if="cycleStore.getCycleWinner">
|
||||||
|
<div class="cycle-winner-left">
|
||||||
|
<div class="cycle-winner-headline">No Clan Winner</div>
|
||||||
|
<div class="cycle-winner-subheadline">time limit has been reached</div>
|
||||||
|
</div>
|
||||||
|
<div class="cycle-winner-right">
|
||||||
|
<div class="cycle-winner-logo inactive">
|
||||||
|
<img src="/assets/img/token/bloodline.png" alt="" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="cycle-winner-loading" v-else>
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<token-claim></token-claim>
|
||||||
|
|
||||||
|
<div class="bloodline-clan">
|
||||||
|
<div class="sub-header">Bloodline Clan</div>
|
||||||
|
<p class="mid-text">
|
||||||
|
Claim extra rewards when your clan wins the cycle. Increase the strength of your bloodline by
|
||||||
|
sacrificing more memes.
|
||||||
|
</p>
|
||||||
|
<div class="bloodline-container">
|
||||||
|
<div class="bloodline-border purple">Get up to +25% Clan Bonus on your sacrifice.</div>
|
||||||
|
</div>
|
||||||
|
<template v-if="!cycleStore.cycles[cycleStore.activeCycle]">
|
||||||
|
<Vue3Lottie :animationData="ChartLoading" :height="400" :width="400" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<blood-chart :data="cycleStore.cycles[cycleStore.activeCycle]"></blood-chart>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { inject, ref, onMounted, onBeforeUnmount } from "vue";
|
||||||
|
|
||||||
|
import BloodChart from "@/components/BloodChart.vue";
|
||||||
|
import TokenClaim from "@/components/TokenClaim.vue";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import LoadingComponent from "@/components/LoadingComponent.vue";
|
||||||
|
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
|
||||||
|
import { Vue3Lottie } from "vue3-lottie";
|
||||||
|
import ChartLoading from "@/assets/lottie/ChartLoading.json";
|
||||||
|
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const days = ref(null);
|
||||||
|
const hours = ref(null);
|
||||||
|
const minutes = ref(null);
|
||||||
|
const seconds = ref(null);
|
||||||
|
const timer = ref(null);
|
||||||
|
const difference = ref(null);
|
||||||
|
const target = ref();
|
||||||
|
const sticking = ref(false);
|
||||||
|
const observer = ref(null);
|
||||||
|
const observerElement = ref(null);
|
||||||
|
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
//check if that still needed or old stuff
|
||||||
|
if (!cycleStore.currentCycle) {
|
||||||
|
cycleStore.currentCycle = parseInt(await memeBurnerStore.getCurrentCycle());
|
||||||
|
console.log("cycleStore.currentCycle", cycleStore.currentCycle);
|
||||||
|
cycleStore.activeCycle = cycleStore.currentCycle;
|
||||||
|
}
|
||||||
|
await cycleStore.fillCycle(cycleStore.activeCycle);
|
||||||
|
|
||||||
|
if (cycleStore.currentCycle === cycleStore.activeCycle) {
|
||||||
|
const expirationTimestamp = cycleStore.getCurrentCycleData.expirationTimestamp;
|
||||||
|
timer.value = setInterval(function () {
|
||||||
|
timeBetweenDates(expirationTimestamp);
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
const headerEl = document.querySelector(".slider-wrapper");
|
||||||
|
//if cycle header is getting sticky than grey the background
|
||||||
|
const handler = (entries) => {
|
||||||
|
if (!entries[0].isIntersecting) {
|
||||||
|
headerEl.classList.add("stuck");
|
||||||
|
} else {
|
||||||
|
headerEl.classList.remove("stuck");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// create the observer
|
||||||
|
observer.value = new window.IntersectionObserver(handler);
|
||||||
|
if (observerElement.value) {
|
||||||
|
observer.value.observe(observerElement.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
clearInterval(timer.value);
|
||||||
|
if (observer.value) {
|
||||||
|
observer.value.unobserve(observerElement.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
async function prevSlide() {
|
||||||
|
if (cycleStore.activeCycle > 1) {
|
||||||
|
cycleStore.activeCycle--;
|
||||||
|
await cycleStore.fillCycle(cycleStore.activeCycle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function nextSlide() {
|
||||||
|
if (cycleStore.activeCycle < cycleStore.currentCycle) {
|
||||||
|
cycleStore.activeCycle++;
|
||||||
|
await cycleStore.fillCycle(cycleStore.activeCycle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function timeBetweenDates(expirationTimestamp) {
|
||||||
|
const dateEntered = new Date(expirationTimestamp * 1000);
|
||||||
|
if (dateEntered) {
|
||||||
|
var now = new Date();
|
||||||
|
difference.value = dateEntered.getTime() - now.getTime();
|
||||||
|
if (difference.value <= 0) {
|
||||||
|
clearInterval(timer.value);
|
||||||
|
days.value = "0d";
|
||||||
|
hours.value = "0h";
|
||||||
|
minutes.value = "0m";
|
||||||
|
} else {
|
||||||
|
var _seconds = Math.floor(difference.value / 1000);
|
||||||
|
var _minutes = Math.floor(_seconds / 60);
|
||||||
|
var _hours = Math.floor(_minutes / 60);
|
||||||
|
var _days = Math.floor(_hours / 24);
|
||||||
|
|
||||||
|
days.value = _days;
|
||||||
|
hours.value = _hours % 24;
|
||||||
|
minutes.value = _minutes % 60;
|
||||||
|
seconds.value = _seconds % 60;
|
||||||
|
|
||||||
|
days.value = ("0" + days.value).slice(-2) + "d";
|
||||||
|
hours.value = ("0" + hours.value).slice(-2) + "h";
|
||||||
|
minutes.value = ("0" + minutes.value).slice(-2) + "m";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.cycle-header
|
||||||
|
.bloodline-page-headline
|
||||||
|
text-align: center
|
||||||
|
margin-bottom: 32px
|
||||||
|
.bloodline-page-description
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.slider-wrapper
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
font-size: 24px
|
||||||
|
user-select: none
|
||||||
|
position: sticky
|
||||||
|
top: 82px
|
||||||
|
z-index: 3
|
||||||
|
padding: 16px 0
|
||||||
|
&.stuck
|
||||||
|
background: #2D2D2D
|
||||||
|
@media (min-width: 992px)
|
||||||
|
top: 80px
|
||||||
|
.slider-text
|
||||||
|
margin: 0 24px
|
||||||
|
margin-top: auto
|
||||||
|
margin-bottom: auto
|
||||||
|
.slider-prev, .slider-next
|
||||||
|
color: var(--purple)
|
||||||
|
font-size: 40px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 60px
|
||||||
|
|
||||||
|
cursor: pointer
|
||||||
|
&:hover,&:active, &:focus
|
||||||
|
filter: brightness(0.80)
|
||||||
|
&.disabled
|
||||||
|
opacity: .35
|
||||||
|
pointer-events: none
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.bloodline-wrapper
|
||||||
|
background: var(--dark-grey, #202020)
|
||||||
|
padding-top: 24px
|
||||||
|
gap: 24px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
text-align: center
|
||||||
|
border-bottom-left-radius: unset
|
||||||
|
border-bottom-right-radius: unset
|
||||||
|
@media (min-width: 992px)
|
||||||
|
border-radius: 16px
|
||||||
|
|
||||||
|
.cycle-winner
|
||||||
|
padding: 8px 24px
|
||||||
|
display: flex
|
||||||
|
text-align: left
|
||||||
|
justify-content: space-between
|
||||||
|
.cycle-winner-left
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: center
|
||||||
|
.cycle-winner-headline
|
||||||
|
font-size: 24px
|
||||||
|
.cycle-winner-subheadline
|
||||||
|
font-size: 12px
|
||||||
|
.cycle-winner-right
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: space-between
|
||||||
|
align-items: center
|
||||||
|
.cycle-winner-logo
|
||||||
|
height: 48px
|
||||||
|
width: 48px
|
||||||
|
position: relative
|
||||||
|
img
|
||||||
|
height: 72px
|
||||||
|
width: 72px
|
||||||
|
border-radius: 50%
|
||||||
|
position: absolute
|
||||||
|
left: 50%
|
||||||
|
top: 10px
|
||||||
|
transform: translate(-50%, -50%)
|
||||||
|
&.inactive
|
||||||
|
img
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
top: unset
|
||||||
|
left: unset
|
||||||
|
transform: unset
|
||||||
|
position: unset
|
||||||
|
opacity: 0.3
|
||||||
|
.cycle-winner-name
|
||||||
|
font-size: 16px
|
||||||
|
.cycle-winner-loading
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
|
||||||
|
.bloodline-clan
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
|
||||||
|
|
||||||
|
.round-finish-info
|
||||||
|
gap: 10px
|
||||||
|
display: grid
|
||||||
|
grid-template-columns: 1fr 1fr
|
||||||
|
text-align: right
|
||||||
|
&.loading
|
||||||
|
grid-template-columns: 1fr
|
||||||
|
|
||||||
|
.round-finish-info-key
|
||||||
|
text-align: right
|
||||||
|
.round-finish-info-value
|
||||||
|
text-align: left
|
||||||
|
</style>
|
||||||
@@ -1,108 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<div class="sacrifice-page" :class="{ container: !isMobile }">
|
||||||
|
<section id="bloodline-header">
|
||||||
|
<div class="header-text">
|
||||||
|
Turn your meme.<br />
|
||||||
|
Join the bloodline scheme.
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="sacrifice">
|
||||||
|
<sacrifice-token :data="tokenStore.sacrificeToken"></sacrifice-token>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="cycle-section"></section>
|
||||||
|
<div id="section-header-container">
|
||||||
|
<div class="tutorial-header sub-header">
|
||||||
|
<div class="tutorial-headline">Tutorial</div>
|
||||||
|
<div class="tutorial-more" @click="openTutorialFunc">
|
||||||
|
<font-awesome-icon v-if="openTutorial" icon="chevron-up" />
|
||||||
|
<font-awesome-icon v-else icon="chevron-down" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Collapse :when="openTutorial" class="tutorial-wrapper" ref="tutorialWrapper">
|
||||||
|
<div class="tutorial-text container mid-mid-text">
|
||||||
|
When you sacrifice your meme, the $ETH is put into an immutable $BLOOD/ETH liquidity position.
|
||||||
|
<br /><br />When your clan wins, you get extra $BLOOD rewards that you can trade.
|
||||||
|
</div>
|
||||||
|
<section id="tokenomics">
|
||||||
|
<div class="card card--glow">
|
||||||
|
<img v-if="isMobile" src="/assets/img/tokenomics_footer.png" alt="tokenomics" />
|
||||||
|
<img v-else src="/assets/img/tokenomics.png" alt="tokenomics" />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="tutorial-footer mid-text">Only 3% elders fee upon sacrifice.</div>
|
||||||
|
</Collapse>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref, inject } from "vue";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import SacrificeToken from "@/components/SacrificeToken.vue";
|
import SacrificeToken from "@/components/SacrificeToken.vue";
|
||||||
import BloodChart from "@/components/BloodChart.vue";
|
import { Collapse } from "vue-collapsed";
|
||||||
import TokenClaim from "@/components/TokenClaim.vue";
|
|
||||||
// import Web3 from "web3";
|
|
||||||
// import { useWalletStore } from "@/stores/wallet";
|
// import { useWalletStore } from "@/stores/wallet";
|
||||||
import { useTokenStore } from "@/stores/tokens";
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
const tokenStore = useTokenStore();
|
const tokenStore = useTokenStore();
|
||||||
const { token } = storeToRefs(tokenStore);
|
|
||||||
import { Navigation } from "swiper";
|
const tutorialWrapper = ref(null);
|
||||||
// Import Swiper Vue.js components
|
const openTutorial = ref(false);
|
||||||
import { Swiper, SwiperSlide } from "swiper/vue";
|
const isMobile = inject("isMobile");
|
||||||
import "swiper/css";
|
|
||||||
import "swiper/css/navigation";
|
function openTutorialFunc(e) {
|
||||||
// let web3 = new Web3(
|
openTutorial.value = !openTutorial.value;
|
||||||
// "https://eth-goerli.g.alchemy.com/v2/0-W9tOm6v_QP1PfRV8RuBCpWr-qoEbkN"
|
setTimeout(function () {
|
||||||
// );
|
let element = document.getElementById("section-header-container");
|
||||||
|
element.scrollIntoView({ behavior: "smooth" });
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
|
||||||
<main>
|
|
||||||
<div>
|
|
||||||
<section id="bloodline-header">
|
|
||||||
<div class="header-text">
|
|
||||||
Turn your meme.<br />
|
|
||||||
Join the bloodline scheme.
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section id="sacrifice" class="container">
|
|
||||||
<sacrifice-token :data="token"></sacrifice-token>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<swiper :slides-per-view="1" :navigation="true" :space-between="50">
|
|
||||||
<swiper-slide>Slide 1</swiper-slide>
|
|
||||||
<swiper-slide>Slide 2</swiper-slide>
|
|
||||||
<swiper-slide>Slide 3</swiper-slide>
|
|
||||||
<swiper-slide>Slide 4</swiper-slide>
|
|
||||||
<swiper-slide>Slide 5</swiper-slide>
|
|
||||||
</swiper>
|
|
||||||
<div class="container section-header-container">
|
|
||||||
<h2>Bloodline Cycle</h2>
|
|
||||||
Become the most powerful clan each cycle and claim extra rewards.<br />Claim and trade your $BLOOD at
|
|
||||||
each cycle's end.
|
|
||||||
</div>
|
|
||||||
<section id="cycle-section" class="container">
|
|
||||||
<div class="cycle card bloodline-wrapper">
|
|
||||||
<token-claim></token-claim>
|
|
||||||
<div>
|
|
||||||
<h2>Bloodline Clan</h2>
|
|
||||||
<p>
|
|
||||||
Win extra rewards for you and your clan. Increase the strength of your bloodline by
|
|
||||||
sacrificing more memes.
|
|
||||||
</p>
|
|
||||||
<table class="bonus-table">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">1st</th>
|
|
||||||
<td>100% Bonus</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">2nd</th>
|
|
||||||
<td>50% Bonus</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">3rd</th>
|
|
||||||
<td>No Bonus</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<div class="blood-chart">
|
|
||||||
<blood-chart></blood-chart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<div class="container section-header-container">
|
|
||||||
<h2>Tutorial</h2>
|
|
||||||
When you sacrifice your meme, the $ETH is put into an immutable $BLOOD/ETH liquidity position.
|
|
||||||
<br /><br />When your clan wins, you get extra $BLOOD rewards that you can trade.
|
|
||||||
</div>
|
|
||||||
<section id="tokenomics" class="container">
|
|
||||||
<div class="card">
|
|
||||||
<h2>Tokenomics</h2>
|
|
||||||
<p>100% clan owned. No team %, no pre-mine</p>
|
|
||||||
<img src="@/assets/img/tokenomics.png" alt="tokenomics" />
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.blood-chart
|
|
||||||
display: flex
|
|
||||||
justify-content: center
|
|
||||||
.bloodline-wrapper
|
|
||||||
padding: 48px 64px
|
|
||||||
|
|
||||||
.header-text
|
.header-text
|
||||||
font-size: 64px
|
text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25)
|
||||||
line-height: 80px
|
font-size: 32px
|
||||||
font-weight: 600
|
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-bottom: 100px
|
margin-top: 24px
|
||||||
|
margin-bottom: 48px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 48px
|
||||||
|
margin-top: 0px
|
||||||
|
line-height: unset
|
||||||
|
text-shadow: unset
|
||||||
|
line-height: 80px
|
||||||
|
font-weight: 600
|
||||||
|
|
||||||
.chart-wrapper-coin
|
.chart-wrapper-coin
|
||||||
display: flex
|
display: flex
|
||||||
justify-content: space-evenly
|
justify-content: space-evenly
|
||||||
@@ -127,11 +98,16 @@ import "swiper/css/navigation";
|
|||||||
padding-right: 16px
|
padding-right: 16px
|
||||||
#tokenomics
|
#tokenomics
|
||||||
>div
|
>div
|
||||||
|
background-color: var(--darkgrey)
|
||||||
text-align: center
|
text-align: center
|
||||||
img
|
img
|
||||||
display: block
|
display: block
|
||||||
margin-left: auto
|
margin-left: auto
|
||||||
margin-right: auto
|
margin-right: auto
|
||||||
|
pointer-events: none
|
||||||
|
user-select: none
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: 100%
|
||||||
.chart-wrapper
|
.chart-wrapper
|
||||||
width: 600px
|
width: 600px
|
||||||
height: 600px
|
height: 600px
|
||||||
@@ -149,4 +125,46 @@ import "swiper/css/navigation";
|
|||||||
margin-top: auto
|
margin-top: auto
|
||||||
text-align: center
|
text-align: center
|
||||||
padding-top: 10px
|
padding-top: 10px
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#section-header-container
|
||||||
|
margin: 72px 0
|
||||||
|
scroll-margin: 150px
|
||||||
|
.tutorial-header
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
gap: 16px
|
||||||
|
margin-bottom: 24px
|
||||||
|
.tutorial-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 24px
|
||||||
|
.tutorial-text
|
||||||
|
text-align: center
|
||||||
|
.tutorial-footer
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cycle-end-wrapper
|
||||||
|
.cycle-end-inner
|
||||||
|
text-align: center
|
||||||
|
font-size: 24px
|
||||||
|
padding: 0 24px 48px 24px
|
||||||
|
.cycle-end-text
|
||||||
|
margin-bottom: 32px
|
||||||
|
table
|
||||||
|
width: 100%
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
text-align: left
|
||||||
|
&.divider
|
||||||
|
width: 10px
|
||||||
|
|
||||||
|
h2
|
||||||
|
font-size: 40px
|
||||||
|
|
||||||
|
.content
|
||||||
|
background: grey
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,313 @@
|
|||||||
|
<template>
|
||||||
|
<div class="profile-page container">
|
||||||
|
<div class="profile-header">
|
||||||
|
<div class="profile-headline header">Profile</div>
|
||||||
|
<div class="profile-subheader" v-if="walletStore.connected">
|
||||||
|
<div class="profile-subheader-logo"><img :src="getblocky(walletStore.address)" alt="" /></div>
|
||||||
|
<div class="mid-mid-text">{{ getAddressShortName(walletStore.address) }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template v-if="!walletStore.connected">
|
||||||
|
<div class="profile-not-connected low-mid-text">
|
||||||
|
Connect your wallet to see your profile.
|
||||||
|
<div class="btn btn-immortal" @click="showPanel = true">Connect</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="total-rewards-wrapper">
|
||||||
|
<div class="total-rewards-headline mid-text text-center">Total Rewards</div>
|
||||||
|
<claim-component></claim-component>
|
||||||
|
</div>
|
||||||
|
<template v-if="!isMobile">
|
||||||
|
<stake-component-v1 :variant="2"> </stake-component-v1>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<stake-component-v1> </stake-component-v1>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="most-sacrificed-wrapper" v-if="false">
|
||||||
|
<div class="most-sacrificed-inner">
|
||||||
|
<div class="most-sacrificed-left">
|
||||||
|
<div class="most-sacrificed-header">Bloodline Clan</div>
|
||||||
|
<div class="most-sacrificed-subheader">Most sacrificed</div>
|
||||||
|
</div>
|
||||||
|
<div class="most-sacrificed-right">
|
||||||
|
<div class="most-sacrificed-coin-logo">
|
||||||
|
<img src="/assets/img/token/pepevamp.png" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="most-sacrificed-coin-name">$PEPE</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-wrapper" v-if="false">
|
||||||
|
<div class="total-sacrificed-inner">
|
||||||
|
<div class="total-sacrificed-header">Total Sacrifice</div>
|
||||||
|
<div class="total-sacrificed-coins">
|
||||||
|
<div class="total-sacrificed-coin">
|
||||||
|
<div class="total-sacrificed-coin-amount">1,2b</div>
|
||||||
|
<div class="total-sacrificed-coin-logo">
|
||||||
|
<img src="/assets/img/token/pepevamp.png" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-coin-name">$PEPE</div>
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-coin">
|
||||||
|
<div class="total-sacrificed-coin-amount">139m</div>
|
||||||
|
<div class="total-sacrificed-coin-logo">
|
||||||
|
<img src="/assets/img/token/shibvamp.png" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-coin-name">$SHIB</div>
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-coin">
|
||||||
|
<div class="total-sacrificed-coin-amount">0</div>
|
||||||
|
<div class="total-sacrificed-coin-logo">
|
||||||
|
<img src="/assets/img/token/elonvamp.png" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="total-sacrificed-coin-name">$ELON</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, computed, inject } from "vue";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
|
||||||
|
import { getblocky, getAddressShortName } from "@/helper/helper.js";
|
||||||
|
import StakeComponentV1 from "@/components/StakeComponentV1.vue";
|
||||||
|
import ClaimComponent from "@/components/ClaimComponent.vue";
|
||||||
|
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const walletStore = useWalletStoreV2();
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
const isMobile = inject("isMobile");
|
||||||
|
const showPanel = inject("showPanel");
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
//todo check that code, probably old stuff
|
||||||
|
if (!cycleStore.currentCycle) {
|
||||||
|
cycleStore.currentCycle = parseInt(await memeBurnerStore.getCurrentCycle());
|
||||||
|
console.log("cycleStore.currentCycle", cycleStore.currentCycle);
|
||||||
|
cycleStore.activeCycle = cycleStore.currentCycle;
|
||||||
|
}
|
||||||
|
console.log("cycleStore.cycles", cycleStore.cycles);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.profile-page
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 24px
|
||||||
|
.profile-header
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.profile-headline
|
||||||
|
color: #FFF
|
||||||
|
text-align: center
|
||||||
|
.profile-subheader
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
gap: 12px
|
||||||
|
align-items: center
|
||||||
|
.profile-subheader-logo
|
||||||
|
img
|
||||||
|
width: 21px
|
||||||
|
height: 21px
|
||||||
|
border-radius: 20%
|
||||||
|
@media (min-width: 992px)
|
||||||
|
width: 32px
|
||||||
|
height: 32px
|
||||||
|
|
||||||
|
.total-rewards-wrapper
|
||||||
|
border-radius: 16px
|
||||||
|
background: var(--darkgrey, #202020)
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 18px
|
||||||
|
padding: 8px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 24px 48px
|
||||||
|
.total-rewards-inner
|
||||||
|
border-radius: 16px
|
||||||
|
border: 2px solid var(--grey, #858585)
|
||||||
|
background: var(--darkgrey, #202020)
|
||||||
|
padding: 8px 12px
|
||||||
|
gap: 16px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
.claim-wrapper
|
||||||
|
.claim-inner
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
.claim-header
|
||||||
|
color: var(--white, #F9F9FA)
|
||||||
|
font-size: 18px
|
||||||
|
text-align: center
|
||||||
|
.claim-body
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 4px
|
||||||
|
.bloodline-token
|
||||||
|
margin-left: auto
|
||||||
|
.claim-hr
|
||||||
|
background-color: #858585
|
||||||
|
margin: 16px 0
|
||||||
|
height: 1px
|
||||||
|
.total-rewards-buttons
|
||||||
|
display: flex
|
||||||
|
text-align: center
|
||||||
|
gap: 16px
|
||||||
|
justify-content: space-between
|
||||||
|
div
|
||||||
|
flex: 1 1 auto
|
||||||
|
font-size: 18px
|
||||||
|
.profile-stake
|
||||||
|
padding: 0 8px
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.most-sacrificed-wrapper
|
||||||
|
.most-sacrificed-inner
|
||||||
|
padding: 8px
|
||||||
|
border-radius: 16px
|
||||||
|
border: 1px solid var(--grey, #858585)
|
||||||
|
background: var(--dark-grey, #202020)
|
||||||
|
gap: 34px
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
.most-sacrificed-left
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: center
|
||||||
|
.most-sacrificed-header
|
||||||
|
font-size: 24px
|
||||||
|
.most-sacrificed-subheader
|
||||||
|
font-size: 12px
|
||||||
|
.most-sacrificed-right
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
.most-sacrificed-coin-logo
|
||||||
|
img
|
||||||
|
width: 49px
|
||||||
|
height: 49px
|
||||||
|
border-radius: 50%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.total-sacrificed-wrapper
|
||||||
|
background-color: var(--dark-grey, #202020)
|
||||||
|
border-radius: 16px
|
||||||
|
border: 1px solid var(--grey, #858585)
|
||||||
|
padding: 8px
|
||||||
|
.total-sacrificed-inner
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
align-items: center
|
||||||
|
gap: 16px
|
||||||
|
.total-sacrificed-header
|
||||||
|
font-size: 18px
|
||||||
|
.total-sacrificed-coins
|
||||||
|
display: flex
|
||||||
|
gap: 27px
|
||||||
|
.total-sacrificed-coin
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
text-align: center
|
||||||
|
.total-sacrificed-coin-logo
|
||||||
|
img
|
||||||
|
height: 49px
|
||||||
|
width: 49px
|
||||||
|
border-radius: 50%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cycle-wrapper
|
||||||
|
margin-top: 24px
|
||||||
|
.cycle-inner
|
||||||
|
.cycle-headline
|
||||||
|
font-size: 24px
|
||||||
|
margin-bottom: 8px
|
||||||
|
text-align: center
|
||||||
|
.cycle-header
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
padding: 8px 16px
|
||||||
|
font-size: 18px
|
||||||
|
.cycle-cycles
|
||||||
|
gap: 8px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
.cycle-round
|
||||||
|
border-radius: 16px
|
||||||
|
border: 3px solid var(--grey, #858585)
|
||||||
|
background: var(--dark-grey, #202020)
|
||||||
|
padding: 12px
|
||||||
|
min-height: 55px
|
||||||
|
.cycle-round-inner
|
||||||
|
display: flex
|
||||||
|
font-size: 18px
|
||||||
|
gap: 8px
|
||||||
|
align-items: center
|
||||||
|
// .cycle-round-number
|
||||||
|
.cycle-round-badget
|
||||||
|
border-radius: 14px
|
||||||
|
border: 1px solid var(--grey, #858585)
|
||||||
|
padding: 8px 16px
|
||||||
|
height: 25px
|
||||||
|
color: var(--grey, #858585)
|
||||||
|
text-align: center
|
||||||
|
font-size: 14px
|
||||||
|
display: flex
|
||||||
|
align-items: center
|
||||||
|
margin-left: auto
|
||||||
|
.cycle-round-reward
|
||||||
|
margin-left: auto
|
||||||
|
.cycle-round-more
|
||||||
|
font-size: 16px
|
||||||
|
.cycle-round-detail
|
||||||
|
.cycle-round-detail-inner
|
||||||
|
.sacrifice-reward-wrapper
|
||||||
|
border-radius: 16px
|
||||||
|
border: 0.5px solid var(--grey, #858585)
|
||||||
|
margin-top: 12px
|
||||||
|
.sacrifice-reward-inner
|
||||||
|
padding: 8px 16px
|
||||||
|
.sacrifice-reward-header
|
||||||
|
display: flex
|
||||||
|
font-size: 18px
|
||||||
|
justify-content: space-between
|
||||||
|
margin-bottom: 16px
|
||||||
|
.sacrifice-coins
|
||||||
|
margin-left: auto
|
||||||
|
border-collapse: separate
|
||||||
|
border-spacing: 0 12px
|
||||||
|
.sacrifice-coin
|
||||||
|
td
|
||||||
|
text-align: right
|
||||||
|
img
|
||||||
|
height: 40px
|
||||||
|
width: 40px
|
||||||
|
border-radius: 50%
|
||||||
|
.arrow
|
||||||
|
width: 14px
|
||||||
|
padding: 0 16px
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.profile-not-connected
|
||||||
|
border-radius: 16px
|
||||||
|
padding: 16px
|
||||||
|
gap: 16px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
text-align: center
|
||||||
|
background: var(--darkgrey, #202020)
|
||||||
|
</style>
|
||||||
@@ -1,67 +1,146 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<button @click="mintToken">mint</button>
|
<button @click="mintToken">mint</button>
|
||||||
|
<button @click="mintToken2">mint2</button>
|
||||||
|
<button @click="mintToken3">mint3</button>
|
||||||
<button @click="sacrificeMeme">sacrifice Meme</button>
|
<button @click="sacrificeMeme">sacrifice Meme</button>
|
||||||
<button @click="approveMeme1">approve Meme1</button>
|
<button @click="approveMeme1">approve Meme1</button>
|
||||||
<button @click="tokenStore.approveToken(MemeBurnerJson, 10)">wallet approve</button>
|
<button @click="tokenStore.approveToken(MemeBurnerJson, 10)">wallet approve</button>
|
||||||
|
<button @click="stake">z</button>
|
||||||
|
<button @click="">unstake</button>
|
||||||
|
<button @click="fetchBalance">fetchBalance</button>
|
||||||
|
<button @click="claimView">claimview</button>
|
||||||
|
<button @click="testQuoter(token0, token1, fee)">quoater</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from "vue";
|
import { onMounted, ref } from "vue";
|
||||||
import Web3 from "web3";
|
|
||||||
import Meme1Json from "@/assets/contracts/Meme1.json";
|
import Meme1Json from "@/assets/contracts/Meme1.json";
|
||||||
import Meme2Json from "@/assets/contracts/Meme2.json";
|
import Meme2Json from "@/assets/contracts/Meme2.json";
|
||||||
import MemeBurnerJson from "@/assets/contracts/MemeBurner.json";
|
import MemeBurnerJson from "@/assets/contracts/Bloodline.json";
|
||||||
import MemeTokenJson from "@/assets/contracts/MemeToken.json";
|
|
||||||
import RewardLockerJson from "@/assets/contracts/RewardLocker.json";
|
import RewardLockerJson from "@/assets/contracts/RewardLocker.json";
|
||||||
|
import QuoterJson from "@/assets/contracts/Quoter.json";
|
||||||
|
import UniswapPoolJson from "@/assets/contracts/UniswapPool.json";
|
||||||
|
import MemeAltarJson from "@/assets/contracts/MemeAltar.json";
|
||||||
import { useTokenStore } from "@/stores/tokens";
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { signTypedData, getContract } from "@wagmi/core";
|
||||||
|
|
||||||
const tokenStore = useTokenStore();
|
const tokenStore = useTokenStore();
|
||||||
|
const walletV2Store = useWalletStoreV2();
|
||||||
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
|
|
||||||
console.log("Meme1Json", Meme1Json);
|
console.log("Meme1Json", Meme1Json);
|
||||||
console.log("Meme2Json", Meme2Json);
|
console.log("Meme2Json", Meme2Json);
|
||||||
console.log("MemeBurnerJson", MemeBurnerJson);
|
console.log("MemeBurnerJson", MemeBurnerJson);
|
||||||
console.log("MemeTokenJson", MemeTokenJson);
|
|
||||||
console.log("RewardLockerJson", RewardLockerJson);
|
console.log("RewardLockerJson", RewardLockerJson);
|
||||||
|
|
||||||
// let web3 = new Web3(
|
const contractMeme2 = ref(null);
|
||||||
// "https://eth-goerli.g.alchemy.com/v2/0-W9tOm6v_QP1PfRV8RuBCpWr-qoEbkN"
|
|
||||||
// );
|
|
||||||
// console.log("balanceOf", balanceOf);
|
|
||||||
const web3 = ref(null);
|
|
||||||
const contractMeme1 = ref(null);
|
const contractMeme1 = ref(null);
|
||||||
const contractBurner = ref(null);
|
const contractBurner = ref(null);
|
||||||
|
const contractBloodline = ref(null);
|
||||||
|
const rewardlocker = ref(null);
|
||||||
|
const contractQuoter = ref(null);
|
||||||
|
const poolContract = ref(null);
|
||||||
|
const memeAltarContract = ref(null);
|
||||||
|
const token0 = ref(null);
|
||||||
|
const token1 = ref(null);
|
||||||
|
const fee = ref(null);
|
||||||
|
const amountETHBase = ref(null);
|
||||||
|
const amount = 100 * Math.pow(10, 18);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
web3.value = new Web3(window.ethereum);
|
contractQuoter.value = getContract({
|
||||||
// const contract = new web3.value.eth.Contract(Meme1Json.abi, Meme1Json.contractAddress);
|
address: QuoterJson.contractAddress,
|
||||||
console.log("web3", web3.value);
|
abi: QuoterJson.abi,
|
||||||
const accounts = await web3.value.eth.getAccounts();
|
walletClient: walletV2Store.walletClient || walletV2Store.publicClient,
|
||||||
console.log("accounts", accounts);
|
});
|
||||||
web3.value.eth.Contract.defaultAccount = accounts[0];
|
|
||||||
|
|
||||||
contractMeme1.value = new web3.value.eth.Contract(Meme1Json.abi, Meme1Json.contractAddress);
|
poolContract.value = getContract({
|
||||||
contractBurner.value = new web3.value.eth.Contract(MemeBurnerJson.abi, MemeBurnerJson.contractAddress);
|
address: UniswapPoolJson.contractAddress,
|
||||||
|
abi: UniswapPoolJson.abi,
|
||||||
|
walletClient: walletV2Store.walletClient || walletV2Store.publicClient,
|
||||||
|
});
|
||||||
|
|
||||||
|
memeAltarContract.value = getContract({
|
||||||
|
address: MemeAltarJson.contractAddress,
|
||||||
|
abi: MemeAltarJson.abi,
|
||||||
|
walletClient: walletV2Store.walletClient || walletV2Store.publicClient,
|
||||||
|
});
|
||||||
|
console.log("poolContract.value", poolContract.value);
|
||||||
|
|
||||||
|
token0.value = await poolContract.value.read.token0();
|
||||||
|
token1.value = await poolContract.value.read.token1();
|
||||||
|
fee.value = await poolContract.value.read.fee();
|
||||||
|
|
||||||
|
console.log("input-amountEthBASE", {
|
||||||
|
memeToSacrifice: "0x4435ABC578136e2Eca50b5EFf950F17CAF42485b",
|
||||||
|
amountToSacrifice: amount,
|
||||||
|
roundParticipant: true,
|
||||||
|
});
|
||||||
|
amountETHBase.value = await memeAltarContract.value.read.getAmountETHBase([
|
||||||
|
"0x4435ABC578136e2Eca50b5EFf950F17CAF42485b",
|
||||||
|
amount,
|
||||||
|
true,
|
||||||
|
]);
|
||||||
|
console.log("amountETHBase123", amountETHBase.value);
|
||||||
|
// web3.value = new Web3(window.ethereum);
|
||||||
|
// // const contract = new web3.value.eth.Contract(Meme1Json.abi, Meme1Json.contractAddress);
|
||||||
|
// console.log("web3", web3.value);
|
||||||
|
// const accounts = await web3.value.eth.getAccounts();
|
||||||
|
// console.log("accounts", accounts);
|
||||||
|
// web3.value.eth.Contract.defaultAccount = accounts[0];
|
||||||
|
// rewardlocker.value = new web3.value.eth.Contract(
|
||||||
|
// RewardLockerJson.abi,
|
||||||
|
// RewardLockerJson.contractAddress
|
||||||
|
// );
|
||||||
});
|
});
|
||||||
|
|
||||||
async function approveMeme1() {
|
async function testQuoter(token0, token1, fee) {
|
||||||
var approve = await contractMeme1.value.methods
|
console.log("inputQuote", {
|
||||||
.approve(MemeBurnerJson.contractAddress, 10)
|
token1: token1,
|
||||||
.send({ from: web3.value.eth.Contract.defaultAccount });
|
token0: token0,
|
||||||
console.log("approve", approve);
|
fee: fee,
|
||||||
|
amountETHBase: amountETHBase.value,
|
||||||
|
sqrtPriceLimitX96: 0,
|
||||||
|
});
|
||||||
|
const quotedAmountOut = await contractQuoter.value.read.quoteExactInputSingle([
|
||||||
|
token1,
|
||||||
|
token0,
|
||||||
|
fee,
|
||||||
|
amountETHBase.value,
|
||||||
|
0,
|
||||||
|
]);
|
||||||
|
//rewardsUniswap3
|
||||||
|
//if getrewardforsacrifice 5% less than quoater amount
|
||||||
|
//buy below issuanceprice
|
||||||
|
//0 should be the issuanceprice (memealtar.issuanceprice)
|
||||||
|
//if input 0 not allow sacrifice
|
||||||
|
//before allowance just compare quoater with getrewardforsacrifice
|
||||||
|
//after allowance eth_call sacrificememe and sacrificebuyblood
|
||||||
|
//if error quoater --> usesacrificememe
|
||||||
|
|
||||||
|
//on sacrificememe calculate minEthAmount )
|
||||||
|
//on bloodbuy calculate minBloodamount (quoatedAmount * 0,995) - 100
|
||||||
|
//0,995 Schlupf (siehe app.uniswap (0,5%))
|
||||||
|
//if the price move more like this Schlupf (0,5%), dann revert
|
||||||
|
//uniswapv2 quoater for sacrificememe
|
||||||
|
console.log("quotedAmountOut", quotedAmountOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
// async function approveMeme2() {
|
async function claimView() {
|
||||||
// var approve = await contractMeme1.value.methods.approve(web3.value.eth.Contract.defaultAccount, 10).send({ from: web3.value.eth.Contract.defaultAccount })
|
var resultStake = await rewardLockerStore.contract.read.claim([[0, 1, 2]]);
|
||||||
// console.log("approve", approve);
|
console.log("resultStake", resultStake);
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
// change this value to make yourself rich quick
|
// change this value to make yourself rich quick
|
||||||
async function mintToken() {
|
async function mintToken() {
|
||||||
try {
|
try {
|
||||||
var mint = await contractMeme1.value.methods.mint("1000000000000000").send({ from: web3.value.eth.Contract.defaultAccount });
|
var mint = await tokenStore.token[0].contract.write.mint(["100000000000000000000000"]);
|
||||||
|
// .send({ from: web3.value.eth.Contract.defaultAccount });
|
||||||
console.log("mint", mint);
|
console.log("mint", mint);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
@@ -72,17 +151,202 @@ async function mintToken() {
|
|||||||
// console.log("totalSupply", totalSupply);
|
// console.log("totalSupply", totalSupply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function mintToken2() {
|
||||||
|
try {
|
||||||
|
var mint = await tokenStore.token[1].contract.write.mint(["100000000000000000000000"]);
|
||||||
|
// .send({ from: web3.value.eth.Contract.defaultAccount });
|
||||||
|
console.log("mint", mint);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
// var balanceOf = await contract.methods.balanceOf("0x66422602B2f4885c57EE794174f98d9E4DDBBBC6").call();
|
||||||
|
// console.log("balanceOf", balanceOf);
|
||||||
|
// var totalSupply = await contract.methods.totalSupply().call();
|
||||||
|
// console.log("totalSupply", totalSupply);
|
||||||
|
}
|
||||||
|
async function mintToken3() {
|
||||||
|
try {
|
||||||
|
var mint = await tokenStore.token[2].contract.write.mint(["100000000000000000000000"]);
|
||||||
|
// .send({ from: web3.value.eth.Contract.defaultAccount });
|
||||||
|
console.log("mint", mint);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
// var balanceOf = await contract.methods.balanceOf("0x66422602B2f4885c57EE794174f98d9E4DDBBBC6").call();
|
||||||
|
// console.log("balanceOf", balanceOf);
|
||||||
|
// var totalSupply = await contract.methods.totalSupply().call();
|
||||||
|
// console.log("totalSupply", totalSupply);
|
||||||
|
}
|
||||||
|
|
||||||
// 0.1 Meme will be sacrificed
|
async function fetchBalance() {
|
||||||
|
var result = await walletV2Store.fetchBalance();
|
||||||
|
console.log("result", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 100 Meme will be sacrificed
|
||||||
async function sacrificeMeme() {
|
async function sacrificeMeme() {
|
||||||
const allowance = await contractMeme1.value.methods
|
const allowance = await contractMeme1.value.methods
|
||||||
.allowance(web3.value.eth.Contract.defaultAccount, MemeBurnerJson.contractAddress)
|
.allowance(web3.value.eth.Contract.defaultAccount, MemeBurnerJson.contractAddress)
|
||||||
.call();
|
.call();
|
||||||
console.log("allowance", allowance);
|
console.log("allowance", allowance);
|
||||||
var reward = await contractBurner.value.methods
|
var reward = await contractBurner.value.methods
|
||||||
.sacrificeMeme(Meme1Json.contractAddress, "100000000000000000")
|
.sacrificeMeme(Meme1Json.contractAddress, "100000000000000000000")
|
||||||
.send({ from: web3.value.eth.Contract.defaultAccount });
|
.send({ from: web3.value.eth.Contract.defaultAccount });
|
||||||
console.log("reward", reward);
|
console.log("reward", reward);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function stake() {
|
||||||
|
const SECOND = 1000;
|
||||||
|
|
||||||
|
const fromAddress = "0x66422602B2f4885c57EE794174f98d9E4DDBBBC6";
|
||||||
|
// JavaScript dates have millisecond resolution
|
||||||
|
const deadline = Date.now() + 20 * 60;
|
||||||
|
|
||||||
|
const spender = "0x7C3D5a19878d550D0c6c2b0BFC884ef410F6e440";
|
||||||
|
console.log("deadline", deadline);
|
||||||
|
var nonceTest = await contractBloodline.value.methods.nonces(fromAddress).call();
|
||||||
|
console.log("type", typeof nonceTest);
|
||||||
|
console.log("nonceTest", nonceTest);
|
||||||
|
const value = (1 * Math.pow(10, 18)).toString();
|
||||||
|
console.log("value", value);
|
||||||
|
const messageData = createPermitMessageData(fromAddress, spender, nonceTest, deadline, value);
|
||||||
|
console.log("messageData", messageData);
|
||||||
|
console.log("messageData.message", messageData.message);
|
||||||
|
console.log("messageData.domain", messageData.domain);
|
||||||
|
console.log("messageData.primaryType", messageData.primaryType);
|
||||||
|
// const sig = await signData(fromAddress, messageData.typedData);
|
||||||
|
// const signature = await signTyped(fromAddress, messageData.typedData);
|
||||||
|
const typedData = JSON.parse(messageData.typedData);
|
||||||
|
console.log("typedData", typedData);
|
||||||
|
const signature = await signTypedData({
|
||||||
|
domain: messageData.domain,
|
||||||
|
message: messageData.message,
|
||||||
|
primaryType: messageData.primaryType,
|
||||||
|
types: typedData.types,
|
||||||
|
});
|
||||||
|
// console.log("sig", sig);
|
||||||
|
console.log("signature", signature);
|
||||||
|
|
||||||
|
const split = splitSig(signature);
|
||||||
|
|
||||||
|
console.log("split", split);
|
||||||
|
// var resultStake = await rewardlocker.value.methods
|
||||||
|
// .stakeToBeSecured(value, deadline, split.v, split.r, split.s)
|
||||||
|
// .send({ from: fromAddress });
|
||||||
|
console.log("rewardLockerStore.contract", rewardLockerStore.contract);
|
||||||
|
var resultStake = await rewardLockerStore.contract.write.stakeToBeSecured([
|
||||||
|
value,
|
||||||
|
deadline,
|
||||||
|
split.v,
|
||||||
|
split.r,
|
||||||
|
split.s,
|
||||||
|
]);
|
||||||
|
console.log("resultStake", resultStake);
|
||||||
|
|
||||||
|
var allowance = await tokenStore.memeToken.contract.read.allowance([fromAddress, spender]);
|
||||||
|
console.log("allowance", allowance);
|
||||||
|
// return Object.assign({}, sig, messageData.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
const signTyped = (fromAddress, dataToSign) => {
|
||||||
|
// call this method to sign EIP 712 data
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
web3.value.currentProvider.sendAsync(
|
||||||
|
{
|
||||||
|
method: "eth_signTypedData_v4",
|
||||||
|
params: [fromAddress, dataToSign],
|
||||||
|
from: fromAddress,
|
||||||
|
},
|
||||||
|
(err, result) => {
|
||||||
|
if (err) return reject(err);
|
||||||
|
resolve(result.result);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const splitSig = (sig) => {
|
||||||
|
// splits the signature to r, s, and v values.
|
||||||
|
// const pureSig = sig.replace("0x", "");
|
||||||
|
|
||||||
|
const r = sig.slice(0, 66);
|
||||||
|
const s = "0x" + sig.slice(66, 130);
|
||||||
|
const v = Number("0x" + sig.slice(130, 132));
|
||||||
|
return { v, r, s };
|
||||||
|
};
|
||||||
|
|
||||||
|
const signData = async function (fromAddress, typeData) {
|
||||||
|
const result = await window.ethereum.request({
|
||||||
|
id: 1,
|
||||||
|
method: "eth_signTypedData_v4",
|
||||||
|
params: [fromAddress, typeData],
|
||||||
|
from: fromAddress,
|
||||||
|
});
|
||||||
|
|
||||||
|
const r = result.slice(0, 66);
|
||||||
|
const s = "0x" + result.slice(66, 130);
|
||||||
|
const v = Number("0x" + result.slice(130, 132));
|
||||||
|
return { v, r, s };
|
||||||
|
};
|
||||||
|
|
||||||
|
const createPermitMessageData = function (fromAddress, spender, nonce, deadline, value) {
|
||||||
|
const message = {
|
||||||
|
owner: fromAddress,
|
||||||
|
spender: spender,
|
||||||
|
nonce: nonce,
|
||||||
|
deadline: deadline,
|
||||||
|
value: value,
|
||||||
|
};
|
||||||
|
|
||||||
|
const domainType = [
|
||||||
|
{ name: "name", type: "string" },
|
||||||
|
{ name: "version", type: "string" },
|
||||||
|
{ name: "chainId", type: "uint256" },
|
||||||
|
{ name: "verifyingContract", type: "address" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const typedData = JSON.stringify({
|
||||||
|
types: {
|
||||||
|
EIP712Domain: domainType,
|
||||||
|
Permit: [
|
||||||
|
{
|
||||||
|
name: "owner",
|
||||||
|
type: "address",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "spender",
|
||||||
|
type: "address",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "value",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nonce",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "deadline",
|
||||||
|
type: "uint256",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
primaryType: "Permit",
|
||||||
|
domain: {
|
||||||
|
name: "Bloodline",
|
||||||
|
version: "1",
|
||||||
|
chainId: 5,
|
||||||
|
verifyingContract: "0x9dcD7Cd83ED0Fe69DDfE3c2A265a1207F2Bc3219",
|
||||||
|
},
|
||||||
|
message: message,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
typedData,
|
||||||
|
message,
|
||||||
|
domain: JSON.parse(typedData).domain,
|
||||||
|
primaryType: JSON.parse(typedData).primaryType,
|
||||||
|
};
|
||||||
|
};
|
||||||
// console.log("balanceOf", contract.mint(10));
|
// console.log("balanceOf", contract.mint(10));
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div v-if="!fromAddress" @click="showConnectors = true">Connect</div>
|
||||||
|
<div v-if="showConnectors">
|
||||||
|
<div v-for="connector in config.connectors" @click="connectWallet(connector)">
|
||||||
|
{{ connector.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="fromAddress" @click="disconnectWallet">Disconnect</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, toRaw, onMounted, onUnmounted } from "vue";
|
||||||
|
import Meme1Json from "@/assets/contracts/Meme1.json";
|
||||||
|
|
||||||
|
const fromAddress = ref(null);
|
||||||
|
const showConnectors = ref(false);
|
||||||
|
import {
|
||||||
|
createConfig,
|
||||||
|
configureChains,
|
||||||
|
getAccount,
|
||||||
|
connect,
|
||||||
|
disconnect,
|
||||||
|
InjectedConnector,
|
||||||
|
getWalletClient,
|
||||||
|
} from "@wagmi/core";
|
||||||
|
|
||||||
|
import { WalletConnectConnector } from "@wagmi/core/connectors/walletConnect";
|
||||||
|
import { MetaMaskConnector } from "@wagmi/core/connectors/metaMask";
|
||||||
|
|
||||||
|
import { goerli } from "@wagmi/core/chains";
|
||||||
|
import { publicProvider } from "@wagmi/core/providers/public";
|
||||||
|
import { alchemyProvider } from "@wagmi/core/providers/alchemy";
|
||||||
|
const goerliKey = import.meta.env.VITE_GOERLI_KEY;
|
||||||
|
console.log("goerliKey", goerliKey);
|
||||||
|
const { chains, publicClient, webSocketPublicClient } = configureChains(
|
||||||
|
[goerli],
|
||||||
|
[alchemyProvider({ apiKey: goerliKey }), publicProvider()]
|
||||||
|
);
|
||||||
|
const projectId = "d8e5ecb0353c02e21d4c0867d4473ac5";
|
||||||
|
const config = ref(null);
|
||||||
|
const accountSub = ref(null);
|
||||||
|
// onMounted(() => {
|
||||||
|
// const account = getAccount();
|
||||||
|
// console.log("account", account);
|
||||||
|
// if (account.isConnected) {
|
||||||
|
// fromAddress.value = account.address;
|
||||||
|
// }
|
||||||
|
// accountSub.value = watchAccount((account) => {
|
||||||
|
// console.log("account123", account);
|
||||||
|
// fromAddress.value = account.address;
|
||||||
|
// walletStore.address = account.address;
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
// onUnmounted(() => {
|
||||||
|
// accountSub.value();
|
||||||
|
// console.log("unsubscribe");
|
||||||
|
// });
|
||||||
|
|
||||||
|
config.value = createConfig({
|
||||||
|
autoConnect: true,
|
||||||
|
connectors: [
|
||||||
|
new MetaMaskConnector({ chains }),
|
||||||
|
new WalletConnectConnector({
|
||||||
|
chains,
|
||||||
|
options: {
|
||||||
|
projectId: projectId,
|
||||||
|
showQrModal: true,
|
||||||
|
metadata: {
|
||||||
|
name: "Bloodline-App",
|
||||||
|
description: "TODO Bloodline Description",
|
||||||
|
url: "https://gitea.loseyourip.com/",
|
||||||
|
icons: ["https://gitea.loseyourip.com/assets/img/vampir.png"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
publicClient,
|
||||||
|
webSocketPublicClient,
|
||||||
|
});
|
||||||
|
console.log("config", config);
|
||||||
|
const walletClient = await getWalletClient();
|
||||||
|
console.log("walletClient", walletClient);
|
||||||
|
|
||||||
|
async function disconnectWallet() {
|
||||||
|
try {
|
||||||
|
await disconnect();
|
||||||
|
} catch (error) {
|
||||||
|
console.log("error", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function connectWallet(connector) {
|
||||||
|
console.log("connector.name", connector.name);
|
||||||
|
const rawConnector = toRaw(connector);
|
||||||
|
// if (!account.isConnected) {
|
||||||
|
const connection = await connect({
|
||||||
|
chainId: goerli.id,
|
||||||
|
connector: rawConnector,
|
||||||
|
});
|
||||||
|
console.log("Connecting to:", connection);
|
||||||
|
fromAddress.value = connection.account;
|
||||||
|
showConnectors.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function connect1() {
|
||||||
|
const connection = await connect({
|
||||||
|
chainId: goerli.id,
|
||||||
|
connector: new InjectedConnector(),
|
||||||
|
});
|
||||||
|
console.log("Connecting to:", connection);
|
||||||
|
}
|
||||||
|
async function getAccount1() {
|
||||||
|
const account = getAccount();
|
||||||
|
console.log("account", account);
|
||||||
|
}
|
||||||
|
</script>
|
||||||