From 45a023bc4f46d6cbeccdb340aee696309e861f08 Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Mon, 20 Nov 2023 14:21:41 +0100 Subject: [PATCH 1/4] Add Ayin Dex --- projects/ayin/index.js | 47 +++++++++++++++++++++++++++++++ projects/helper/chain/alephium.js | 35 +++++++++++++++++++++++ projects/helper/chains.json | 1 + 3 files changed, 83 insertions(+) create mode 100644 projects/ayin/index.js create mode 100644 projects/helper/chain/alephium.js diff --git a/projects/ayin/index.js b/projects/ayin/index.js new file mode 100644 index 00000000000..b716e5c169c --- /dev/null +++ b/projects/ayin/index.js @@ -0,0 +1,47 @@ +const alephium = require('../helper/chain/alephium') + +const Addresses = { + alphAyinPool: '25ywM8iGxKpZWuGA5z6DXKGcZCXtPBmnbQyJEsjvjjWTy', + alphUsdtPool: '2A5R8KZQ3rhKYrW7bAS4JTjY9FCFLJg6HjQpqSFZBqACX', + alphWethPool: 'yXMFxdoKcE86W9NAyajc8Z3T3k2f5FGiHqHtuA69DYT1', + ayinUsdtPool: '21NEBCk8nj5JBKpS7eN8kX6xGJoLHNqTS3WBFnZ7q8L9m', + usdt: 'zSRgc7goAYUgYsEBYdAzogyyeKv3ne3uvWb3VDtxnaEK', + weth: 'vP6XSUyjmgWCB2B9tD5Rqun56WJqDdExWnfwZVEqzhQb', + ayin: 'vT49PY8ksoUL6NcXiZ1t2wAmC7tTPRfFfER8n3UCLvXy' +} + +const TokenIds = { + usdt: alephium.contractIdFromAddress(Addresses.usdt), + weth: alephium.contractIdFromAddress(Addresses.weth), + ayin: alephium.contractIdFromAddress(Addresses.ayin) +} + +async function tvl() { + const alphTvls = await Promise.all([ + Addresses.alphAyinPool, Addresses.alphUsdtPool, Addresses.alphWethPool + ].map(poolAddress => alephium.getAlphBalance(poolAddress))) + const alphTvl = alphTvls.reduce((tvl, res) => tvl + Number(res.balance), 0) + const tokensTvls = await Promise.all([ + Addresses.alphAyinPool, Addresses.alphUsdtPool, Addresses.alphWethPool, Addresses.ayinUsdtPool + ].map(poolAddress => alephium.getTokensBalance(poolAddress))) + const tokensTvl = tokensTvls.reduce((res, tokenTvls) => { + tokenTvls.forEach(tokenTvl => { + if (res[tokenTvl.tokenId] !== undefined) { + res[tokenTvl.tokenId] = Number(res[tokenTvl.tokenId]) + Number(tokenTvl.balance) + } + }); + return res + }, {[TokenIds.ayin]: 0, [TokenIds.usdt]: 0, [TokenIds.weth]: 0}) + return { + alephium: alphTvl / 1e18, + ayin: tokensTvl[TokenIds.ayin] / 1e18, + weth: tokensTvl[TokenIds.weth] / 1e18, + tether: tokensTvl[TokenIds.usdt] / 1e6 + } +} + +module.exports = { + timetravel: false, + methodology: 'TVL locked in the Ayin pools on Alephium', + alephium: { tvl } +} diff --git a/projects/helper/chain/alephium.js b/projects/helper/chain/alephium.js new file mode 100644 index 00000000000..c3ad1940dfb --- /dev/null +++ b/projects/helper/chain/alephium.js @@ -0,0 +1,35 @@ +const axios = require("axios") +const basex = require('base-x') + +const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' +const bs58 = basex(ALPHABET) + +const API_HOST = 'https://backend-v115.mainnet.alephium.org' + +async function getAlphBalance(address) { + return (await axios.get(`${API_HOST}/addresses/${address}/balance`)).data +} + +async function getTokensBalance(address) { + return (await axios.get(`${API_HOST}/addresses/${address}/tokens-balance`)).data +} + +function contractIdFromAddress(address) { + const decoded = bs58.decode(address) + + if (decoded.length == 0) throw new Error('Address string is empty') + const addressType = decoded[0] + const addressBody = decoded.slice(1) + + if (addressType == 0x03) { + return Buffer.from(addressBody).toString('hex') + } else { + throw new Error(`Invalid contract address type: ${addressType}`) + } +} + +module.exports = { + getAlphBalance, + getTokensBalance, + contractIdFromAddress +} diff --git a/projects/helper/chains.json b/projects/helper/chains.json index 7cf96821f18..f67551c6852 100644 --- a/projects/helper/chains.json +++ b/projects/helper/chains.json @@ -1,5 +1,6 @@ [ "acala", + "alephium", "algorand", "alephium", "alv", From 4ce55b3c85bbd756cb21600e677a846f0d641903 Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Tue, 21 Nov 2023 20:00:55 +0100 Subject: [PATCH 2/4] Count xAyin --- projects/ayin/index.js | 16 +++++++++++++++- projects/helper/chain/alephium.js | 22 ++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/projects/ayin/index.js b/projects/ayin/index.js index b716e5c169c..439f592c008 100644 --- a/projects/ayin/index.js +++ b/projects/ayin/index.js @@ -10,12 +10,25 @@ const Addresses = { ayin: 'vT49PY8ksoUL6NcXiZ1t2wAmC7tTPRfFfER8n3UCLvXy' } +const XAyinAddress = 'zst5zMzizEeFYFis6DNSknY5GCYTpM85D3yXeRLe2ug3' + const TokenIds = { usdt: alephium.contractIdFromAddress(Addresses.usdt), weth: alephium.contractIdFromAddress(Addresses.weth), ayin: alephium.contractIdFromAddress(Addresses.ayin) } +async function ayinTvlForXAyin() { + const results = await alephium.contractMultiCall([ + { group: 0, address: XAyinAddress, methodIndex: 3 }, + { group: 0, address: XAyinAddress, methodIndex: 11} + ]) + + const totalSupply = results[0].returns[0].value + const currentPrice = results[1].returns[0].value + return (Number(totalSupply) / 1e18) * (Number(currentPrice) / 1e18) +} + async function tvl() { const alphTvls = await Promise.all([ Addresses.alphAyinPool, Addresses.alphUsdtPool, Addresses.alphWethPool @@ -32,9 +45,10 @@ async function tvl() { }); return res }, {[TokenIds.ayin]: 0, [TokenIds.usdt]: 0, [TokenIds.weth]: 0}) + const xAyinTvl = await ayinTvlForXAyin() return { alephium: alphTvl / 1e18, - ayin: tokensTvl[TokenIds.ayin] / 1e18, + ayin: tokensTvl[TokenIds.ayin] / 1e18 + xAyinTvl, weth: tokensTvl[TokenIds.weth] / 1e18, tether: tokensTvl[TokenIds.usdt] / 1e6 } diff --git a/projects/helper/chain/alephium.js b/projects/helper/chain/alephium.js index c3ad1940dfb..da792d36a7c 100644 --- a/projects/helper/chain/alephium.js +++ b/projects/helper/chain/alephium.js @@ -4,14 +4,27 @@ const basex = require('base-x') const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' const bs58 = basex(ALPHABET) -const API_HOST = 'https://backend-v115.mainnet.alephium.org' +const EXPLORER_API_HOST = 'https://backend-v115.mainnet.alephium.org' +const NODE_API_HOST = '' async function getAlphBalance(address) { - return (await axios.get(`${API_HOST}/addresses/${address}/balance`)).data + return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/balance`)).data } async function getTokensBalance(address) { - return (await axios.get(`${API_HOST}/addresses/${address}/tokens-balance`)).data + return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/tokens-balance`)).data +} + +async function contractMultiCall(payload) { + const result = (await axios.post(`${NODE_API_HOST}/contracts/multicall-contract`, {calls: payload})).data + return result.results.map((r) => tryGetCallResult(r)) +} + +function tryGetCallResult(result) { + if (result.type === 'CallContractFailed') { + throw new Error(`Failed to call contract, error: ${result.error}`) + } + return result } function contractIdFromAddress(address) { @@ -31,5 +44,6 @@ function contractIdFromAddress(address) { module.exports = { getAlphBalance, getTokensBalance, - contractIdFromAddress + contractIdFromAddress, + contractMultiCall } From e6ddb64f77cd1a0db1d7294e97c3013b0ee86889 Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Wed, 22 Nov 2023 08:26:09 +0100 Subject: [PATCH 3/4] Update node api host --- projects/helper/chain/alephium.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/helper/chain/alephium.js b/projects/helper/chain/alephium.js index da792d36a7c..1c6defca2e5 100644 --- a/projects/helper/chain/alephium.js +++ b/projects/helper/chain/alephium.js @@ -5,7 +5,7 @@ const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' const bs58 = basex(ALPHABET) const EXPLORER_API_HOST = 'https://backend-v115.mainnet.alephium.org' -const NODE_API_HOST = '' +const NODE_API_HOST = 'https://chadnode.ayin.app' async function getAlphBalance(address) { return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/balance`)).data From def83534d7bdfece93cec0e9f1c24bbf5974c89f Mon Sep 17 00:00:00 2001 From: h0ngcha0 Date: Wed, 22 Nov 2023 08:45:38 +0100 Subject: [PATCH 4/4] Remove duplicated alephium chain --- projects/helper/chains.json | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/helper/chains.json b/projects/helper/chains.json index f67551c6852..7cf96821f18 100644 --- a/projects/helper/chains.json +++ b/projects/helper/chains.json @@ -1,6 +1,5 @@ [ "acala", - "alephium", "algorand", "alephium", "alv",