sacrifice: refactoring.

This commit is contained in:
butterscotch
2023-10-16 22:05:00 +03:00
parent 320cbb5c63
commit fe44a619d4
+41 -33
View File
@@ -13,7 +13,7 @@ import { formatNumber } from "@/helper/helper.js";
export const useSacrificeStore = defineStore("sacrifice", { export const useSacrificeStore = defineStore("sacrifice", {
state: () => ({ state: () => ({
sacrificeNumber: null, sacrificeNumber: 0n,
sacrificeState: 0, sacrificeState: 0,
}), }),
getters: {}, getters: {},
@@ -33,11 +33,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);
} }
@@ -89,34 +89,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 || isNaN(value)) { if (!value || isNaN(value)) {
this.sacrificeState = 0; this.sacrificeState = 0;
return output; return output;
} }
const rewardsForResult = await memeburnerStore.getRewardFor(
BigInt(value * Math.pow(10, token.decimals)) const rewardsForResult = await memeburnerStore.getRewardFor(amountDecimal);
); const rewardsForResultSum = rewardsForResult[0] + rewardsForResult[1];
const rewardsForResultNumber = rewardsForResult.reduce((x, y) => { // quote blood amount against ETH base amount
return x + Number(y) / Math.pow(10, token.decimals); var quoteRewards = await uniswapStore.quoteExactInputSingle(amountDecimal, amountETHBase[0]);
}, 0);
var quoteRewards = await uniswapStore.quoteExactInputSingle(value * Math.pow(10, token.decimals));
let variant = "sacrifice"; let variant = "sacrifice";
if (quoteRewards.result) { if (quoteRewards.result) {
const quoteRewardsNumber = Number(quoteRewards.amount) / Math.pow(10, token.decimals); // take 99.5% of quoted amount, 0.5% allowed slippage
if (quoteRewardsNumber * 0.995 > 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 {
@@ -125,24 +132,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);
const amountDecimal = BigInt(value * Math.pow(10, token.decimals));
console.log("amountDecimal", amountDecimal); 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
@@ -153,7 +163,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,
}); });
@@ -161,32 +171,30 @@ 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 = Number(amountBuy) / Math.pow(10, token.decimals);
const amountSacrificeNumber = Number(amountSacrifice) / Math.pow(10, token.decimals);
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");
} }
} }
//potential staking rewards //potential staking rewards
let stakingRewardsNumber = 0; let stakingRewardsNumber = 0;
if (output > 0) { if (output > 0n && walletStore.connected) {
const stakingReward = await rewardLockerStore.getStakeRewardForSacrificeReward( const stakingReward = await rewardLockerStore.getStakeRewardForSacrificeReward(
token.contractAddress, token.contractAddress,
output * Math.pow(10, token.decimals) output
); );
stakingRewardsNumber = (Number(stakingReward) / Math.pow(10, token.decimals)).toFixed(2); stakingRewardsNumber = (Number(stakingReward / 10n ** BigInt(token.decimals))).toFixed(2);
} }
return { output: output, variant: variant, staking: stakingRewardsNumber }; return { output: output, variant: variant, minETH: minETH, minBLOOD: minBLOOD, staking: stakingRewardsNumber };
} catch (error) { } catch (error) {
console.error("getRewardsFor", error); console.error("getRewardsFor", error);
} }