Files
ImmortalClanVue/src/stores/tokens.js
T
2023-07-27 15:34:07 +02:00

174 lines
5.6 KiB
JavaScript

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();
}
},
});