-->
-
+
diff --git a/src/main.js b/src/main.js
index 5da2566..f8a5019 100644
--- a/src/main.js
+++ b/src/main.js
@@ -91,6 +91,7 @@ app.use(pinia);
app.use(Toast, {
transition: "Vue-Toastification__fade",
+ containerClassName: "bloodline-toast-container",
});
@@ -164,9 +165,9 @@ try {
},
async (log) => {
console.log("CycleCompleted", log);
- await cycleStore.fillCycle(cycleStore.currentCycle);
+ await cycleStore.fillCycle(cycleStore.currentCycle, true);
cycleStore.currentCycle++;
- await cycleStore.fillCycle(cycleStore.currentCycle);
+ await cycleStore.fillCycle(cycleStore.currentCycle, true);
}
);
diff --git a/src/stores/cycles.js b/src/stores/cycles.js
index 66d2614..1d700ea 100644
--- a/src/stores/cycles.js
+++ b/src/stores/cycles.js
@@ -12,9 +12,9 @@ export const useCycleStore = defineStore("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
+ 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) {
@@ -30,9 +30,37 @@ export const useCycleStore = defineStore("cycles", {
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 / 10n ** tokenStore.memeToken.decimals;
+ },
+ rewardsStaking() {
+ const tokenStore = useTokenStore();
+ if (!this.cycles[this.activeCycle]?.rewards_staking) {
+ return 0n;
+ }
+ return this.cycles[this.activeCycle]?.rewards_staking / 10n ** tokenStore.memeToken.decimals;
+ },
+ rewardsClan() {
+ const tokenStore = useTokenStore();
+ if (!this.cycles[this.activeCycle]?.rewards_clan) {
+ return 0n;
+ }
+ return this.cycles[this.activeCycle]?.rewards_clan / 10n ** tokenStore.memeToken.decimals;
+ },
+ rewardsTotal() {
+ const tokenStore = useTokenStore();
+ if (!this.cycles[this.activeCycle]?.rewards_total) {
+ return 0n;
+ }
+ return this.cycles[this.activeCycle]?.rewards_total / 10n ** tokenStore.memeToken.decimals;
+ },
},
actions: {
- //todo check if still needed
+ //todo check if still needed
// async loadRewardsCycles() {
// const walletStore = useWalletStoreV2();
// const rewardLockerStore = useRewardLockerStore();
@@ -56,29 +84,27 @@ export const useCycleStore = defineStore("cycles", {
// const element = data[index];
// if (!this.cycles[index]) {
// this.cycles[index] = {};
- // }
+ // }
// }
// },
- //todo check if needed, or use fillcycle
- async updateCurrentCycle(sacrificedToken) {
- console.log("updateCurrentCycle");
+ //todo check if needed, or use fillcycle
+ async updateCurrentCycle(sacrificedToken) {
+ console.log("updateCurrentCycle");
const memeBurnerStore = useMemeburnerStore();
- var data = await memeBurnerStore.getSacrificedCycle(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(
+ var data = await memeBurnerStore.getSacrificedCycle(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];
- }
-
- },
- /**
- * 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
- */
+ this.cycles[this.currentCycle].token[tokenIndex].amount = data[tokenIndex].result[1];
+ }
+ },
+ /**
+ * 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();
@@ -97,22 +123,22 @@ export const useCycleStore = defineStore("cycles", {
rewardData = await rewardLockerStore.getRewardsForAllToken(cycleNumber);
}
- console.log("hier");
+ console.log("hier");
//getTotalSacrificeRewardsForToken multicall for all tokens
const tokenTotalSacrificed = await rewardLockerStore.getTotalSacrificeRewardsForAllToken(cycleNumber);
- console.log("hier1");
+ console.log("hier1");
var goal = await memeBurnerStore.getGoal(cycleNumber);
- console.log("hier123");
+ console.log("hier123");
var tokenArray = [];
var rewards_clan = 0n;
var rewards_sacrifice = 0n;
var rewards_staking = 0n;
-
- console.log("hier123");
+
+ console.log("hier123");
for (let index = 0; index < data.length; index++) {
var tokenData = {};
- const token = tokenStore.token[index];
- //why no multicall? todo
+ const token = tokenStore.token[index];
+ //why no multicall? todo
var coefficent = await rewardLockerStore.getSacrificedTokenCoefficient(
cycleNumber,
token.contractAddress
@@ -124,11 +150,11 @@ export const useCycleStore = defineStore("cycles", {
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
+ 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
+ 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) {
@@ -137,18 +163,16 @@ export const useCycleStore = defineStore("cycles", {
}
const sacrificeRewards = sacrificeClanReward;
- tokenData.rewards_ges =
- rewardData[index].result[1] +
- rewardData[index].result[0]
+ tokenData.rewards_ges = rewardData[index].result[1] + rewardData[index].result[0];
- tokenData.rewards_clan = clanwin
+ tokenData.rewards_clan = clanwin;
- tokenData.rewards_staking = rewardData[index].result[0]
- tokenData.rewards_sacrifice = sacrificeRewards
+ 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);
+ 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;
@@ -156,10 +180,10 @@ export const useCycleStore = defineStore("cycles", {
tokenArray.push(tokenData);
}
- const goalDecimal = goal[0]
+ 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)
+ 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;
}
@@ -183,10 +207,10 @@ export const useCycleStore = defineStore("cycles", {
async getFinshedCycleNumbers() {
const array = [];
const rewardLockerStore = useRewardLockerStore();
- const lastCompletedCycle = await rewardLockerStore.lastCompletedCycle();
+ const lastCompletedCycle = await rewardLockerStore.lastCompletedCycle();
for (let index = 0; index <= Number(lastCompletedCycle); index++) {
array.push(index);
- }
+ }
return array;
},
},
diff --git a/src/stores/memeburner.js b/src/stores/memeburner.js
index 59a27e9..ff16d4f 100644
--- a/src/stores/memeburner.js
+++ b/src/stores/memeburner.js
@@ -81,12 +81,10 @@ export const useMemeburnerStore = defineStore("memeburner", {
}
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([
tokenStore.activeToken.contractAddress,
- amountDecimal.toString(),
- minETH.toString()
+ amount,
+ minETH
]);
return hash;
} catch (error) {
diff --git a/src/stores/rewardlocker.js b/src/stores/rewardlocker.js
index 5f9aa34..2ff36cf 100644
--- a/src/stores/rewardlocker.js
+++ b/src/stores/rewardlocker.js
@@ -160,9 +160,6 @@ export const useRewardLockerStore = defineStore("rewardlocker", {
const tokenStore = useTokenStore();
const addresses = tokenStore.sacrificeToken.map((obj) => obj.contractAddress);
const hash = await this.contract.write.stakeAndClaim([stakeCoefficient, [cycle], addresses]);
- const data = await waitForTransaction({
- hash: hash,
- });
return hash;
},
async stakeAndClaimAllCycles(stakeCoefficient) {
diff --git a/src/stores/sacrifice.js b/src/stores/sacrifice.js
index 0647f85..cdb694a 100644
--- a/src/stores/sacrifice.js
+++ b/src/stores/sacrifice.js
@@ -28,8 +28,10 @@ export const useSacrificeStore = defineStore("sacrifice", {
try {
- this.sacrificeState = 2;
+ this.sacrificeState = 2;
+ console.log("hier");
const getRewards = await this.getRewardsFor(amount, token);
+ console.log("hier1");
console.log("getRewards", getRewards);
let hash = null;
if (getRewards.variant === "sacrifice") {
@@ -86,31 +88,30 @@ export const useSacrificeStore = defineStore("sacrifice", {
this.sacrificeState = 0;
}
},
- async getRewardsFor(value, token) {
- console.log("getRewardsFor", {value, token});
+ async getRewardsFor(amount, token) {
+ console.log("getRewardsFor", {amount, token});
const memeburnerStore = useMemeburnerStore();
const uniswapStore = useUniswapStore();
const walletStore = useWalletStoreV2();
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;
- 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 {
- if (!value || isNaN(value)) {
+ try {
+
+ if (!amount) {
this.sacrificeState = 0;
return output;
- }
+ }
+ const amountETHBase = await memeburnerStore.getAmountETHBase(amount);
+ // take 99.5% of amount ETH got for selling meme, 0.5% allowed slippage
+ const minETH = (amountETHBase[1] * 995n) / 1000n;
- const rewardsForResult = await memeburnerStore.getRewardFor(amountDecimal);
+ const rewardsForResult = await memeburnerStore.getRewardFor(amount);
const rewardsForResultSum = rewardsForResult[0] + rewardsForResult[1];
// quote blood amount against ETH base amount
- var quoteRewards = await uniswapStore.quoteExactInputSingle(amountDecimal, amountETHBase[0]);
+ var quoteRewards = await uniswapStore.quoteExactInputSingle(amount, amountETHBase[0]);
let variant = "sacrifice";
if (quoteRewards.result) {
@@ -138,9 +139,8 @@ export const useSacrificeStore = defineStore("sacrifice", {
output = rewardsForResultSum;
}
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)) {
+ console.log("amount", amount);
+ if (!walletStore.connected || (walletStore.connected && token.allowance < amount)) {
/**
* case 1
* user is not logged in or Allowance is less than Input, then I show getRewardsForSacrifice Value
@@ -166,7 +166,7 @@ export const useSacrificeStore = defineStore("sacrifice", {
address: memeburnerStore.contract.address,
abi: memeburnerStore.contract.abi,
functionName: "sacrificeMeme",
- args: [token.contractAddress, amountDecimal.toString(), minETH.toString()],
+ args: [token.contractAddress, amount.toString(), minETH.toString()],
account: walletStore.address,
});
@@ -174,7 +174,7 @@ export const useSacrificeStore = defineStore("sacrifice", {
address: memeburnerStore.contract.address,
abi: memeburnerStore.contract.abi,
functionName: "sacrificeMemeAndBuyBLOOD",
- args: [token.contractAddress, amountDecimal.toString(), minBLOOD.toString()],
+ args: [token.contractAddress, amount.toString(), minBLOOD.toString()],
account: walletStore.address,
});
diff --git a/src/stores/tokens.js b/src/stores/tokens.js
index d4e13c5..7db7fc7 100644
--- a/src/stores/tokens.js
+++ b/src/stores/tokens.js
@@ -121,7 +121,8 @@ export const useTokenStore = defineStore("token", {
// abi: Meme5Json.abi,
// contractAddress: Meme5Json.contractAddress,
// },
- {
+ {
+ name: "$BLOOD",
abi: BloodlineJson.abi,
contractAddress: BloodlineJson.contractAddress,
logo: "/assets/img/token/bloodline.png",
@@ -161,16 +162,16 @@ export const useTokenStore = defineStore("token", {
});
contracts.push({ ...token.contract, functionName: "decimals" });
- contracts.push({ ...token.contract, functionName: "name" });
+ // contracts.push({ ...token.contract, functionName: "name" });
contracts.push({ ...token.contract, functionName: "symbol" });
contracts.push({ ...token.contract, functionName: "totalSupply" });
const data = await multicall({
contracts,
});
token.decimals = BigInt(data[0].result);
- token.name = data[1].result;
- token.symbol = data[2].result;
- token.totalSupply = data[3].result;
+ // token.name = data[1].result;
+ token.symbol = data[1].result;
+ token.totalSupply = data[2].result;
}
} catch (error) {
console.error("initV2", error);
diff --git a/src/stores/walletV2.js b/src/stores/walletV2.js
index fbc37f3..c816af7 100644
--- a/src/stores/walletV2.js
+++ b/src/stores/walletV2.js
@@ -38,35 +38,43 @@ export const useWalletStoreV2 = defineStore("walletV2", {
walletClient: null,
config: null,
chain: null,
- token: [],
+ token: [],
}),
getters: {
- sacrificeToken: (state) => state.token.filter((obj) => {
- const tokenStore = useTokenStore();
-
- return obj.contractAddress !== tokenStore.memeToken.contractAddress;
- }),
- memeToken: (state) => state.token.find((obj) => {
- const tokenStore = useTokenStore();
-
- return obj.contractAddress === tokenStore.memeToken.contractAddress;
- }),
+ sacrificeToken: (state) =>
+ state.token.filter((obj) => {
+ const tokenStore = useTokenStore();
+
+ return obj.contractAddress !== tokenStore.memeToken.contractAddress;
+ }),
+ memeToken: (state) =>
+ state.token.find((obj) => {
+ const tokenStore = useTokenStore();
+
+ return obj.contractAddress === tokenStore.memeToken.contractAddress;
+ }),
+ unclaimedRewards() {
+ const tokenStore = useTokenStore();
+ if (!this.memeToken?.unclaimedRewards) {
+ return 0n;
+ }
+ return this.memeToken.unclaimedRewards / 10n ** tokenStore.memeToken.decimals;
+ },
},
actions: {
async init() {
console.log("wallet init");
-
- const account = getAccount();
- if (account.address) {
- this.address = account.address;
- this.connected = true;
- }
-
+ const account = getAccount();
+
+ if (account.address) {
+ this.address = account.address;
+ this.connected = true;
+ }
},
async connectWallet(connector) {
try {
- console.log("connector.name", connector.name);
+ console.log("connector.name", connector.name);
// if (!account.isConnected) {
const connection = await connect({
chainId: goerli.id,
@@ -74,12 +82,12 @@ export const useWalletStoreV2 = defineStore("walletV2", {
});
console.log("connection", connection);
- } catch (error) {
- if (error.message.includes("Connector not found")) {
+ } catch (error) {
+ if (error.message.includes("Connector not found")) {
console.warn("Connector not found");
}
- console.error(error);
- }
+ console.error(error);
+ }
// this.address = connection.account;
},
async getTokenBalance(token) {
@@ -87,8 +95,8 @@ export const useWalletStoreV2 = defineStore("walletV2", {
return result;
},
async getTokenBalances() {
- console.log("getTokenBalances");
- this.token = []
+ console.log("getTokenBalances");
+ this.token = [];
const tokenStore = useTokenStore();
var contracts = [];
for (let index = 0; index < tokenStore.token.length; index++) {
@@ -100,29 +108,28 @@ export const useWalletStoreV2 = defineStore("walletV2", {
contracts,
});
for (let index = 0; index < tokenStore.token.length; index++) {
- const token = tokenStore.token[index];
+ const token = tokenStore.token[index];
this.token.push({
contractAddress: token.contractAddress,
- balanceOf: data[index].result
+ balanceOf: data[index].result,
});
}
- },
- async loadWalletData() {
- if (!this.connected) {
- return
- }
- console.log("loadWalletData");
+ },
+ async loadWalletData() {
+ if (!this.connected) {
+ return;
+ }
+ console.log("loadWalletData");
const rewardlockerStore = useRewardLockerStore();
-
- await this.getTokenBalances();
- //MemeToken Staked
- const tokenStore = useTokenStore();
- this.memeToken.staked = await rewardlockerStore.getStaked(this.address);
- const unclaimedRewardsArray = await rewardlockerStore.getTotalRewards(this.address);
- const unclaimedRewards = unclaimedRewardsArray[0] + unclaimedRewardsArray[1];
- this.memeToken.unclaimedRewards = unclaimedRewards
- }
+ await this.getTokenBalances();
+ //MemeToken Staked
+ const tokenStore = useTokenStore();
+ this.memeToken.staked = await rewardlockerStore.getStaked(this.address);
+ const unclaimedRewardsArray = await rewardlockerStore.getTotalRewards(this.address);
+ const unclaimedRewards = unclaimedRewardsArray[0] + unclaimedRewardsArray[1];
+ this.memeToken.unclaimedRewards = unclaimedRewards;
+ },
},
// persist: true,
});
diff --git a/src/views/CycleView.vue b/src/views/CycleView.vue
index 938c2a5..c47cc05 100644
--- a/src/views/CycleView.vue
+++ b/src/views/CycleView.vue
@@ -79,7 +79,12 @@
Get up to +25% Clan Bonus on your sacrifice.
-
+
+
+
+
+
+
@@ -98,6 +103,9 @@ import LoadingComponent from "@/components/LoadingComponent.vue";
import { useCycleStore } from "@/stores/cycles";
import { useRewardLockerStore } from "@/stores/rewardlocker";
+import { Vue3Lottie } from "vue3-lottie";
+import ChartLoading from "@/assets/lottie/ChartLoading.json";
+
const cycleStore = useCycleStore();
const tokenStore = useTokenStore();
diff --git a/yarn.lock b/yarn.lock
index 161d4a0..a458108 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2415,6 +2415,11 @@
dependencies:
"p-locate" "^5.0.0"
+"lodash-es@^4.17.21":
+ "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
+ "version" "4.17.21"
+
"lodash.isequal@4.5.0":
"integrity" "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
"resolved" "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
@@ -2437,6 +2442,11 @@
dependencies:
"js-tokens" "^3.0.0 || ^4.0.0"
+"lottie-web@5.12.2":
+ "integrity" "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg=="
+ "resolved" "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz"
+ "version" "5.12.2"
+
"lru-cache@^6.0.0":
"integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="
"resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
@@ -3288,7 +3298,7 @@
"resolved" "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz"
"version" "2.0.0-rc.5"
-"vue@^2.6.14 || ^3.3.0", "vue@^3.0.0-0 || ^2.6.0", "vue@^3.0.2", "vue@^3.2.0", "vue@^3.2.25", "vue@^3.3.2", "vue@>= 3.0.0 < 4", "vue@3.3.4":
+"vue@^2.6.14 || ^3.3.0", "vue@^3.0.0-0 || ^2.6.0", "vue@^3.0.2", "vue@^3.2", "vue@^3.2.0", "vue@^3.2.25", "vue@^3.3.2", "vue@>= 3.0.0 < 4", "vue@3.3.4":
"integrity" "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw=="
"resolved" "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz"
"version" "3.3.4"
@@ -3299,6 +3309,14 @@
"@vue/server-renderer" "3.3.4"
"@vue/shared" "3.3.4"
+"vue3-lottie@^3.2.0":
+ "integrity" "sha512-PtNXbv7iD4XGmK8CXd71aLWmILIR6P6VzLMDw6ZzmDAeuJZuJ0MdOVnn50LOARgq+cOFJsn/2z+7tZh0F9T9qw=="
+ "resolved" "https://registry.npmjs.org/vue3-lottie/-/vue3-lottie-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "lodash-es" "^4.17.21"
+ "lottie-web" "5.12.2"
+
"web3-eth-abi@^1.2.1":
"integrity" "sha512-hk5NyeGweJYTjes7lBW7gtG7iYoN6HLt6E4FQDrHPdwZjwNmvzaOH9N8zMTCxNFXUlg0bzeTOzWwMA717a+4eg=="
"resolved" "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.1.tgz"