merged pull request

This commit is contained in:
EmberSpirit
2023-10-17 18:17:18 +02:00
4 changed files with 73 additions and 52 deletions
+1 -1
View File
@@ -120,7 +120,7 @@ function badgeClick(token) {
if (tokenStore.memeToken.contractAddress === token.contractAddress) { if (tokenStore.memeToken.contractAddress === token.contractAddress) {
//buy //buy
window.open( window.open(
"https://app.uniswap.org/swap?inputCurrency=ETH&outputCurrency=0x00E5DAd5dA0FC4Da0baB7f0D99E28C07d8A88ee4&chain=goerli", `https://app.uniswap.org/swap?inputCurrency=ETH&outputCurrency=${token.contractAddress}&chain=goerli`,
"_blank" "_blank"
); );
} else { } else {
+11 -7
View File
@@ -49,7 +49,7 @@ export const useMemeburnerStore = defineStore("memeburner", {
return await this.contract.read.getSacrificedMeme([cycleNumber, tokenAddress]); return await this.contract.read.getSacrificedMeme([cycleNumber, tokenAddress]);
}, },
async getAmountToReachGoal(tokenAddress) { async getAmountToReachGoal(tokenAddress) {
return await this.contract.read.getAmountToReachGoal([tokenAddress, 0]); return await this.contract.read.getAmountToReachGoal([tokenAddress]);
}, },
async getSacrificedCycle(cycleNumber) { async getSacrificedCycle(cycleNumber) {
console.log("getSacrificedCycle", cycleNumber); console.log("getSacrificedCycle", cycleNumber);
@@ -71,7 +71,7 @@ export const useMemeburnerStore = defineStore("memeburner", {
}); });
return data; return data;
}, },
async sacrificeMeme(amount) { async sacrificeMeme(amount, minETH) {
const tokenStore = useTokenStore(); const tokenStore = useTokenStore();
try { try {
if (!amount || amount == 0) { if (!amount || amount == 0) {
@@ -80,10 +80,13 @@ export const useMemeburnerStore = defineStore("memeburner", {
return; return;
} }
this.loading = true; this.loading = true;
// TODO: store all integer values as one type: BigInt
const amountDecimal = BigInt(amount) * 10n ** BigInt(tokenStore.activeToken.decimals);
var hash = await this.contract.write.sacrificeMeme([ var hash = await this.contract.write.sacrificeMeme([
tokenStore.activeToken.contractAddress, tokenStore.activeToken.contractAddress,
amount, amountDecimal.toString(),
0, minETH.toString()
]); ]);
return hash; return hash;
} catch (error) { } catch (error) {
@@ -93,13 +96,14 @@ export const useMemeburnerStore = defineStore("memeburner", {
this.loading = false; this.loading = false;
} }
}, },
async sacrificeMemeAndBuyBLOOD(amount) { async sacrificeMemeAndBuyBLOOD(amount, minBLOOD) {
const tokenStore = useTokenStore(); const tokenStore = useTokenStore();
const amountDecimal = BigInt(amount) * 10n ** BigInt(tokenStore.activeToken.decimals);
var hash = await this.contract.write.sacrificeMemeAndBuyBLOOD([ var hash = await this.contract.write.sacrificeMemeAndBuyBLOOD([
tokenStore.activeToken.contractAddress, tokenStore.activeToken.contractAddress,
amount, amountDecimal.toString(),
0, minBLOOD.toString()
]); ]);
return hash; return hash;
}, },
+38 -28
View File
@@ -34,11 +34,11 @@ export const useSacrificeStore = defineStore("sacrifice", {
let hash = null; let hash = null;
if (getRewards.variant === "sacrifice") { if (getRewards.variant === "sacrifice") {
console.log("sacrifice"); console.log("sacrifice");
hash = await memeburnerStore.sacrificeMeme(amount); hash = await memeburnerStore.sacrificeMeme(amount, getRewards.minETH);
console.log("hash", hash); console.log("hash", hash);
} else { } else {
console.log("buy"); console.log("buy");
hash = await memeburnerStore.sacrificeMemeAndBuyBLOOD(amount); hash = await memeburnerStore.sacrificeMemeAndBuyBLOOD(amount, getRewards.minBLOOD);
console.log("hash", hash); console.log("hash", hash);
} }
@@ -92,34 +92,41 @@ export const useSacrificeStore = defineStore("sacrifice", {
const uniswapStore = useUniswapStore(); const uniswapStore = useUniswapStore();
const walletStore = useWalletStoreV2(); const walletStore = useWalletStoreV2();
const rewardLockerStore = useRewardLockerStore(); const rewardLockerStore = useRewardLockerStore();
// what is value here? i thought amount and value are same
const amountDecimal = BigInt(value) * 10n ** BigInt(token.decimals == undefined ? 18n : token.decimals);
let output = 0; let output = 0;
const amountETHBase = await memeburnerStore.getAmountETHBase(amountDecimal);
// take 99.5% of amount ETH got for selling meme, 0.5% allowed slippage
const minETH = amountETHBase[1] * 995n / 1000n;
let minBLOOD;
try { try {
if (!value) { if (!value || isNaN(value)) {
this.sacrificeState = 0; this.sacrificeState = 0;
return output; return output;
} }
const rewardsForResult = await memeburnerStore.getRewardFor(value);
console.log("rewardsForResult", rewardsForResult); const rewardsForResult = await memeburnerStore.getRewardFor(amountDecimal);
const rewardsForResultNumber = rewardsForResult.reduce((x, y) => { const rewardsForResultSum = rewardsForResult[0] + rewardsForResult[1];
return x + y // quote blood amount against ETH base amount
}, 0n); var quoteRewards = await uniswapStore.quoteExactInputSingle(amountDecimal, amountETHBase[0]);
var quoteRewards = await uniswapStore.quoteExactInputSingle(value);
let variant = "sacrifice"; let variant = "sacrifice";
if (quoteRewards.result) { if (quoteRewards.result) {
const quoteRewardsNumber = quoteRewards.amount; // take 99.5% of quoted amount, 0.5% allowed slippage
if ((quoteRewardsNumber * 995n) / 1000n > rewardsForResultNumber) { minBLOOD = quoteRewards.amount * 995n / 1000n;
if (quoteRewards.amount * 95n / 100n > rewardsForResultSum) {
variant = "buy"; variant = "buy";
console.log("use Buy-function", { console.log("use Buy-function", {
quoteRewardsNumber: quoteRewardsNumber, quoteRewardsNumber: quoteRewards.amount,
rewardsForResultNumber, rewardsForResultSum,
}); });
} else { } else {
console.log("use sacrifice-function", { console.log("use sacrifice-function", {
quoteRewardsNumber: quoteRewardsNumber, quoteRewardsNumber: quoteRewards.amount,
rewardsForResultNumber, rewardsForResultSum,
}); });
} }
} else { } else {
@@ -128,22 +135,27 @@ export const useSacrificeStore = defineStore("sacrifice", {
* quoter threw an error * quoter threw an error
*/ */
// //
output = rewardsForResultNumber; output = rewardsForResultSum;
} }
console.log("variant", variant); console.log("variant", variant);
console.log("amountDecimal", amountDecimal);
// TODO: when token.allowance become BigInt with decimals, value must be amountDecimal
if (!walletStore.connected || (walletStore.connected && token.allowance < value)) { if (!walletStore.connected || (walletStore.connected && token.allowance < value)) {
/** /**
* case 1 * case 1
* user is not logged in or Allowance is less than Input, then I show getRewardsForSacrifice Value * user is not logged in or Allowance is less than Input, then I show getRewardsForSacrifice Value
* variante not relevant * variante not relevant
*/ */
output = rewardsForResultNumber; output = rewardsForResultSum;
if (variant === "buy") {
output = quoteRewards.amount
}
} else if (walletStore.connected && variant === "sacrifice") { } else if (walletStore.connected && variant === "sacrifice") {
/** /**
* case 2 * case 2
* user is logged in and allowance is greater or equal input and variant is sacrifice * user is logged in and allowance is greater or equal input and variant is sacrifice
*/ */
output = rewardsForResultNumber; output = rewardsForResultSum;
} else if (walletStore.connected && variant === "buy") { } else if (walletStore.connected && variant === "buy") {
/** /**
* case 3 * case 3
@@ -154,7 +166,7 @@ export const useSacrificeStore = defineStore("sacrifice", {
address: memeburnerStore.contract.address, address: memeburnerStore.contract.address,
abi: memeburnerStore.contract.abi, abi: memeburnerStore.contract.abi,
functionName: "sacrificeMeme", functionName: "sacrificeMeme",
args: [token.contractAddress, amountDecimal.toString(), 0], args: [token.contractAddress, amountDecimal.toString(), minETH.toString()],
account: walletStore.address, account: walletStore.address,
}); });
@@ -162,19 +174,17 @@ export const useSacrificeStore = defineStore("sacrifice", {
address: memeburnerStore.contract.address, address: memeburnerStore.contract.address,
abi: memeburnerStore.contract.abi, abi: memeburnerStore.contract.abi,
functionName: "sacrificeMemeAndBuyBLOOD", functionName: "sacrificeMemeAndBuyBLOOD",
args: [token.contractAddress, amountDecimal.toString(), 0], args: [token.contractAddress, amountDecimal.toString(), minBLOOD.toString()],
account: walletStore.address, account: walletStore.address,
}); });
const amountBuyNumber = amountBuy
const amountSacrificeNumber = amountSacrifice
if (amountBuyNumber * 0.995 > amountSacrificeNumber) { if (amountBuy * 95n / 100n > amountSacrifice) {
variant = "buy"; variant = "buy";
output = amountBuyNumber; output = amountBuy;
console.log("use buy after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme"); console.log("use buy after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme");
} else { } else {
variant = "sacrifice"; variant = "sacrifice";
output = amountSacrificeNumber; output = amountSacrifice;
console.log("use sacrifice after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme"); console.log("use sacrifice after comparison sacrificeMemeAndBuyBLOOD and sacrificeMeme");
} }
} }
@@ -188,7 +198,7 @@ export const useSacrificeStore = defineStore("sacrifice", {
stakingRewardsNumber = stakingReward / 10n ** token.decimals stakingRewardsNumber = stakingReward / 10n ** token.decimals
} }
const outputNumber = output / 10n ** BigInt(token.decimals); const outputNumber = output / 10n ** BigInt(token.decimals);
return { output: outputNumber, variant: variant, staking: stakingRewardsNumber }; return { output: outputNumber, variant: variant, minETH: minETH, minBLOOD: minBLOOD, staking: stakingRewardsNumber };
} catch (error) { } catch (error) {
console.error("getRewardsFor", error); console.error("getRewardsFor", error);
} }
+16 -9
View File
@@ -2,7 +2,9 @@ import { defineStore } from "pinia";
import { useWalletStoreV2 } from "@/stores/walletV2"; import { useWalletStoreV2 } from "@/stores/walletV2";
import QuoterJson from "@/assets/contracts/Quoter.json"; import QuoterJson from "@/assets/contracts/Quoter.json";
import UniswapPoolJson from "@/assets/contracts/UniswapPool.json"; import UniswapPoolJson from "@/assets/contracts/UniswapPool.json";
import BloodlineJson from "@/assets/contracts/Bloodline.json";
import { useMemeburnerStore } from "@/stores/memeburner"; import { useMemeburnerStore } from "@/stores/memeburner";
import { useTokenStore } from "@/stores/tokens";
import { getContract, multicall } from "@wagmi/core"; import { getContract, multicall } from "@wagmi/core";
@@ -38,29 +40,34 @@ export const useUniswapStore = defineStore("uniswap", {
this.getPoolData(); this.getPoolData();
}, },
async quoteExactInputSingle(amount) { async quoteExactInputSingle(amount, ethBase) {
try { try {
console.log("quoteExactInputSingle"); console.log("quoteExactInputSingle");
const memeBurnerStore = useMemeburnerStore(); const memeBurnerStore = useMemeburnerStore();
var amountEthBase = await memeBurnerStore.getAmountETHBase(amount); const tokenStore = useTokenStore();
console.log("amountEthBase", amountEthBase);
const tokenOut = tokenStore.memeToken.contractAddress;
// tokenIn - WETH
const tokenIn = BigInt(this.poolData.token0) == BigInt(tokenOut) ? this.poolData.token1 : this.poolData.token0;
console.log("quoteExactInputSingle-parameter", { console.log("quoteExactInputSingle-parameter", {
token0: this.poolData.token0, tokenIn: tokenIn, // WETH
token1: this.poolData.token1, tokenOut: tokenOut, // BLOOD
fee: this.poolData.fee, fee: this.poolData.fee,
amountEthBase: amountEthBase[0], amountEthBase: ethBase,
pricelimit: 0, //sqrtPriceLimitX96 pricelimit: 0, //sqrtPriceLimitX96
}); });
const quotedAmountOut = await this.quoateV3Contract.read.quoteExactInputSingle([ const quotedAmountOut = await this.quoateV3Contract.read.quoteExactInputSingle([
this.poolData.token0, //bloodline tokenIn, //weth
this.poolData.token1, //weth tokenOut, //bloodline
this.poolData.fee, this.poolData.fee,
amountEthBase[0], ethBase,
0, //sqrtPriceLimitX96 0, //sqrtPriceLimitX96
]); ]);
console.log("quotedAmountOut", quotedAmountOut); console.log("quotedAmountOut", quotedAmountOut);
return {result: true, amount: quotedAmountOut}; return {result: true, amount: quotedAmountOut};
} catch (error) { } catch (error) {
return { result: false, amount: null }; return { result: false, amount: null };
} }
}, },