import { defineStore } from "pinia"; import { markRaw } from "vue"; import Web3 from "web3"; import { useWalletStore } from "./wallet"; import { useWalletStoreV2 } from "./walletV2"; import { useContractStore } from "./contracts"; import { ethers } from "ethers"; import { useMemeburnerStore } from "./memeburner"; import Meme1Json from "@/assets/contracts/Meme1.json"; import Meme2Json from "@/assets/contracts/Meme2.json"; import MemeToken from "@/assets/contracts/MemeToken.json"; import MemeBurnerJson from "@/assets/contracts/MemeBurner.json"; import { multicall, getContract, fetchToken } from "@wagmi/core"; export const useTokenStore = defineStore("token", { state: () => ({ token: [ { name: "$PEPE", logo: "/assets/img/token/pepe.png", logoMobile: "/assets/img/token/pepeMobile.png", vamp: { logo: "/assets/img/token/pepevamp.png", name: "$PEPE Vamp Token", }, backgroundColor: "#4b8501", abi: Meme1Json.abi, contractAddress: Meme1Json.contractAddress, ethcontract: null, }, { name: "$SHIB", logo: "/assets/img/token/shib.png", logoMobile: "/assets/img/token/shibMobile.png", vamp: { logo: "/assets/img/token/shibvamp.png", name: "$SHIBA Vamp Token", }, abi: Meme2Json.abi, contractAddress: Meme2Json.contractAddress, }, // { // name: "$ELON", // logo: "/assets/img/token/elon.png", // logoMobile: "/assets/img/token/elonMobile.png", // vamp: { // logo: "/assets/img/token/shibvamp.png", // name: "$ELON Vamp Token", // }, // abi: null, // contractAddress: null, // }, ], activeToken: { address: null, abi: null, balance: null, contract: null, allowance: null, }, loading: false, memeToken: { config: { abi: MemeToken.abi, contractAddress: MemeToken.contractAddress, }, }, }), getters: {}, actions: { async initV2() { console.log("-----------init token-------------"); const contracts = []; const walletStore = useWalletStoreV2(); for (let index = 0; index < this.token.length; index++) { const token = this.token[index]; token.contract = getContract({ address: token.contractAddress, abi: token.abi, WalletClient: walletStore.walletClient || walletStore.publicClient, }); contracts.push({...token.contract, functionName: "decimals"}) } //MemeToken init this.memeToken.contract = getContract({ address: this.memeToken.config.contractAddress, abi: this.memeToken.config.abi, PublicClient: walletStore.publicClient, WalletClient: walletStore.walletClient, }); contracts.push({ ...this.memeToken.contract, functionName: "decimals" }); const data = await multicall({ contracts, }); //multicall decimal for (let index = 0; index < this.token.length; index++) { const token = this.token[index]; token.decimals = data[index].result } this.memeToken.decimals = data[this.token.length].result; }, async changeActiveToken(token) { console.log("changeActiveToken"); this.activeToken = token; // const web3 = new Web3(window.ethereum); // this.contract = new web3.eth.Contract(token.abi, token.contractAddress); const walletStore = useWalletStoreV2(); if (walletStore.connected) { //TODO, wenn connected, dann all diese Daten laden? this.activeToken.balance = await walletStore.getTokenBalance(token); this.activeToken.allowance = await this.allowance(); } }, async allowance() { console.log("allowance"); const walletStore = useWalletStoreV2(); const memeBurnerStore = useMemeburnerStore(); // var allowance = await this.contract.methods // .allowance(walletStore.address, memeBurnerStore.config.contractAddress) // .call(); console.log("this.activeToken.contract", this.activeToken.contract); var allowance = await this.activeToken.contract.read.allowance([ walletStore.address, memeBurnerStore.config.contractAddress, ]); // var decimals = await this.contract.methods.decimals().call(); // console.log("decimals", decimals); const decimals = this.activeToken.decimals; allowance = BigInt(allowance / BigInt(Math.pow(10, decimals))); console.log("allowance", allowance); return allowance; }, async approveToken(amount) { try { this.loading = true; const walletStore = useWalletStore(); const memeBurnerStore = useMemeburnerStore(); var approve = await this.contract.methods .approve(memeBurnerStore.config.contractAddress, amount) .send({ from: walletStore.address}); //todo parameter value übergeben in eth web3.utils.toHex(web3.utils.toWei(amount, 'ether')) // .send({ from: walletStore.address, value: 0.5 }); this.activeToken.allowance = await this.allowance(); return approve; } catch (error) { console.error(error); } finally { this.loading = false; } }, getTokenContract(token) { console.log("token", token); const contractAddress = token.contractAddress; const activeToken = this.token.find((obj) => obj.contractAddress === contractAddress); const web3 = new Web3(window.ethereum); const contract = new web3.eth.Contract(activeToken.abi, contractAddress); return contract; }, async nonces(userAddress) { return this.memeToken.contract.methods.nonces(userAddress).call(); } }, });