Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d1e7dcbf5 | ||
|
|
cc3fb88d1e | ||
|
|
fcf6133a47 | ||
|
|
32db2d291c | ||
|
|
1b799b8825 | ||
|
|
99ff2cb166 | ||
|
|
6e58bc6319 | ||
|
|
74dd5b7e0a | ||
|
|
bc3b7eac67 | ||
|
|
44df04cc23 | ||
|
|
bf76e55fb5 | ||
|
|
fa4fa54033 | ||
|
|
167ad941bc | ||
|
|
cfaf527b95 | ||
|
|
f45128ceb9 | ||
|
|
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 |
@@ -27,3 +27,6 @@ coverage
|
|||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
|
# we want to force specific versions of dependencies to prevent malware injections
|
||||||
|
# yarn.lock
|
||||||
@@ -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,24 @@
|
|||||||
"@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",
|
||||||
|
"vite-svg-loader": "^4.0.0",
|
||||||
"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 |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 5.6 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: 1.9 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.7 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 |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 3.3 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: 91 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 963 B |
|
After Width: | Height: | Size: 3.6 KiB |
@@ -1,36 +1,59 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, onUnmounted, provide, ref } 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 { useWalletStore } from "@/stores/wallet";
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
const walletStore = useWalletStore();
|
|
||||||
import { useTokenStore } from "@/stores/tokens";
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
import { useContractStore } from "@/stores/contracts";
|
import { useSacrificeStore } from "@/stores/sacrifice";
|
||||||
import { useMemeburnerStore } from "@/stores/memeburner";
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
import { useMultiCallStore } from "@/stores/multicall";
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
import { useRoundsStore } from "@/stores/rounds";
|
|
||||||
const tokenStore = useTokenStore();
|
import SlideoutPanel from "./components/SlideoutPanel.vue";
|
||||||
const contractStore = useContractStore();
|
import ConnectWallet from "./components/ConnectWallet.vue";
|
||||||
const memeBurnerStore = useMemeburnerStore();
|
import BloodSplash from "./components/BloodSplash.vue";
|
||||||
const rewardLockerStore = useRewardLockerStore();
|
import { getNetwork, fetchTransaction } from "@wagmi/core";
|
||||||
const multiCallStore = useMultiCallStore();
|
|
||||||
const roundsStore = useRoundsStore();
|
import profileIcon from "@/assets/img/profile-icon.svg?component";
|
||||||
const { memeBurner, token } = storeToRefs(tokenStore);
|
import cycleIcon from "@/assets/img/cycle-icon.svg?component";
|
||||||
const { list } = storeToRefs(contractStore);
|
import homeIcon from "@/assets/img/home-icon.svg?component";
|
||||||
|
|
||||||
const isMobile = ref(false);
|
const isMobile = ref(false);
|
||||||
|
const showPanel = ref(false);
|
||||||
|
const splashBlood = ref(0);
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
isMobile.value = isMobileFunc();
|
isMobile.value = isMobileFunc();
|
||||||
let subscription;
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
window.removeEventListener("resize", handleWindowSizeChange);
|
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 = () => {
|
const handleWindowSizeChange = () => {
|
||||||
isMobile.value = isMobileFunc();
|
isMobile.value = isMobileFunc();
|
||||||
// your code
|
// your code
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//to have mobile breakpoint not only on sass side
|
||||||
function isMobileFunc() {
|
function isMobileFunc() {
|
||||||
if (screen.width <= 760) {
|
if (screen.width <= 760) {
|
||||||
return true;
|
return true;
|
||||||
@@ -38,134 +61,238 @@ function isMobileFunc() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function changeRoute(name) {
|
||||||
|
router.push({
|
||||||
|
name: name,
|
||||||
|
});
|
||||||
|
}
|
||||||
provide("isMobile", isMobile);
|
provide("isMobile", isMobile);
|
||||||
|
provide("showPanel", showPanel);
|
||||||
|
provide("splashBlood", splashBlood);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
window.addEventListener("resize", handleWindowSizeChange);
|
window.addEventListener("resize", handleWindowSizeChange);
|
||||||
handleWindowSizeChange();
|
handleWindowSizeChange();
|
||||||
//more or less tests
|
|
||||||
var test = await walletStore.isConnected();
|
|
||||||
console.log("test", test);
|
|
||||||
|
|
||||||
let web3 = new Web3("https://eth-goerli.g.alchemy.com/v2/0-W9tOm6v_QP1PfRV8RuBCpWr-qoEbkN");
|
console.log("beforeEach");
|
||||||
let web3socket = new Web3(
|
const memeBurnerStore = useMemeburnerStore();
|
||||||
new Web3.providers.WebsocketProvider("wss://eth-goerli.g.alchemy.com/v2/0-W9tOm6v_QP1PfRV8RuBCpWr-qoEbkN")
|
const cycleStore = useCycleStore();
|
||||||
);
|
const walletStore = useWalletStoreV2();
|
||||||
console.log("web3socket", web3socket);
|
walletStore.initialized = true;
|
||||||
|
console.log("init router");
|
||||||
//init
|
//check if it is necessary
|
||||||
|
if (!cycleStore.currentCycle) {
|
||||||
walletStore.web3 = web3;
|
cycleStore.currentCycle = parseInt(await memeBurnerStore.getCurrentCycle());
|
||||||
// const contract = new web3.eth.Contract(memeBurner.value.config.abi, memeBurner.value.config.contractAddress);
|
console.log("cycleStore.currentCycle", cycleStore.currentCycle);
|
||||||
list.value.memeBurnerPublic = new web3.eth.Contract(
|
cycleStore.activeCycle = cycleStore.currentCycle;
|
||||||
memeBurner.value.config.abi,
|
|
||||||
memeBurner.value.config.contractAddress
|
|
||||||
);
|
|
||||||
|
|
||||||
//Memeburner Contract
|
|
||||||
|
|
||||||
// var testabc = await memeBurnerStore.contract.methods
|
|
||||||
// .getSacrificedMeme(1, "0x4435ABC578136e2Eca50b5EFf950F17CAF42485b")
|
|
||||||
// .call();
|
|
||||||
// console.log("testabc", testabc);
|
|
||||||
|
|
||||||
// var data = await memeBurnerStore.getSacrificedRound(1);
|
|
||||||
// console.log("data", data);
|
|
||||||
// console.log("blub1", blub1);
|
|
||||||
// console.log("blub2", blub2);
|
|
||||||
// console.log("getSacrificedMeme", getSacrificedMeme1.amountAchieved);
|
|
||||||
// console.log("getGoal", getGoal);
|
|
||||||
// console.log("memeBurnerStore.contract", memeBurnerStore.contract);
|
|
||||||
// console.log("list", list.value);
|
|
||||||
// const rounds = await contract.methods.rounds("0x0e349D42C125acA39ea58024FFC23ED0fE5feE32").call();
|
|
||||||
// console.log("rounds", rounds);
|
|
||||||
|
|
||||||
// var claim = await rewardLockerStore.getTotalRewardsOf("0x60dd9D0e015115b9aEf61bEDCcBE1390CEEfC247", [1]);
|
|
||||||
// console.log("claim", claim);
|
|
||||||
|
|
||||||
// var lastCompletedRound = await rewardLockerStore.lastCompletedRound();
|
|
||||||
// console.log("lastCompletedRound", lastCompletedRound);
|
|
||||||
// var getwards = await rewardLockerStore.getRewards(
|
|
||||||
// "0x60dd9D0e015115b9aEf61bEDCcBE1390CEEfC247",
|
|
||||||
// 1,
|
|
||||||
// "0x4435ABC578136e2Eca50b5EFf950F17CAF42485b"
|
|
||||||
// );
|
|
||||||
// console.log("getwards", getwards);
|
|
||||||
|
|
||||||
//contracts
|
|
||||||
rewardLockerStore.contract = new web3.eth.Contract(
|
|
||||||
rewardLockerStore.config.abi,
|
|
||||||
rewardLockerStore.config.contractAddress
|
|
||||||
);
|
|
||||||
memeBurnerStore.contract = new web3.eth.Contract(
|
|
||||||
memeBurnerStore.config.abi,
|
|
||||||
memeBurnerStore.config.contractAddress
|
|
||||||
);
|
|
||||||
tokenStore.memeToken.contract = new web3.eth.Contract(
|
|
||||||
tokenStore.memeToken.config.abi,
|
|
||||||
tokenStore.memeToken.config.contractAddress
|
|
||||||
);
|
|
||||||
const websocketMemeBurner = new web3socket.eth.Contract(
|
|
||||||
memeBurnerStore.config.abi,
|
|
||||||
memeBurnerStore.config.contractAddress
|
|
||||||
);
|
|
||||||
multiCallStore.contract = new web3.eth.Contract(multiCallStore.config.abi, multiCallStore.config.contractAddress);
|
|
||||||
|
|
||||||
//init
|
|
||||||
roundsStore.currentRound = parseInt(await memeBurnerStore.getCurrentRound());
|
|
||||||
console.log("roundsStore.currentRound", roundsStore.currentRound);
|
|
||||||
roundsStore.activeRound = roundsStore.currentRound;
|
|
||||||
await roundsStore.fillRound(roundsStore.activeRound);
|
|
||||||
|
|
||||||
tokenStore.memeToken.decimals = parseInt(await tokenStore.memeToken.contract.methods.decimals().call());
|
|
||||||
for (let index = 0; index < token.value.length; index++) {
|
|
||||||
const _token = token.value[index];
|
|
||||||
_token.contract = new web3.eth.Contract(_token.abi, _token.contractAddress);
|
|
||||||
_token.decimals = parseInt(await _token.contract.methods.decimals().call());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("token123", token.value);
|
console.log("cycleStore.activeCycle", cycleStore.activeCycle);
|
||||||
|
await cycleStore.fillCycle(cycleStore.activeCycle);
|
||||||
//events
|
|
||||||
// var bleb = roundsStore.rounds[roundsStore.currentRound].find(
|
|
||||||
// (obj) => obj.contractAddress === "0x4435ABC578136e2Eca50b5EFf950F17CAF42485b"
|
|
||||||
// );
|
|
||||||
// console.log("roundsStore.rounds[roundsStore.currentRound]", bleb);
|
|
||||||
websocketMemeBurner.events
|
|
||||||
.MemeSacrificed()
|
|
||||||
.on("data", async (event) => {
|
|
||||||
console.log("sacrificedAmount", event.returnValues.sacrificedAmount);
|
|
||||||
console.log("sacrificedToken", event.returnValues.sacrificedToken);
|
|
||||||
await roundsStore.updateCurrentRound(
|
|
||||||
event.returnValues.sacrificedToken,
|
|
||||||
event.returnValues.sacrificedAmount
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.on("error", (error) => console.log("MemeSacrificederror", error));
|
|
||||||
});
|
});
|
||||||
</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">
|
||||||
<div class="footer-inner">
|
<div class="footer-inner">
|
||||||
$BLOOD is 100%<br />
|
<div class="footer-headline" v-if="!isMobile">Join Bloodline</div>
|
||||||
community owned.<br />
|
|
||||||
No team %, no pre-mine.
|
<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 class="social-bloodline-badge">
|
||||||
|
<div class="social-bloodline-badge-icon">
|
||||||
|
<font-awesome-icon icon="fa-solid fa-blog" />
|
||||||
|
</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" /> -->
|
||||||
|
<!-- <img src="/assets/img/sacrifice-icon.png" alt="sacrifice-icon" /> -->
|
||||||
|
<homeIcon />
|
||||||
|
</div>
|
||||||
|
<div @click="changeRoute('cycle')" :class="{ active: route.name === 'cycle' }">
|
||||||
|
<!-- <font-awesome-icon icon="fa-moon" /> -->
|
||||||
|
<!-- <img src="/assets/img/cycle-icon.png" alt="cycle-icon" /> -->
|
||||||
|
<cycleIcon />
|
||||||
|
</div>
|
||||||
|
<div @click="changeRoute('profile')" :class="{ active: route.name === 'profile' }">
|
||||||
|
<!-- <img src="/assets/img/profile-icon.svg " alt="profile-icon" /> -->
|
||||||
|
<profileIcon />
|
||||||
|
<!-- <font-awesome-icon icon="fa-person" /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
|
|
||||||
.footer
|
.footer
|
||||||
height: 450px
|
height: auto
|
||||||
min-height: 450px
|
background-color: #2D2D2D
|
||||||
background-color: var(--grey2)
|
padding-bottom: 72px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
background-color: var(--midnight-black)
|
||||||
|
height: 150px
|
||||||
|
min-height: 150px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: center
|
||||||
|
padding-bottom: unset
|
||||||
|
margin-top: auto
|
||||||
.footer-inner
|
.footer-inner
|
||||||
padding: 24px
|
padding: 24px 0
|
||||||
font-size: 24px
|
font-size: 24px
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
|
align-items: center
|
||||||
|
border-top: 1px solid #000
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 16px 0 24px 0
|
||||||
|
justify-content: center
|
||||||
|
border-top: unset
|
||||||
|
background-color: transparent
|
||||||
|
.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
|
||||||
|
-webkit-tap-highlight-color: transparent
|
||||||
|
|
||||||
|
|
||||||
|
&.active
|
||||||
|
svg
|
||||||
|
path
|
||||||
|
color: var(--purple)
|
||||||
|
fill: 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
|
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: 10%
|
||||||
|
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>
|
</style>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"contractName": "MemeToken",
|
"contractName": "Bloodline",
|
||||||
"contractAddress": "0x7D3e23Efa01745709b2123C4D17bcab86cBc55D1",
|
"contractAddress": "0x16351Cd1f3F1eb010758ff9FCf7013f48B0f5495",
|
||||||
"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": "0x2Cdea6EA15303b1744F05f62E6921479D31AcBC9",
|
"contractAddress": "0x460f41499B6dA662ce289b57ba62A75FBd753b5c",
|
||||||
"abi": [
|
"abi": [
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_memeToken",
|
"name": "_bloodline",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -21,250 +21,112 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"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[]",
|
"internalType": "int24",
|
||||||
"name": "positionsToCancel",
|
"name": "tickLower",
|
||||||
"type": "uint256[]"
|
"type": "int24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "int24",
|
||||||
"name": "amountOfWETHToUse",
|
"name": "tickUpper",
|
||||||
"type": "uint256"
|
"type": "int24"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "movePriceUP",
|
"name": "_concatenateTicks",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "int48",
|
||||||
"name": "amount0Collected",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "amount1Collected",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "nfPositionManager",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "contract INonfungiblePositionManager",
|
|
||||||
"name": "",
|
"name": "",
|
||||||
"type": "address"
|
"type": "int48"
|
||||||
}
|
|
||||||
],
|
|
||||||
"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",
|
"stateMutability": "pure",
|
||||||
@@ -273,17 +135,9 @@
|
|||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "int24",
|
||||||
"name": "",
|
"name": "tick",
|
||||||
"type": "uint256"
|
"type": "int24"
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "positions",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint128",
|
|
||||||
"name": "liquidity",
|
|
||||||
"type": "uint128"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "int24",
|
"internalType": "int24",
|
||||||
@@ -296,36 +150,36 @@
|
|||||||
"type": "int24"
|
"type": "int24"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"name": "_liquidityCanBeProvided",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "bool",
|
||||||
|
"name": "",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "bool",
|
"internalType": "int48",
|
||||||
"name": "round1",
|
|
||||||
"type": "bool"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "provideLiquidity",
|
|
||||||
"outputs": [],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "",
|
"name": "",
|
||||||
"type": "uint256"
|
"type": "int48"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "tokenIds",
|
"name": "_positions",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint112",
|
||||||
"name": "",
|
"name": "providedETH",
|
||||||
"type": "uint256"
|
"type": "uint112"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint112",
|
||||||
|
"name": "unprovidedETH",
|
||||||
|
"type": "uint112"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stateMutability": "view",
|
"stateMutability": "view",
|
||||||
@@ -333,7 +187,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "uniV3Pool",
|
"name": "bloodline",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
@@ -347,22 +201,267 @@
|
|||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "int256",
|
"internalType": "int24",
|
||||||
"name": "amount0Delta",
|
"name": "tickCycle",
|
||||||
"type": "int256"
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "calculateTicksForRange1",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickLower",
|
||||||
|
"type": "int24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "int256",
|
"internalType": "int24",
|
||||||
"name": "amount1Delta",
|
"name": "tickUpper",
|
||||||
"type": "int256"
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "pure",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickCycle",
|
||||||
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "calculateTicksForRange2",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickLower",
|
||||||
|
"type": "int24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickUpper",
|
||||||
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "pure",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickLower",
|
||||||
|
"type": "int24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "tickUpper",
|
||||||
|
"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": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "cycleTicks",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "int24",
|
||||||
|
"name": "",
|
||||||
|
"type": "int24"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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 +478,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,860 @@
|
|||||||
|
{
|
||||||
|
"contractName": "MemeAltar",
|
||||||
|
"contractAddress": "0xAa72C9dB8332c28b4ebcC36D927e967EFC98D78C",
|
||||||
|
"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": "GoalCannotBeZero",
|
||||||
|
"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": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "b",
|
||||||
|
"type": "uint64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "m",
|
||||||
|
"type": "uint64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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": [
|
||||||
|
{
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "newB",
|
||||||
|
"type": "uint64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "newM",
|
||||||
|
"type": "uint64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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": "b",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "bloodline",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "contract Bloodline",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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": "uint128",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint128"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "liquidityOwner",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "",
|
||||||
|
"type": "address"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [],
|
||||||
|
"name": "m",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint64",
|
||||||
|
"name": "",
|
||||||
|
"type": "uint64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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": "0x35640264BA900f4AF2b9e3743EA0578eCcF181bE",
|
"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"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,444 +0,0 @@
|
|||||||
{
|
|
||||||
"contractName": "Multicall3",
|
|
||||||
"contractAddress": "0xcA11bde05977b3631167028862bE2a173976CA11",
|
|
||||||
"abi": [
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "aggregate",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "blockNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "allowFailure",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call3[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "aggregate3",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "success",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Result[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "allowFailure",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "value",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call3Value[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "aggregate3Value",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "success",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Result[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "blockAndAggregate",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "blockNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes32",
|
|
||||||
"name": "blockHash",
|
|
||||||
"type": "bytes32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "success",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Result[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getBasefee",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "basefee",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "blockNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "getBlockHash",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bytes32",
|
|
||||||
"name": "blockHash",
|
|
||||||
"type": "bytes32"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getBlockNumber",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "blockNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getChainId",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "chainid",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getCurrentBlockCoinbase",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "coinbase",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getCurrentBlockDifficulty",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "difficulty",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getCurrentBlockGasLimit",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "gaslimit",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getCurrentBlockTimestamp",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "timestamp",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "addr",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "getEthBalance",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "balance",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [],
|
|
||||||
"name": "getLastBlockHash",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bytes32",
|
|
||||||
"name": "blockHash",
|
|
||||||
"type": "bytes32"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "requireSuccess",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "tryAggregate",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "success",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Result[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "requireSuccess",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "target",
|
|
||||||
"type": "address"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "callData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Call[]",
|
|
||||||
"name": "calls",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "tryBlockAndAggregate",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "blockNumber",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes32",
|
|
||||||
"name": "blockHash",
|
|
||||||
"type": "bytes32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "success",
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "bytes",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "bytes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"internalType": "struct Multicall3.Result[]",
|
|
||||||
"name": "returnData",
|
|
||||||
"type": "tuple[]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "payable",
|
|
||||||
"type": "function"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -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": "0x061ff0C800aBc1F3C42f696BeB73C70c6929863a",
|
"contractAddress": "0x8b15b2CB5b019472C31aEf487BF700037c321F85",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -119,7 +162,7 @@
|
|||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "roundNumber",
|
"name": "cycleNumber",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -138,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": true,
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "totalRoundRewards",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "RoundCompleted",
|
|
||||||
"type": "event"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"anonymous": false,
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"indexed": true,
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "index",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "RoundStarted",
|
|
||||||
"type": "event"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"anonymous": false,
|
"anonymous": false,
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -188,7 +193,7 @@
|
|||||||
{
|
{
|
||||||
"indexed": true,
|
"indexed": true,
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -201,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[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -229,7 +247,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -248,7 +266,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -272,7 +290,70 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "roundNumber",
|
"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"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -291,7 +372,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "roundNumber",
|
"name": "cycleNumber",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -314,26 +395,26 @@
|
|||||||
{
|
{
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "address",
|
||||||
"name": "roundNumber",
|
"name": "user",
|
||||||
"type": "uint256"
|
"type": "address"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "sacrificedToken",
|
"name": "sacrificedToken",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "getSacrificedTokenTotalRewards",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "totalDefaultRewardsForToken",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "totalRewardsForToken",
|
"name": "reward",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "getStakeRewardForSacrificeReward",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "stakeReward",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -349,7 +430,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "roundNumbers",
|
"name": "cycleNumbers",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -357,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"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -373,7 +483,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "address",
|
"internalType": "address",
|
||||||
"name": "_memeToken",
|
"name": "_bloodline",
|
||||||
"type": "address"
|
"type": "address"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -384,7 +494,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"name": "lastCompletedRound",
|
"name": "lastCompletedCycle",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
@@ -408,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"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -438,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"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -447,7 +568,7 @@
|
|||||||
"type": "address[]"
|
"type": "address[]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name": "registerNextRound",
|
"name": "registerNextCycle",
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"internalType": "bool",
|
"internalType": "bool",
|
||||||
@@ -487,88 +608,6 @@
|
|||||||
"stateMutability": "nonpayable",
|
"stateMutability": "nonpayable",
|
||||||
"type": "function"
|
"type": "function"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "uint256",
|
|
||||||
"name": "roundIndex",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"internalType": "address",
|
|
||||||
"name": "winnerToken",
|
|
||||||
"type": "address"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"name": "registerRoundCompleted",
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"internalType": "bool",
|
|
||||||
"name": "",
|
|
||||||
"type": "bool"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"internalType": "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": [
|
||||||
{
|
{
|
||||||
@@ -578,7 +617,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -646,7 +685,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256[]",
|
"internalType": "uint256[]",
|
||||||
"name": "_rounds",
|
"name": "_cycles",
|
||||||
"type": "uint256[]"
|
"type": "uint256[]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -708,7 +747,7 @@
|
|||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"internalType": "uint256",
|
"internalType": "uint256",
|
||||||
"name": "unstakeRound",
|
"name": "unstakeCycle",
|
||||||
"type": "uint256"
|
"type": "uint256"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"contractName": "WETH",
|
||||||
|
"contractAddress": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",
|
||||||
|
"contractAddressMainnet": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
||||||
|
}
|
||||||
@@ -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"}]
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.5332 0.223612C14.5688 -0.68935 16.3324 1.37298 15.6956 3.16362C13.5347 9.2395 14.8624 16.1404 19.3476 20.6276C23.8556 25.1377 30.7963 26.4633 36.8868 24.2619C38.659 23.6213 40.6637 25.369 39.7876 27.3579C39.7616 27.4167 39.7355 27.4752 39.7091 27.534C38.1498 30.9948 35.6553 34.2494 32.4281 36.4315C28.9883 38.7574 24.9319 40 20.7803 40H20.7783C15.9506 39.9948 11.2749 38.3095 7.5529 35.2332C3.83085 32.1569 1.2942 27.8809 0.377993 23.1382C-0.538209 18.3955 0.22314 13.4818 2.53147 9.23928C4.71976 5.21736 8.39949 2.09189 12.4733 0.250546L12.5332 0.223612Z" fill="#F9F9FA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 731 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="30" height="40" viewBox="0 0 30 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.4808 0.762253C16.1401 0.28454 15.5867 0 14.9994 0C14.4107 0 13.8586 0.283234 13.5153 0.762253C9.85024 5.87744 0.667969 19.3317 0.667969 25.6686C0.667969 33.5835 7.08316 40 14.9981 40C22.9143 40 29.3308 33.5835 29.3308 25.6686C29.3321 19.3317 20.1459 5.87744 16.4808 0.762253Z" fill="#F9F9FA"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 410 B |
@@ -0,0 +1,12 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_1478_31440)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.8333 12C11.8333 7.58797 15.498 7.6 19.9997 7.6C24.5035 7.6 28.1661 7.58797 28.1661 12C28.1661 16.412 24.5035 20 19.9997 20C15.498 20 11.8333 16.412 11.8333 12ZM39.9114 35.2719C38.4271 28.5539 33.7845 23.5959 27.674 21.3459C30.912 18.7919 32.8005 14.6619 32.1063 10.1399C31.302 4.89386 26.8472 0.695954 21.4697 0.0839537C14.0464 -0.762046 7.75014 4.89797 7.75014 12C7.75014 15.78 9.53858 19.1479 12.3274 21.3459C6.21487 23.5959 1.57433 28.5539 0.088048 35.2719C-0.450933 37.7139 1.558 40 4.10795 40H35.8915C38.4434 40 40.4524 37.7139 39.9114 35.2719Z" fill="#F9F9FA"/>
|
||||||
|
<path d="M17.2809 18.8008L16.4813 16.4008L15.2025 15.2008L19.3594 15.2008L18.0813 16.4008L17.2809 18.8008Z" fill="#F9F9FA"/>
|
||||||
|
<path d="M23.359 18.8008L22.5594 16.4008L21.2806 15.2008L25.4375 15.2008L24.1594 16.4008L23.359 18.8008Z" fill="#F9F9FA"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_1478_31440">
|
||||||
|
<rect width="40" height="40" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 62 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,53 +1,34 @@
|
|||||||
.bloodline-devider
|
.bloodline-devider
|
||||||
font-size: 42px
|
font-size: 42px
|
||||||
text-align: center
|
text-align: center
|
||||||
margin: 16px 0
|
|
||||||
@media (min-width: 992px)
|
|
||||||
margin: 24px 0
|
|
||||||
|
|
||||||
.bloodline-border
|
.bloodline-border
|
||||||
padding: 16px
|
padding: 12px
|
||||||
border-radius: 16px
|
border-radius: 16px
|
||||||
border: 2px solid #000
|
border: 2px solid #000
|
||||||
&.bloodline-border--variant1
|
&.bloodline-border--variant1
|
||||||
border: 4px solid var(--midnight-black)
|
border: 3px solid var(--midnight-black)
|
||||||
@media (min-width: 992px)
|
&.bloodline-border__thin
|
||||||
border: 4px solid #000
|
border-width: 1px
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
padding: 24px 32px
|
padding: 18px 24px
|
||||||
border: 4px solid #000
|
border: 3px solid #000
|
||||||
&.purple
|
&.purple
|
||||||
border-color: var(--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
|
||||||
.card
|
background-color: var(--grey)
|
||||||
display: block
|
|
||||||
overflow: hidden
|
|
||||||
overflow-wrap: break-word
|
|
||||||
position: relative
|
|
||||||
padding: 0
|
|
||||||
text-decoration: none
|
|
||||||
transition-duration: .28s
|
|
||||||
transition-property: box-shadow,opacity,background
|
|
||||||
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: 16px
|
|
||||||
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
|
|
||||||
@media (min-width: 992px)
|
|
||||||
border-radius: 4px
|
|
||||||
&.card--variant1
|
|
||||||
border-radius: 0
|
|
||||||
|
|
||||||
.bloodline-token
|
.bloodline-token
|
||||||
height: 50px
|
height: 50px
|
||||||
|
|||||||
@@ -1,16 +1,25 @@
|
|||||||
|
|
||||||
.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: $purple
|
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
|
color: var(--white-dark)
|
||||||
@media (min-width: 992px)
|
|
||||||
background-color: $red
|
|
||||||
&: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,16 +33,19 @@ body
|
|||||||
#app
|
#app
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
.footer
|
height: 100vh
|
||||||
margin-top: auto
|
|
||||||
|
|
||||||
.container
|
.container
|
||||||
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
|
||||||
padding-right: 15px
|
|
||||||
padding-left: 15px
|
|
||||||
|
|
||||||
h1
|
h1
|
||||||
font-weight: 700
|
font-weight: 700
|
||||||
|
|||||||
@@ -9,13 +9,16 @@ $tertiary-dark: darken($tertiary, 20%)
|
|||||||
$tertiary-light: lighten($tertiary, 20%)
|
$tertiary-light: lighten($tertiary, 20%)
|
||||||
|
|
||||||
$white: #F9F9FA
|
$white: #F9F9FA
|
||||||
|
$white-dark: darken($white, 20%)
|
||||||
$black: #0F0F0F
|
$black: #0F0F0F
|
||||||
$grey: #808080
|
$grey: #858585
|
||||||
|
$grey-light: lighten($grey, 20%)
|
||||||
$red: #8B0000
|
$red: #8B0000
|
||||||
$purple: #4B0082
|
$purple: #4B0082
|
||||||
$midnight-black: #0F0F0F
|
$midnight-black: #0F0F0F
|
||||||
$darkgrey: #202020
|
$darkgrey: #202020
|
||||||
$grey2: #2D2D2D
|
$grey2: #2D2D2D
|
||||||
|
$dark-grey: #202020
|
||||||
|
|
||||||
$button-color: $white
|
$button-color: $white
|
||||||
$button-background-color: $black
|
$button-background-color: $black
|
||||||
@@ -29,15 +32,100 @@ $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: #{$white}
|
||||||
|
--white-dark: #{$white-dark}
|
||||||
--grey: #{$grey}
|
--grey: #{$grey}
|
||||||
|
--grey-light: #{$grey-light}
|
||||||
--grey2: #{$grey2}
|
--grey2: #{$grey2}
|
||||||
|
--dark-grey: #{$dark-grey}
|
||||||
--purple: #{$purple}
|
--purple: #{$purple}
|
||||||
--blood-color: #{$red}
|
--blood-color: #{$red}
|
||||||
--midnight-black: #{$midnight-black}
|
--midnight-black: #{$midnight-black}
|
||||||
|
--black: #{$midnight-black}
|
||||||
--darkgrey: #{$darkgrey}
|
--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
|
||||||
|
.sub-header-2
|
||||||
|
font-family: Inter
|
||||||
|
font-style: normal
|
||||||
|
font-weight: 400
|
||||||
|
line-height: normal
|
||||||
|
font-size: 24px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
font-size: 32px
|
||||||
|
|
||||||
// :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,15 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="blood-chart-wrapper" v-if="props.data">
|
<div class="blood-chart-wrapper">
|
||||||
<div class="blood-chart-element" v-for="coin in props.data.token" :key="coin.name">
|
<div class="blood-arrow left">
|
||||||
<div class="blood-chart-element-header">
|
<img
|
||||||
<div class="blood-chart-coin">
|
class="swiper-arrow"
|
||||||
<img :src="getImageUrl(coin.vamplogo)" alt="logo" />
|
src="/assets/img/blood-arrow-left.png"
|
||||||
|
alt="left-arrow"
|
||||||
|
@click="swiperInstance.slidePrev()"
|
||||||
|
v-if="token?.length > 3"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<swiper
|
||||||
|
class="blood-chart"
|
||||||
|
:slidesPerView="3"
|
||||||
|
:centeredSlides="false"
|
||||||
|
:initial-slide="0"
|
||||||
|
:spaceBetween="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 class="logo" :src="coin.vamplogo" alt="logo" />
|
||||||
|
<img class="crown" src="/assets/img/winnerCrown.png" alt="" />
|
||||||
|
</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>
|
||||||
<div class="blood-chart-coin-title">{{ coin.name }}</div>
|
<div class="blood-chart-element-body">
|
||||||
</div>
|
<div class="blood-chart-bar-wrapper">
|
||||||
<div class="blood-chart-element-body">
|
|
||||||
<div class="blood-chart-bar-wrapper">
|
|
||||||
<div class="blood-chart-bar" :style="`height: ${getPercentage(coin.amount, props.data.goal)}%`">
|
|
||||||
<svg
|
<svg
|
||||||
class="waves"
|
class="waves"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@@ -31,121 +53,204 @@
|
|||||||
<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">{{ getPercentage(coin.amount, props.data.goal) }}%</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="blood-chart-element-footer">
|
||||||
<div class="blood-chart-element-footer">
|
<div
|
||||||
<div class="blood-chart-amount">
|
class="blood-chart-amount"
|
||||||
{{ compactNumber(coin.amount) }}
|
:title="formatBigIntDivision(coin.amountInBLD, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
>
|
||||||
|
{{
|
||||||
|
compactNumber(formatBigIntDivision(coin.amountInBLD, 10n ** tokenStore.memeToken.decimals))
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<div>$BLOOD</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="blood-chart-coin">$BLOOD</div>
|
</swiper-slide>
|
||||||
</div>
|
|
||||||
|
<!-- <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>
|
||||||
import { getPercentage, compactNumber } from "@/helper/helper.js";
|
import { computed, ref, inject, onMounted } from "vue";
|
||||||
|
import { getPercentage, formatNumber, compactNumber, formatBigIntDivision } from "@/helper/helper.js";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
|
||||||
|
import { useMemeburnerStore } from "@/stores/memeburner";
|
||||||
|
import { useTokenStore } from "@/stores/tokens";
|
||||||
|
|
||||||
|
import { Swiper, SwiperSlide } from "swiper/vue";
|
||||||
|
|
||||||
|
// Import Swiper styles
|
||||||
|
import "swiper/css";
|
||||||
|
import "swiper/css/navigation";
|
||||||
|
import "swiper/css/pagination";
|
||||||
|
|
||||||
|
const cycleStore = useCycleStore();
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
|
||||||
|
const isMobile = inject("isMobile");
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: Array,
|
data: Object,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(props.data);
|
onMounted(() => {
|
||||||
|
console.log("bloodchart-data", props.data);
|
||||||
|
});
|
||||||
|
|
||||||
function getImageUrl(url) {
|
const swiperInstance = ref();
|
||||||
return new URL(url, import.meta.url).href;
|
|
||||||
|
function onSwiper(swiper) {
|
||||||
|
swiperInstance.value = swiper;
|
||||||
}
|
}
|
||||||
|
|
||||||
// const dataPoints = [
|
const token = computed(() => {
|
||||||
// {
|
return props.data?.token.sort((a, b) => (a.amount > b.amount ? -1 : b.amount > a.amount ? 1 : 0));
|
||||||
// name: "$PEPE",
|
});
|
||||||
// percentage: 62.2,
|
|
||||||
// icon: "/src/assets/img/token/pepevamp.png",
|
//start with visual 8% of the filled bar, because otherwise the percentage number is not visible
|
||||||
// },
|
function getPercentageBloodChart(amount, goal) {
|
||||||
// {
|
let returnNumber = 8;
|
||||||
// name: "$SHIB",
|
if ((Number(amount) / Number(goal)) * 100 < 8) {
|
||||||
// percentage: 31.2,
|
returnNumber = 8;
|
||||||
// icon: "/src/assets/img/token/shibvamp.png",
|
} else {
|
||||||
// },
|
returnNumber = (Number(amount) / Number(goal)) * 100;
|
||||||
// {
|
}
|
||||||
// name: "$ELON",
|
return returnNumber.toFixed(2);
|
||||||
// percentage: 54.5,
|
}
|
||||||
// icon: "/src/assets/img/token/elonvamp.png",
|
|
||||||
// },
|
|
||||||
// ];
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.blood-chart-wrapper
|
.blood-chart-wrapper
|
||||||
height: 750px
|
// margin-top: 56px
|
||||||
|
display: flex
|
||||||
|
justify-content: center
|
||||||
|
// margin-bottom: 80px
|
||||||
|
position: relative
|
||||||
|
margin-top: 24px
|
||||||
|
.blood-chart
|
||||||
|
height: 560px
|
||||||
width: 100%
|
width: 100%
|
||||||
justify-content: space-around
|
justify-content: space-around
|
||||||
display: inline-flex
|
display: inline-flex
|
||||||
|
overflow: unset
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
gap: 96px
|
gap: 32px
|
||||||
width: unset
|
width: unset
|
||||||
justify-content: 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
|
|
||||||
margin-left: auto
|
margin-left: auto
|
||||||
margin-right: auto
|
margin-right: auto
|
||||||
position: relative
|
position: relative
|
||||||
margin-bottom: 16px
|
margin-bottom: 16px
|
||||||
overflow: hidden
|
// overflow: hidden
|
||||||
|
height: 80px
|
||||||
|
width: 80px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
height: 72px
|
||||||
|
width: 72px
|
||||||
|
img
|
||||||
|
&.logo
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
border: 1px solid yellow
|
||||||
|
border-radius: 50%
|
||||||
|
|
||||||
|
img
|
||||||
|
&.crown
|
||||||
|
position: absolute
|
||||||
|
top: -10px
|
||||||
|
transform: translate(-50%, -50%)
|
||||||
|
left: 50%
|
||||||
.blood-chart-coin-title
|
.blood-chart-coin-title
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-bottom: 32px
|
margin-bottom: 32px
|
||||||
font-size: 16px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
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: 1 1 100%
|
||||||
|
width: 60px
|
||||||
border-radius: 8px 8px 40px 40px
|
border-radius: 8px 8px 40px 40px
|
||||||
text-align: left
|
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: 0 0 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: -10px
|
|
||||||
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,81 @@
|
|||||||
|
<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
|
||||||
|
.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,244 @@
|
|||||||
|
<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, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
></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 > 0n">
|
||||||
|
<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" v-if="stateStake === 0">
|
||||||
|
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="
|
||||||
|
tokenNumber > 0 &&
|
||||||
|
BigInt(tokenNumber) * 10n ** tokenStore.memeToken.decimals >
|
||||||
|
walletStore.unclaimedRewards
|
||||||
|
"
|
||||||
|
>
|
||||||
|
Insufficient Balance
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-else-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-else-if="stateClaimComp === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal stake-button" disabled v-else-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, 10n ** tokenStore.memeToken.decimals) }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</stake-menu>
|
||||||
|
</Transition>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="cycleStore.rewardsSacrificeCurrentCycle > 0n">
|
||||||
|
<div class="connected-stake-buttons">
|
||||||
|
<div class="btn btn-immortal mid-mid-text btn--disabled">Claim</div>
|
||||||
|
<div class="btn btn-immortal mid-mid-text btn--disabled">Stake</div>
|
||||||
|
</div>
|
||||||
|
<div class="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 { useCycleStore } from "@/stores/cycles";
|
||||||
|
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 cycleStore = useCycleStore();
|
||||||
|
|
||||||
|
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 {
|
||||||
|
stateClaim.value = 2;
|
||||||
|
const coefficient = BigInt(10000 * tokenNumber.value) / walletStore.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 = formatNumber(BigInt(rewardData.topics[2]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
showSuccessToast(
|
||||||
|
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 = formatNumber(BigInt(rewardData.topics[2]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
showSuccessToast(
|
||||||
|
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 ||
|
||||||
|
BigInt(tokenNumber.value) > walletStore.unclaimedRewards / 10n ** tokenStore.memeToken.decimals
|
||||||
|
) {
|
||||||
|
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,217 @@
|
|||||||
|
<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'">
|
||||||
|
<template v-if="connector.name === 'MetaMask'">
|
||||||
|
<img :src="`/assets/img/connectors/metaMask.svg`" :alt="`${connector.name} Logo`" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<font-awesome-icon :icon="['fas', 'wallet']" />
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<img :src="`/assets/img/connectors/${connector.id}.svg`" :alt="`${connector.name} Logo`" />
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="connector-name">
|
||||||
|
{{ connector.name }}
|
||||||
|
</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" :title="walletStore.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="
|
||||||
|
formatNumber(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, formatNumber } 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) {
|
||||||
|
console.log("connector", connector);
|
||||||
|
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
|
||||||
|
.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,11 +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, inject } 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);
|
|
||||||
const isMobile = inject("isMobile");
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
@@ -18,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);
|
||||||
});
|
});
|
||||||
@@ -27,109 +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" v-if="!isMobile">
|
|
||||||
<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="!isMobile">
|
|
||||||
<div v-if="!connected" class="btn btn-immortal" @click="walletStore.connectWallet">connect</div>
|
|
||||||
<span v-else> {{ address }}</span>
|
|
||||||
</div>
|
|
||||||
<div v-else class="hamburger-menu">
|
|
||||||
<font-awesome-icon :icon="['fas', 'bars']" />
|
|
||||||
</div>
|
|
||||||
</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)
|
|
||||||
transition: transform .3s ease,visibility 0s .3s linear
|
|
||||||
height: 82px
|
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
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
|
||||||
@media (min-width: 992px)
|
width: 50px
|
||||||
padding: 16px 24px
|
|
||||||
.navbar-icon
|
|
||||||
img
|
|
||||||
height: 50px
|
|
||||||
width: 50px
|
|
||||||
.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)
|
||||||
font-size: 64px
|
height: 56px
|
||||||
.navbar-center
|
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)
|
||||||
|
font-size: 42px
|
||||||
|
a
|
||||||
|
text-decoration: none
|
||||||
|
color: white
|
||||||
|
.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
|
||||||
&:hover,&:active,&:focus
|
img
|
||||||
background-color: lighten(#0F0F0F, 10%)
|
width: 20px
|
||||||
cursor: pointer
|
height: 20px
|
||||||
.social-bloodline-badge-icon
|
|
||||||
margin-right: 8px
|
|
||||||
.navbar-end
|
|
||||||
|
.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
|
||||||
margin-left: auto
|
justify-content: center
|
||||||
.hamburger-menu
|
align-items: center
|
||||||
color: var(--purple)
|
img
|
||||||
font-size: 42px
|
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>
|
||||||
|
|||||||
@@ -1,53 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="rewards-wrapper">
|
<div class="rewards-wrapper">
|
||||||
<div class="rewards-header">
|
<div class="rewards-headline low-mid-text">
|
||||||
<div class="rewards-header-title">
|
<div class="rewards-title">{{ props.title }}</div>
|
||||||
{{ props.title }}
|
<div class="rewards-sub-title" v-if="props.subTitle">{{ props.subTitle }}</div>
|
||||||
</div>
|
|
||||||
<div class="rewards-header-info">{{ props.info }}</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="rewards-sacrifice-wrapper bloodline-border bloodline-border--variant1">
|
<div class="rewards-inner">
|
||||||
<div class="rewards-body">
|
<token-name-price name="$BLOOD" :price="props.amount"></token-name-price>
|
||||||
<div class="rewards-coin">$BLOOD</div>
|
<token-logo :img="props.image" :alt="'vampire'"></token-logo>
|
||||||
<div class="rewards-amount">0</div>
|
|
||||||
</div>
|
|
||||||
<img class="bloodline-token" :src="props.image" alt="vampir" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import TokenNamePrice from "@/components/TokenNamePrice.vue";
|
||||||
|
import TokenLogo from "@/components/TokenLogo.vue";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
title: String,
|
title: String,
|
||||||
|
subTitle: String,
|
||||||
info: String,
|
info: String,
|
||||||
|
amount: [String, Number],
|
||||||
image: String,
|
image: String,
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.rewards-header
|
.rewards-wrapper
|
||||||
font-size: 16px
|
|
||||||
padding: 8px
|
|
||||||
display: flex
|
display: flex
|
||||||
@media (min-width: 992px)
|
flex-direction: column
|
||||||
font-size: 24px
|
gap: 8px
|
||||||
.rewards-header-info
|
padding: 6px 0
|
||||||
margin-left: auto
|
.rewards-inner
|
||||||
.rewards-sacrifice-wrapper, .rewards-clan-wrapper
|
display: flex
|
||||||
display: flex
|
padding: 0 6px 6px 6px
|
||||||
.rewards-body
|
border-bottom: 1px solid var(--grey, #858585)
|
||||||
align-self: center
|
justify-content: space-between
|
||||||
.rewards-coin
|
box-sizing: content-box
|
||||||
font-size: 16px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
font-size: 24px
|
|
||||||
.rewards-amount
|
|
||||||
font-size: 24px
|
|
||||||
margin-top: 8px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
font-size: 40px
|
|
||||||
margin-top: 0
|
|
||||||
img
|
|
||||||
margin-left: auto
|
|
||||||
align-self: center
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,250 +1,478 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="sacrifice-wrapper card bloodline-wrapper">
|
<div class="sacrifice-wrapper card card--glow">
|
||||||
{{ activeToken.allowance }}
|
<div class="sacrifice-headline">Select Sacrifice</div>
|
||||||
|
<div class="sacrifice-select-tokens">
|
||||||
<div class="sacrifice-inner">
|
<div class="sacrifice-tokens">
|
||||||
<div class="sacrifice-headline">Select Sacrifice</div>
|
<div
|
||||||
<div class="sacrifice-select-tokens">
|
class="sacrifice-token"
|
||||||
<div class="sacrifice-tokens">
|
:class="[
|
||||||
<div
|
{
|
||||||
class="sacrifice-token"
|
'sacrifice-token--active': token.contractAddress === activeToken.contractAddress,
|
||||||
:class="[{ 'sacrifice-token--active': token.contractAddress === activeToken.contractAddress }]"
|
'bloodline-border': token.contractAddress === activeToken.contractAddress,
|
||||||
v-for="token in props.data"
|
'bloodline-border--variant1': token.contractAddress === activeToken.contractAddress,
|
||||||
:key="token.contractAddress"
|
},
|
||||||
@click="tokenStore.changeActiveToken(token)"
|
]"
|
||||||
>
|
v-for="token in props.data"
|
||||||
<div class="sacrifice-token-logo">
|
:key="token.contractAddress"
|
||||||
<img v-if="isMobile" :src="token.logoMobile" alt="token logo" />
|
@click="changeActiveToken(token)"
|
||||||
<img v-if="!isMobile" :src="token.logo" alt="token logo" />
|
>
|
||||||
</div>
|
<div class="sacrifice-token-logo">
|
||||||
<div class="sacrifice-token-name">{{ token.name }}</div>
|
<img v-if="isMobile" :src="token.logoMobile" alt="token logo" />
|
||||||
|
<img v-if="!isMobile" :src="token.logo" alt="token logo" />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="sacrifice-token-name mid-text">{{ token.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sacrifice-from-to-wrapper" v-if="activeToken.contractAddress">
|
</div>
|
||||||
<div class="sacrifice-from-wrapper bloodline-border bloodline-border--variant1">
|
<div class="sacrifice-from-to-wrapper" v-if="activeToken.contractAddress">
|
||||||
<div class="sarcrifice-from-input">
|
<div class="sacrifice-from-wrapper bloodline-border bloodline-border--variant1 purple">
|
||||||
<input @input="processChange" v-model="tokenNumber" :placeholder="0" />
|
<token-input
|
||||||
<div class="sacrifice-logo">
|
:modelValue="sacrificeStore.sacrificeNumber / 10n ** activeToken.decimals"
|
||||||
<img :src="activeToken.logo" alt="vampir" />
|
@input="
|
||||||
</div>
|
($event) => {
|
||||||
</div>
|
const value = BigInt($event.target.value) * 10n ** activeToken.decimals;
|
||||||
<div class="value-adder">
|
sacrificeStore.sacrificeNumber = value;
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(10000000)">+10m</div>
|
processChange(value);
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(100000000)">+100m</div>
|
}
|
||||||
<div class="sacrifice-adder-step bloodline-badge" @click="addTokens(1000000000)">+1b</div>
|
"
|
||||||
<!-- <div class="sacrifice-adder-balance">Balance: {{ parseFloat(activeToken.balance) }}</div>
|
:max="activeWalletToken?.balanceOf"
|
||||||
<div class="sacrifice-adder-max" @click="tokenNumber = parseFloat(activeToken.balance)">
|
:logo="activeToken.logo"
|
||||||
Max
|
>
|
||||||
</div> -->
|
<template v-slot:message>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sacrifice-divider bloodline-devider">
|
|
||||||
<font-awesome-icon :icon="['fas', 'arrow-down']" />
|
|
||||||
</div>
|
|
||||||
<div class="sacrifice-to-wrapper bloodline-border bloodline-border--variant1">
|
|
||||||
<div class="sarcrifice-from-input">
|
|
||||||
<div class="sacrifice-to-output">
|
|
||||||
<div class="sacrifice-to-output-coin">$BLOOD</div>
|
|
||||||
<div class="sacrifice-to-output-rewards">{{ output }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="sacrifice-logo">
|
|
||||||
<img :src="activeToken.vamp.logo" :alt="activeToken.vamp.name" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sacrifice-fees-info-wrapper">
|
|
||||||
<div class="sacrifice-fees-img">
|
|
||||||
<img src="@/assets/img/fuel-noozle.png" alt="fuel noozle" />
|
|
||||||
</div>
|
|
||||||
<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 class="sacrifice-buttons-function-wrapper">
|
|
||||||
<div v-if="connected">
|
|
||||||
<div
|
<div
|
||||||
class="btn btn-immortal"
|
class="sacrifice-adder-step bloodline-badge"
|
||||||
v-if="activeToken.allowance > 0 && activeToken.allowance >= tokenNumber"
|
v-for="steps in activeToken.addSteps"
|
||||||
@click="approvalData = tokenStore.sacrificeToken(tokenNumber)"
|
:key="steps.name"
|
||||||
|
@click="addTokens(steps.amount)"
|
||||||
>
|
>
|
||||||
<font-awesome-icon v-if="loading" icon="spinner" spin />
|
<template
|
||||||
Sacrifce {{ activeToken.name }}
|
v-if="
|
||||||
|
!walletStore.connected ||
|
||||||
|
sacrificeStore.sacrificeNumber < activeWalletToken?.balanceOf
|
||||||
|
"
|
||||||
|
>
|
||||||
|
+{{ steps.name }}
|
||||||
|
</template>
|
||||||
|
<template v-else> -{{ steps.name }} </template>
|
||||||
</div>
|
</div>
|
||||||
<div
|
</template>
|
||||||
class="btn btn-immortal"
|
<template v-slot:message-end v-if="activeWalletToken?.balanceOf >= 0">
|
||||||
v-else
|
<div class="input-balance tiny-text">
|
||||||
@click="approvalData = tokenStore.approveToken(tokenNumber)"
|
Balance:
|
||||||
>
|
{{ formatNumber(activeWalletToken?.balanceOf, 10n ** activeToken.decimals) }}
|
||||||
<font-awesome-icon v-if="loading" icon="spinner" spin />
|
|
||||||
Approve {{ activeToken.name }}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="input-max tiny-text" @click="addMaxTokens">Max</div>
|
||||||
<div v-else>
|
</template>
|
||||||
<div class="btn btn-immortal" @click="walletStore.connectWallet">Connect</div>
|
</token-input>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="bloodline-devider">
|
||||||
|
<font-awesome-icon :icon="['fas', 'arrow-down']" />
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
:class="{
|
||||||
|
'sacrifice-to-wrapper': true,
|
||||||
|
'bloodline-border': true,
|
||||||
|
'bloodline-border--variant1': true,
|
||||||
|
purple: output && output > 0,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div class="sacrifice-to-body">
|
||||||
|
<token-name-price
|
||||||
|
name="$BLOOD"
|
||||||
|
:price="`≈${formatNumber(output, 10n ** activeToken.decimals)}`"
|
||||||
|
></token-name-price>
|
||||||
|
<token-logo :img="activeToken.vamp.logo" :size="64" :alt="activeToken.vamp.name"></token-logo>
|
||||||
</div>
|
</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>
|
||||||
|
+ {{ formatNumber(stakingOutput, 10n ** activeToken.decimals) }} Staking Bonus
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<font-awesome-icon icon="chevron-down" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<stake-component-v1 :variant="1" v-if="showStakingMenu">
|
||||||
|
<template v-slot:headline> {{ null }}</template>
|
||||||
|
</stake-component-v1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sacrificed-info" v-if="stateComputed === 4">
|
||||||
|
<div class="left low-mid-text">You can claim your $BLOOD when the cycle is finished.</div>
|
||||||
|
<div class="right">
|
||||||
|
<img src="/assets/img/moon.png" alt="moon" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sacrifice-buttons-function-wrapper">
|
||||||
|
<template v-if="walletStore.connected">
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-if="stateComputed === 0">Enter Amount</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal sub-header"
|
||||||
|
disabled
|
||||||
|
v-else-if="sacrificeStore.sacrificeNumber > activeWalletToken?.balanceOf"
|
||||||
|
>
|
||||||
|
Insufficient Balance
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
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
|
||||||
|
class="btn btn-immortal sub-header"
|
||||||
|
v-else-if="
|
||||||
|
(!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, inject } 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 isMobile = inject("isMobile");
|
|
||||||
|
|
||||||
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) => getRewardsFor(e));
|
const activeWalletToken = computed(() => {
|
||||||
|
let returnedObject = {};
|
||||||
async function getRewardsFor(e) {
|
if (activeToken.value.contractAddress) {
|
||||||
if (!e.target.value) {
|
returnedObject = walletStore.token.find((obj) => obj.contractAddress === activeToken.value.contractAddress);
|
||||||
output.value = 0;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
console.log("e.target.value * 18", e.target.value * Math.pow(10, 18));
|
return returnedObject;
|
||||||
const rewardsForResult = await tokenStore.getRewardsFor(
|
});
|
||||||
BigInt(e.target.value * Math.pow(10, activeToken.value.decimals))
|
|
||||||
|
const stateComputed = computed(() => {
|
||||||
|
let returnState = 0;
|
||||||
|
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);
|
||||||
|
console.log("rewardValue", rewardValue);
|
||||||
|
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;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
output.value = rewardsForResult / Math.pow(10, tokenStore.memeToken.decimals);
|
});
|
||||||
|
|
||||||
|
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;
|
||||||
|
showApprovedToast();
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
sacrificeStore.sacrificeState = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addTokens(value) {
|
async function addTokens(value) {
|
||||||
tokenNumber.value = tokenNumber.value + value;
|
if (!walletStore.connected || sacrificeStore.sacrificeNumber < activeWalletToken.value?.balanceOf) {
|
||||||
output.value = await tokenStore.getRewardsFor(parseInt(tokenNumber.value));
|
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,
|
||||||
|
},
|
||||||
|
listeners: {
|
||||||
|
// sacrificed: showSplash,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Render the toast and its contents
|
||||||
|
return toast(content, {
|
||||||
|
position: "top-right",
|
||||||
|
icon: false,
|
||||||
|
timeout: 5000,
|
||||||
|
closeOnClick: false,
|
||||||
|
// toastClassName: "modal-overlay",
|
||||||
|
hideProgressBar: true,
|
||||||
|
toastClassName: "approve-toast toast-card",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSplash() {
|
||||||
|
splashBlood.value++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//call function in the store and remove icon,
|
||||||
|
async function sacrificeToken() {
|
||||||
|
console.log("activeToken.value", activeToken.value);
|
||||||
|
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)
|
||||||
.sacrifice-inner
|
padding: 24px
|
||||||
padding: 48px 24px
|
align-items: center
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 48px 64px
|
||||||
|
.sacrifice-headline
|
||||||
|
text-align: center
|
||||||
|
font-size: 24px
|
||||||
|
margin-bottom: 32px
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
padding: 48px 64px
|
font-size: 32px
|
||||||
.sacrifice-headline
|
.sacrifice-select-tokens
|
||||||
text-align: center
|
display: flex
|
||||||
font-size: 24px
|
margin-bottom: 32px
|
||||||
margin-bottom: 32px
|
width: 100%
|
||||||
@media (min-width: 992px)
|
.sacrifice-tokens
|
||||||
font-size: 36px
|
display: flex
|
||||||
.sacrifice-select-tokens
|
width: 100%
|
||||||
display: flex
|
justify-content: space-between
|
||||||
margin-bottom: 32px
|
flex-wrap: wrap
|
||||||
.sacrifice-tokens
|
gap: 12px
|
||||||
display: flex
|
|
||||||
width: 100%
|
|
||||||
justify-content: space-between
|
|
||||||
@media (min-width: 992px)
|
|
||||||
justify-content: space-evenly
|
|
||||||
|
|
||||||
.sacrifice-token
|
.sacrifice-token
|
||||||
border-radius: 16px
|
|
||||||
padding: 12px
|
|
||||||
cursor: pointer
|
|
||||||
background-color: #0F0F0F
|
|
||||||
text-align: center
|
|
||||||
@media (min-width: 992px)
|
|
||||||
padding: 0
|
|
||||||
background-color: unset
|
|
||||||
&:hover,
|
|
||||||
&:active,
|
|
||||||
&:focus
|
|
||||||
background-color: var(--tertiary-dark)
|
|
||||||
&.sacrifice-token--active
|
|
||||||
background-color: var(--tertiary-dark)
|
|
||||||
.sacrifice-token-name
|
|
||||||
padding: 5px 26px
|
|
||||||
font-size: 16px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
font-size: 24px
|
|
||||||
|
|
||||||
.sacrifice-buttons-function-wrapper
|
|
||||||
text-align: center
|
|
||||||
justify-content: center
|
|
||||||
margin-top: 24px
|
|
||||||
display: block
|
|
||||||
@media (min-width: 992px)
|
|
||||||
display: flex
|
|
||||||
.btn
|
|
||||||
padding: 16px 64px
|
|
||||||
.sacrifice-fees-info-wrapper
|
|
||||||
display: flex
|
|
||||||
border: 2px dashed var(--grey)
|
|
||||||
color: var(--grey)
|
|
||||||
border-radius: 16px
|
border-radius: 16px
|
||||||
padding: 16px 24px
|
padding: 9px
|
||||||
margin-top: 24px
|
cursor: pointer
|
||||||
font-size: 16px
|
background-color: #0F0F0F
|
||||||
.sacrifice-fees-img
|
text-align: center
|
||||||
flex: 0 0 15%
|
user-select: none
|
||||||
.sacrifice-fees-body
|
border: 4px solid transparent
|
||||||
flex: 1 1 auto
|
.sacrifice-token-logo
|
||||||
.sacrifice-fees-body-header
|
pointer-events: none
|
||||||
display: flex
|
@media (min-width: 992px)
|
||||||
flex-direction: row
|
img
|
||||||
justify-content: space-between
|
height: 100px
|
||||||
margin-bottom: 8px
|
width: 100px
|
||||||
@media (min-width: 992px)
|
// padding: 0
|
||||||
font-size: 24px
|
// background-color: unset
|
||||||
margin-bottom: 0
|
&.sacrifice-token--active
|
||||||
|
border-color: var(--purple)
|
||||||
|
|
||||||
|
.sacrifice-token-name
|
||||||
|
@media (min-width: 992px)
|
||||||
|
padding: 5px 26px
|
||||||
|
|
||||||
|
.sacrifice-buttons-function-wrapper
|
||||||
|
text-align: center
|
||||||
|
justify-content: center
|
||||||
|
display: block
|
||||||
|
@media (min-width: 992px)
|
||||||
|
display: flex
|
||||||
|
.btn
|
||||||
|
padding: 12px 48px
|
||||||
|
.sacrifice-fees-info-wrapper
|
||||||
|
display: flex
|
||||||
|
border: 1px dashed var(--grey)
|
||||||
|
color: var(--grey)
|
||||||
|
border-radius: 16px
|
||||||
|
padding: 12px
|
||||||
|
gap: 12px
|
||||||
|
.sacrifice-fees-img
|
||||||
|
img
|
||||||
|
height: 46px
|
||||||
|
.sacrifice-fees-body
|
||||||
|
flex: 1 1 auto
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
justify-content: space-between
|
||||||
|
.sacrifice-fees-body-header
|
||||||
|
display: flex
|
||||||
|
flex-direction: row
|
||||||
|
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
|
||||||
height: 45px
|
|
||||||
font-size: 24px
|
|
||||||
border-radius: 16px
|
|
||||||
padding: 0 16px
|
|
||||||
@media (min-width: 992px)
|
|
||||||
font-size: 32px
|
|
||||||
height: auto
|
|
||||||
.sacrifice-logo
|
.sacrifice-logo
|
||||||
margin-left: 16px
|
margin-left: 16px
|
||||||
img
|
img
|
||||||
width: 45px
|
width: 45px
|
||||||
height: 45px
|
height: 45px
|
||||||
border-radius: 50%
|
border-radius: 50%
|
||||||
|
pointer-events: none
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
height: 83px
|
height: 100%
|
||||||
width: auto
|
width: auto
|
||||||
.sacrifice-to-output
|
.sacrifice-to-output
|
||||||
flex: 1 1 auto
|
flex: 1 1 auto
|
||||||
@@ -260,13 +488,19 @@ async function addTokens(value) {
|
|||||||
.value-adder
|
.value-adder
|
||||||
display: flex
|
display: flex
|
||||||
gap: 6px
|
gap: 6px
|
||||||
|
flex-wrap: wrap
|
||||||
.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)
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
|
// @media (min-width: 992px)
|
||||||
|
// font-size: 12px
|
||||||
// .sacrifice-adder-balance
|
// .sacrifice-adder-balance
|
||||||
// margin-left: auto
|
// margin-left: auto
|
||||||
// .sacrifice-adder-max
|
// .sacrifice-adder-max
|
||||||
@@ -278,4 +512,40 @@ async function addTokens(value) {
|
|||||||
// color: darken(red, 10%)
|
// color: darken(red, 10%)
|
||||||
// transform: scale(1.1)
|
// transform: scale(1.1)
|
||||||
// transition: transform 0s
|
// transition: transform 0s
|
||||||
|
.sacrifice-to-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 18px
|
||||||
|
.sacrifice-to-body
|
||||||
|
display: flex
|
||||||
|
justify-content: space-between
|
||||||
|
.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,378 @@
|
|||||||
|
<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
|
||||||
|
name="$BLOOD staked"
|
||||||
|
:price="formatNumber(walletStore.staked, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
></token-name-price>
|
||||||
|
<token-logo img="/assets/img/token/bloodline.png" :alt="'bloodline-token'"></token-logo>
|
||||||
|
<token-name-price :variant="true" class="stake-reward" name="Bonus" price="+25%"></token-name-price>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
<slot name="actions">
|
||||||
|
<div class="connected-stake-buttons" v-if="!stakeMenu">
|
||||||
|
<template v-if="!walletStore.connected">
|
||||||
|
<div class="mid-mid-text text-center" disabled>Please Connect Your Wallet</div>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="walletStore.connected && !ableToUnstake">
|
||||||
|
<div class="btn btn-immortal mid-mid-text" disabled v-if="cycleStore.currentCycle === 1">
|
||||||
|
Stake
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal mid-mid-text"
|
||||||
|
v-else-if="cycleStore.currentCycle > 1"
|
||||||
|
@click="openStake"
|
||||||
|
>
|
||||||
|
Stake
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="(walletStore.memeToken?.staked === 0n && !stakeonly) || cycleStore.currentCycle === 1"
|
||||||
|
class="btn btn-immortal btn--disabled mid-mid-text"
|
||||||
|
>
|
||||||
|
Unstake
|
||||||
|
</div>
|
||||||
|
<div v-else-if="!stakeonly" class="btn btn-immortal mid-mid-text" @click="openUnstake">
|
||||||
|
Order Unstake
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="walletStore.connected && ableToUnstake">
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal mid-mid-text text-center"
|
||||||
|
v-if="unstakeState === 0 && walletStore.orderedUnstakedAmount > 0n && ableToUnstake"
|
||||||
|
@click="unstake"
|
||||||
|
>
|
||||||
|
Claim Unstaked $BLOOD
|
||||||
|
</div>
|
||||||
|
<div class="btn btn--disabled mid-mid-text text-center" v-else-if="unstakeState === 1">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn--disabled mid-mid-text text-center" v-else-if="unstakeState === 2">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<Transition name="smooth">
|
||||||
|
<stake-menu
|
||||||
|
v-model="tokenNumber"
|
||||||
|
@close="stakeMenu = false"
|
||||||
|
:stake="stake"
|
||||||
|
:amount="walletStore.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(walletStore.balanceOf, 10n ** tokenStore.memeToken.decimals) }}
|
||||||
|
</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 === 1">
|
||||||
|
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-if="walletStore.orderedUnstakedAmount > 0n && !ableToUnstake"
|
||||||
|
>
|
||||||
|
You can claim
|
||||||
|
{{ formatNumber(walletStore.orderedUnstakedAmount, 10n ** tokenStore.memeToken.decimals) }}
|
||||||
|
$BLOOD 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);
|
||||||
|
const unstakeState = 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 unstake() {
|
||||||
|
try {
|
||||||
|
unstakeState.value = 1;
|
||||||
|
const hash = await rewardLockerStore.unstake();
|
||||||
|
unstakeState.value = 2;
|
||||||
|
const data = await waitForTransaction({
|
||||||
|
hash: hash,
|
||||||
|
});
|
||||||
|
var rewardData = data.logs.find((logObject) => {
|
||||||
|
return logObject.topics.find(
|
||||||
|
(topic) => topic === "0xb89343427f692590c388d6346a8e42ea497eb6682a04db1a53f77ea81771ca91"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
|
||||||
|
const outputClaim = formatNumber(BigInt(rewardData.topics[3]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
showSuccessToast(outputClaim, "Success!", "You just unstaked");
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("unstake", error);
|
||||||
|
} finally {
|
||||||
|
unstakeState.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 === "0xf86340d97020c624010a208b733db95795281fbc45cb6e6a40d161f91fa3e4a0"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
console.log("rewardData", rewardData);
|
||||||
|
|
||||||
|
const outputClaim = formatNumber(BigInt(rewardData.topics[3]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
showSuccessToast(outputClaim, "Success!", "You just unstaked", "You can claim your stake next cycle.");
|
||||||
|
stakeMenu.value = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("orderUnstake", error);
|
||||||
|
} finally {
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
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 = formatNumber(BigInt(rewardData.topics[3]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
console.log("data", data);
|
||||||
|
state.value = 0;
|
||||||
|
showSuccessToast(
|
||||||
|
outputClaim,
|
||||||
|
"Success!",
|
||||||
|
"You just staked",
|
||||||
|
"Your next sacrifice will get an extra staking bonus as a reward."
|
||||||
|
);
|
||||||
|
await walletStore.loadWalletData();
|
||||||
|
stakeMenu.value = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error(error);
|
||||||
|
} finally {
|
||||||
|
state.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ableToUnstake = computed(() => {
|
||||||
|
var cycleList = walletStore.memeToken?.orderedUnstakedCycles?.findIndex((obj) => obj.result > 0n);
|
||||||
|
console.log("cycleList", cycleList);
|
||||||
|
if (cycleList && cycleList > -1 && cycleList + 1 <= cycleStore.currentCycle) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
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,141 @@
|
|||||||
|
<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="rewardLockerStore.stakeBloodline(tokenNumber)"
|
||||||
|
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 { formatNumber } from "@/helper/helper.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) {
|
||||||
|
//todo function to calculate correct bigInt value (maybe use string and split)
|
||||||
|
amount = (BigInt(props.amount) * value) / 100n;
|
||||||
|
} else if (props.stake) {
|
||||||
|
amount = (walletStore.memeToken.balanceOf * value) / 100n;
|
||||||
|
} else {
|
||||||
|
amount = (walletStore.memeToken.staked * value) / 100n;
|
||||||
|
}
|
||||||
|
console.log("amount123", amount);
|
||||||
|
amount = amount / 10n ** tokenStore.memeToken.decimals;
|
||||||
|
console.log("amount", amount);
|
||||||
|
emit("update:modelValue", 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,31 +1,147 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="claim bloodline-border">
|
<div class="claim bloodline-border bloodline-border__thin grey">
|
||||||
<div class="rewards-wrapper" v-if="!isMobile">
|
<div class="claim-headline sub-header">Your Cycle Rewards</div>
|
||||||
<rewards-wrapper title="Sacrafice Reward" coin="$BLOOD" amount="0" image="/src/assets/img/vampir.png" />
|
|
||||||
|
<!-- <div class="rewards-wrapper" v-if="!isMobile">
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Sacrafice Reward"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="getCurrentCycleData?.rewards_sacrifice"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
<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>
|
||||||
<rewards-wrapper title="Clan Reward" coin="$BLOOD" amount="0" image="/src/assets/img/vampir.png" />
|
<rewards-wrapper
|
||||||
|
title="Clan Reward"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="getCurrentCycleData?.rewards_clan"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
</div> -->
|
||||||
|
<div class="rewards-list">
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Sacrafice Reward"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsSacrifice, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Staking Bonus"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsStaking, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
image="/assets/img/vampir.png"
|
||||||
|
/>
|
||||||
|
<rewards-wrapper
|
||||||
|
title="Clan Bonus"
|
||||||
|
:subTitle="rewardsClan > 0 ? clanBonusPercentage : null"
|
||||||
|
coin="$BLOOD"
|
||||||
|
:amount="formatNumber(rewardsClan, 10n ** tokenStore.memeToken.decimals)"
|
||||||
|
:image="
|
||||||
|
activeCycle === currentCycle || !cycleStore.getCurrentCycleData?.winner.vamplogo
|
||||||
|
? '/assets/img/token/notoken.png'
|
||||||
|
: cycleStore.getCurrentCycleData?.winner.vamplogo
|
||||||
|
"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="rewards-list" v-else>
|
<div class="rewards-total-wrapper">
|
||||||
<rewards-wrapper
|
<div class="rewards-total-headline sub-header">Total Reward</div>
|
||||||
title="Total Sacrafice Reward"
|
<div
|
||||||
coin="$BLOOD"
|
class="rewards-total-inner bloodline-border bloodline-border--variant1"
|
||||||
amount="0"
|
:class="{ purple: rewardsTotal > 0n && activeCycle !== currentCycle }"
|
||||||
image="/src/assets/img/vampir.png"
|
>
|
||||||
/>
|
<token-name-price
|
||||||
<rewards-wrapper
|
name="$BLOOD"
|
||||||
title="Total Stake Reward"
|
:price="formatNumber(rewardsTotal, 10n ** tokenStore.memeToken.decimals)"
|
||||||
coin="$BLOOD"
|
></token-name-price>
|
||||||
amount="0"
|
<token-logo img="/assets/img/vampir.png" :size="64" :alt="'vampire'"></token-logo>
|
||||||
info="max: 312m"
|
</div>
|
||||||
image="/src/assets/img/vampir.png"
|
|
||||||
/>
|
|
||||||
<rewards-wrapper title="Clan Bonus" coin="$BLOOD" amount="0" image="/src/assets/img/vampir.png" />
|
|
||||||
<rewards-wrapper title="Total Reward" coin="$BLOOD" amount="0" image="/src/assets/img/vampir.png" />
|
|
||||||
</div>
|
</div>
|
||||||
<div class="claim-button">
|
<div class="claim-button">
|
||||||
<div class="btn btn-immortal" @click="claimRewards">Claim</div>
|
<template v-if="!walletStore.connected">
|
||||||
|
<button class="btn btn-immortal sub-header" @click="showPanel = true">Connect</button>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="activeCycle === currentCycle">
|
||||||
|
<template v-if="rewardsSacrifice > 0n">
|
||||||
|
<div class="stake-buttons">
|
||||||
|
<button class="btn btn-immortal sub-header btn--disabled">Claim</button>
|
||||||
|
<button class="btn btn-immortal sub-header btn--disabled">Stake</button>
|
||||||
|
</div>
|
||||||
|
<div>You can claim once the current cycle is finished and the clan bonus calculated</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<button class="btn btn-immortal sub-header" @click="router.push({ name: 'home' })">
|
||||||
|
Sacrifice
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="rewardsTotal > 0">
|
||||||
|
<Transition name="smooth">
|
||||||
|
<div class="stake-buttons" v-show="!stakeMenu">
|
||||||
|
<div class="btn btn-immortal sub-header" v-if="stateClaimedComp === 0" @click="claimRewards">
|
||||||
|
Claim
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-if="stateClaimedComp === 2">
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal sub-header" disabled v-if="stateClaimedComp === 3">
|
||||||
|
<loading-component></loading-component>
|
||||||
|
</div>
|
||||||
|
<div class="btn btn-immortal sub-header" v-if="stateClaimedComp === 0" @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 sub-header stake-button"
|
||||||
|
disabled
|
||||||
|
v-if="stateStakeClaimComp === 0"
|
||||||
|
>
|
||||||
|
Enter Amount
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal sub-header stake-button"
|
||||||
|
v-else-if="stateStakeClaimComp === 1"
|
||||||
|
@click="stakeAndClaim"
|
||||||
|
>
|
||||||
|
Stake & Claim Rest
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal sub-header stake-button"
|
||||||
|
disabled
|
||||||
|
v-if="stateStakeClaimComp === 2"
|
||||||
|
>
|
||||||
|
Sign Transaction
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="btn btn-immortal sub-header 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>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -33,38 +149,226 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import RewardsWrapper from "@/components/RewardsWrapper.vue";
|
import RewardsWrapper from "@/components/RewardsWrapper.vue";
|
||||||
import { inject, ref, onMounted } from "vue";
|
import { inject, ref, onMounted, computed } from "vue";
|
||||||
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
import { useRewardLockerStore } from "@/stores/rewardlocker";
|
||||||
import { useWalletStore } from "@/stores/wallet";
|
import { useWalletStoreV2 } from "@/stores/walletV2";
|
||||||
import { useRoundsStore } from "@/stores/rounds";
|
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, formatBigIntDivision } from "@/helper/helper.js";
|
||||||
|
import { showSuccessToast } from "@/helper/toast.js";
|
||||||
|
|
||||||
const rewards = ref(0);
|
const showPanel = inject("showPanel");
|
||||||
const isMobile = inject("isMobile");
|
|
||||||
const rewardLockerStore = useRewardLockerStore();
|
const rewardLockerStore = useRewardLockerStore();
|
||||||
const walletStore = useWalletStore();
|
const walletStore = useWalletStoreV2();
|
||||||
const roundStore = useRoundsStore();
|
const tokenStore = useTokenStore();
|
||||||
const { address } = storeToRefs(walletStore);
|
|
||||||
const { activeRound, getCurrentRoundData } = storeToRefs(roundStore);
|
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]);
|
||||||
|
const outputStaked = BigInt(stakeData?.topics[3]);
|
||||||
|
showSuccessToast(
|
||||||
|
formatNumber(outputClaim + outputStaked, 10n ** tokenStore.memeToken.decimals),
|
||||||
|
"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 () => {});
|
onMounted(async () => {});
|
||||||
|
|
||||||
function claimRewards() {
|
async function claimRewards() {
|
||||||
//todo
|
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 = formatNumber(BigInt(rewardData.topics[2]), 10n ** tokenStore.memeToken.decimals);
|
||||||
|
showSuccessToast(
|
||||||
|
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 clanBonusPercentage = computed(() => {
|
||||||
|
return (
|
||||||
|
(
|
||||||
|
(formatBigIntDivision(rewardsClan.value, 10n ** tokenStore.memeToken.decimals, 8) /
|
||||||
|
formatBigIntDivision(rewardsTotal.value, 10n ** tokenStore.memeToken.decimals, 8)) *
|
||||||
|
100
|
||||||
|
).toFixed(2) + "%"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
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 ||
|
||||||
|
BigInt(tokenNumber.value) > walletStore.unclaimedRewards / 10n ** tokenStore.memeToken.decimals
|
||||||
|
) {
|
||||||
|
returnState = 0;
|
||||||
|
}
|
||||||
|
return returnState;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.claim
|
.claim
|
||||||
display: flex
|
display: flex
|
||||||
padding: 32px 20px
|
padding: 12px
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
|
gap: 16px
|
||||||
@media (min-width: 992px)
|
@media (min-width: 992px)
|
||||||
padding: 32px 40px
|
padding: 32px 40px
|
||||||
|
.claim-headline
|
||||||
|
text-align: left
|
||||||
.claim-button
|
.claim-button
|
||||||
text-align: center
|
text-align: center
|
||||||
margin-top: 32px
|
display: flex
|
||||||
.rewards-wrapper
|
flex-direction: column
|
||||||
|
gap: 24px
|
||||||
|
.stake-buttons
|
||||||
|
display: flex
|
||||||
|
text-align: center
|
||||||
|
gap: 8px
|
||||||
|
@media (min-width: 992px)
|
||||||
|
gap: 32px
|
||||||
|
// div
|
||||||
|
// flex: 1 1 50%
|
||||||
margin-bottom: 16px
|
margin-bottom: 16px
|
||||||
.rewards-divider
|
.rewards-divider
|
||||||
text-align: center
|
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
|
||||||
|
.rewards-left
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 8px
|
||||||
|
.name
|
||||||
|
font-size: 16px
|
||||||
|
.amount
|
||||||
|
font-size: 24px
|
||||||
|
.rewards-right
|
||||||
|
img
|
||||||
|
height: 49px
|
||||||
|
width: 49px
|
||||||
|
border-radius: 50%
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
<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"
|
||||||
|
pattern="\d*"
|
||||||
|
/>
|
||||||
|
<div class="value-adder">
|
||||||
|
<slot class="value-adder" name="message"></slot>
|
||||||
|
<slot name="message-end"></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right-side">
|
||||||
|
<token-logo v-if="props.logo" :img="props.logo" :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: [BigInt, 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,28 @@
|
|||||||
|
<template>
|
||||||
|
<div class="token-price-wrapper">
|
||||||
|
<div class="token-name tiny-text">{{ props.name }}</div>
|
||||||
|
<div class="token-price" :class="{ 'sub-header-2': !props.variant, 'sub-header': props.variant }">
|
||||||
|
{{ props.price }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const props = defineProps({
|
||||||
|
name: String,
|
||||||
|
price: [Number, String],
|
||||||
|
variant: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
.token-price-wrapper
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
gap: 6px
|
||||||
|
text-align: left
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<template>
|
||||||
|
<div class="approve-card">
|
||||||
|
<div class="left-side low-mid-text">Transaction Successful</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);
|
||||||
|
}
|
||||||
|
</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,86 @@
|
|||||||
|
<template>
|
||||||
|
<div class="network-switch-card">
|
||||||
|
<div>Please switch Network to</div>
|
||||||
|
<div>
|
||||||
|
<b>{{ props.network.chains[0].name }}</b>
|
||||||
|
</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({
|
||||||
|
network: Object,
|
||||||
|
});
|
||||||
|
|
||||||
|
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
|
||||||
|
.network-switch-card
|
||||||
|
display: flex
|
||||||
|
flex-direction: column
|
||||||
|
display: flex
|
||||||
|
</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 };
|
||||||
|
};
|
||||||
@@ -1,18 +1,81 @@
|
|||||||
|
|
||||||
export function getImageUrl(url) {
|
|
||||||
return new URL(url, import.meta.url).href;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getPercentage(amount, goal) {
|
export function getPercentage(amount, goal) {
|
||||||
console.log("amount", amount);
|
return ((Number(amount) / Number(goal)) * 100).toFixed(2);
|
||||||
console.log("goal", goal);
|
}
|
||||||
return ((amount / goal) * 100).toFixed(2);
|
|
||||||
|
export function compactNumber(number) {
|
||||||
|
return Intl.NumberFormat("en-US", {
|
||||||
|
notation: "compact",
|
||||||
|
maximumFractionDigits: 2,
|
||||||
|
}).format(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function compactNumber(number) {
|
export function formatNumber(nominator, denominator) {
|
||||||
return Intl.NumberFormat("en-US", {
|
let number = formatBigIntDivision(nominator, denominator);
|
||||||
notation: "compact",
|
number = InsertCommaNumber(number).toString();
|
||||||
maximumFractionDigits: 2,
|
|
||||||
}).format(parseInt(number));
|
return number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function formatBigIntDivision(nominator, denominator, digits = 2) {
|
||||||
|
console.log("nominator", nominator);
|
||||||
|
console.log("denominator", denominator);
|
||||||
|
if (!nominator) {
|
||||||
|
return 0n
|
||||||
|
}
|
||||||
|
let integer = Number(nominator / denominator);
|
||||||
|
// pick how much digits after point to show
|
||||||
|
const fraction = (nominator % denominator).toString().substring(0, digits);
|
||||||
|
// output type number
|
||||||
|
return Number(integer + "." + fraction);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function InsertCommaNumber(number) {
|
||||||
|
if (!number) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
const formattedWithOptions = number.toLocaleString("en-US");
|
||||||
|
return formattedWithOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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,235 @@ 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, faCaretLeft, faCaretRight, faBars } from "@fortawesome/free-solid-svg-icons";
|
import { faArrowDown, faArrowRight, faSpinner, faPlus, faCaretLeft, faCaretRight, faBars, faAnglesRight, faChevronDown, faChevronUp, faArrowRightToBracket, faArrowRightFromBracket, faDroplet, faMoon, faPerson, faWallet, faBlog } 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";
|
||||||
|
import SwitchNetworkToast from "@/components/toasts/SwitchNetworkToast.vue";
|
||||||
|
import { useToast } from "vue-toastification";
|
||||||
|
|
||||||
/* add icons to the library */
|
/* add icons to the library */
|
||||||
library.add(faArrowDown, faDiscord, faTwitter, faTelegram, faSpinner, faPlus, faCaretLeft, faCaretRight, faBars);
|
library.add(
|
||||||
|
faArrowDown,
|
||||||
|
faArrowRight,
|
||||||
|
faDiscord,
|
||||||
|
faTwitter,
|
||||||
|
faTelegram,
|
||||||
|
faSpinner,
|
||||||
|
faPlus,
|
||||||
|
faCaretLeft,
|
||||||
|
faCaretRight,
|
||||||
|
faBars,
|
||||||
|
faAnglesRight,
|
||||||
|
faArrowRightToBracket,
|
||||||
|
faArrowRightFromBracket,
|
||||||
|
faChevronDown,
|
||||||
|
faChevronUp,
|
||||||
|
faDroplet,
|
||||||
|
faMoon,
|
||||||
|
faPerson,
|
||||||
|
faWallet,
|
||||||
|
faBlog
|
||||||
|
);
|
||||||
|
|
||||||
|
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",
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function showSwitchNetworkToast(network) {
|
||||||
|
const toast = useToast();
|
||||||
|
|
||||||
|
// Define the content object with the component, props and listeners
|
||||||
|
const content = {
|
||||||
|
component: SwitchNetworkToast,
|
||||||
|
// Any prop can be passed, but don't expect them to be reactive
|
||||||
|
props: {
|
||||||
|
network
|
||||||
|
},
|
||||||
|
// 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
|
||||||
|
return toast(content, {
|
||||||
|
position: "top-right",
|
||||||
|
icon: false,
|
||||||
|
closeOnClick: false,
|
||||||
|
// toastClassName: "modal-overlay",
|
||||||
|
hideProgressBar: true,
|
||||||
|
timeout: false,
|
||||||
|
toastClassName: "approve-toast toast-card",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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],
|
||||||
|
[goerli],
|
||||||
|
[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();
|
||||||
|
await cycleStore.fillCycle(cycleStore.currentCycle, true);
|
||||||
|
await uniswapStore.init();
|
||||||
|
} else {
|
||||||
|
walletStore.address = null;
|
||||||
|
walletStore.connected = false;
|
||||||
|
walletStore.walletClient = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
watchNetwork((network) => {
|
||||||
|
if (!network.chain?.network) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const chainAllowed = network.chains?.find((obj) => {
|
||||||
|
return obj.network === network.chain.network;
|
||||||
|
});
|
||||||
|
if (!chainAllowed) {
|
||||||
|
console.log("chain not allowed", network.chain);
|
||||||
|
showSwitchNetworkToast(network);
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
console.log("chain allowed", network.chain);
|
||||||
|
}
|
||||||
|
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,230 @@
|
|||||||
|
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;
|
||||||
|
},
|
||||||
|
rewardsSacrificeCurrentCycle() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.currentCycle]?.rewards_sacrifice) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.currentCycle]?.rewards_sacrifice;
|
||||||
|
},
|
||||||
|
rewardsStaking() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_staking) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_staking;
|
||||||
|
|
||||||
|
},
|
||||||
|
rewardsClan() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_clan) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_clan;
|
||||||
|
},
|
||||||
|
rewardsTotal() {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
if (!this.cycles[this.activeCycle]?.rewards_total) {
|
||||||
|
return 0n;
|
||||||
|
}
|
||||||
|
return this.cycles[this.activeCycle]?.rewards_total;
|
||||||
|
|
||||||
|
},
|
||||||
|
},
|
||||||
|
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();
|
||||||
|
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];
|
||||||
|
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) {
|
||||||
|
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();
|
||||||
|
for (let index = 1; index <= Number(lastCompletedCycle); index++) {
|
||||||
|
array.push(index);
|
||||||
|
}
|
||||||
|
console.log("array123", array);
|
||||||
|
return array;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,36 +1,118 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import MemeBurnerJson from "@/assets/contracts/MemeBurner.json";
|
import MemeAltarJson from "@/assets/contracts/MemeAltar.json";
|
||||||
import { useTokenStore } from "./tokens";
|
import { useTokenStore } from "./tokens";
|
||||||
import { useMultiCallStore } from "./multicall";
|
import { useWalletStoreV2 } from "./walletV2";
|
||||||
|
import { useCycleStore } from "@/stores/cycles";
|
||||||
|
|
||||||
|
import { multicall, getContract, fetchToken, waitForTransaction, getWalletClient } from "@wagmi/core";
|
||||||
|
|
||||||
|
|
||||||
export const useMemeburnerStore = defineStore("memeburner", {
|
export const useMemeburnerStore = defineStore("memeburner", {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
config: MemeBurnerJson,
|
config: MemeAltarJson,
|
||||||
contract: null,
|
contract: null,
|
||||||
|
loading: false,
|
||||||
}),
|
}),
|
||||||
getters: {},
|
getters: {},
|
||||||
actions: {
|
actions: {
|
||||||
async getCurrentRound() {
|
async init() {
|
||||||
return await this.contract.methods.currentRound().call();
|
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 getGoal (roundnumber) {
|
async getRewardFor(amount) {
|
||||||
return await this.contract.methods.rounds(roundnumber).call();
|
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
|
//returns participated, amount achieved
|
||||||
async getSacrificedMeme(roundnumber, tokenAddress) {
|
async getSacrificedMeme(cycleNumber, tokenAddress) {
|
||||||
return await this.contract.methods.getSacrificedMeme(roundnumber, tokenAddress).call();
|
return await this.contract.read.getSacrificedMeme([cycleNumber, tokenAddress]);
|
||||||
},
|
},
|
||||||
async getSacrificedRound(roundnumber) {
|
async getAmountToReachGoal(tokenAddress) {
|
||||||
console.log("getSacrificedRound", roundnumber);
|
return await this.contract.read.getAmountToReachGoal([tokenAddress]);
|
||||||
const tokenStore = useTokenStore();
|
},
|
||||||
const calls = [];
|
async getSacrificedCycle(cycleNumber) {
|
||||||
for (let index = 0; index < tokenStore.token.length; index++) {
|
console.log("getSacrificedCycle", cycleNumber);
|
||||||
const token = tokenStore.token[index];
|
const tokenStore = useTokenStore();
|
||||||
calls.push(this.contract.methods.getSacrificedMeme(roundnumber, token.contractAddress));
|
const contracts = [];
|
||||||
}
|
for (let index = 0; index < tokenStore.sacrificeToken.length; index++) {
|
||||||
const multicallStore = useMultiCallStore();
|
const token = tokenStore.sacrificeToken[index];
|
||||||
return await multicallStore.aggregate(calls);
|
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();
|
||||||
|
|
||||||
|
var hash = await this.contract.write.sacrificeMemeAndBuyBLOOD([
|
||||||
|
tokenStore.activeToken.contractAddress,
|
||||||
|
amount,
|
||||||
|
minBLOOD,
|
||||||
|
]);
|
||||||
|
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]);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||