From c9ed6a9cafdeeca8b3c9dbe33b48b8096eb443fe Mon Sep 17 00:00:00 2001 From: alan Date: Fri, 31 Oct 2025 13:08:25 +0700 Subject: [PATCH 01/11] Add DipCoin Perp TVL Adapter for SUI --- projects/dipcoin-perp/index.js | 29 +++++++++++++++++++++++++++++ projects/dipcoin/index.js | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 projects/dipcoin-perp/index.js diff --git a/projects/dipcoin-perp/index.js b/projects/dipcoin-perp/index.js new file mode 100644 index 00000000000..b77354a0ba2 --- /dev/null +++ b/projects/dipcoin-perp/index.js @@ -0,0 +1,29 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const BigNumber = require("bignumber.js") +const { getConfig } = require('../helper/cache'); + +async function suiTvl(api) { + const symbols = (await getConfig('dipcoin-perp/symbols', 'https://gray-api.dipcoin.io/api/perp-market-api/list'))?.data?.map(i => i.symbol) + if (!Array.isArray(symbols) || symbols.length === 0) return; + const volumes = await Promise.all(symbols.map(async (symbol) => { + const ticker = await getConfig(`dipcoin-perp/symbol-volume-${symbol}`, `https://gray-api.dipcoin.io/api/perp-market-api/ticker?symbol=${symbol}`); + const volumeValue = ticker?.data?.volume24h || 0; + + return BigNumber(volumeValue); + })); + const sum = volumes.reduce((acc, volume) => acc.plus(volume), BigNumber(0)).div(1e12).toFixed(0); + + api.add(ADDRESSES.sui.USDC, sum); +} + +module.exports = { + sui: { + tvl: suiTvl + }, + hallmarks: [ + ['2025-10-15', "Launched the Perpetual Mainnet (v1.0)."], + ['2025-10-16', "Listed perpetual contracts for BTC, ETH, and SUI."], + ['2025-10-29', "Upgraded to Mainnet v1.1, introducing Take Profit/Stop Loss and margin management features."], + ['2025-10-31', "Listed perpetual contracts for SOL, BNB, and XRP."], + ], +} diff --git a/projects/dipcoin/index.js b/projects/dipcoin/index.js index cc39b1b0b27..b74b70fe839 100644 --- a/projects/dipcoin/index.js +++ b/projects/dipcoin/index.js @@ -14,7 +14,7 @@ async function suiTvl(api) { module.exports = { hallmarks: [ - [1747699200, "Spot Launch"], + ['2025-05-20', "Spot Launch"], ], sui: { tvl: suiTvl From f5870d83120d5335d6c8383c5d848738891f8cff Mon Sep 17 00:00:00 2001 From: alan Date: Mon, 3 Nov 2025 18:18:19 +0800 Subject: [PATCH 02/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perp/index.js | 29 --------------------- projects/dipcoin-perps/index.js | 21 +++++++++++++++ projects/{dipcoin => dipcoin-spot}/index.js | 4 +-- 3 files changed, 23 insertions(+), 31 deletions(-) delete mode 100644 projects/dipcoin-perp/index.js create mode 100644 projects/dipcoin-perps/index.js rename projects/{dipcoin => dipcoin-spot}/index.js (69%) diff --git a/projects/dipcoin-perp/index.js b/projects/dipcoin-perp/index.js deleted file mode 100644 index b77354a0ba2..00000000000 --- a/projects/dipcoin-perp/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const BigNumber = require("bignumber.js") -const { getConfig } = require('../helper/cache'); - -async function suiTvl(api) { - const symbols = (await getConfig('dipcoin-perp/symbols', 'https://gray-api.dipcoin.io/api/perp-market-api/list'))?.data?.map(i => i.symbol) - if (!Array.isArray(symbols) || symbols.length === 0) return; - const volumes = await Promise.all(symbols.map(async (symbol) => { - const ticker = await getConfig(`dipcoin-perp/symbol-volume-${symbol}`, `https://gray-api.dipcoin.io/api/perp-market-api/ticker?symbol=${symbol}`); - const volumeValue = ticker?.data?.volume24h || 0; - - return BigNumber(volumeValue); - })); - const sum = volumes.reduce((acc, volume) => acc.plus(volume), BigNumber(0)).div(1e12).toFixed(0); - - api.add(ADDRESSES.sui.USDC, sum); -} - -module.exports = { - sui: { - tvl: suiTvl - }, - hallmarks: [ - ['2025-10-15', "Launched the Perpetual Mainnet (v1.0)."], - ['2025-10-16', "Listed perpetual contracts for BTC, ETH, and SUI."], - ['2025-10-29', "Upgraded to Mainnet v1.1, introducing Take Profit/Stop Loss and margin management features."], - ['2025-10-31', "Listed perpetual contracts for SOL, BNB, and XRP."], - ], -} diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js new file mode 100644 index 00000000000..9cbeb260f49 --- /dev/null +++ b/projects/dipcoin-perps/index.js @@ -0,0 +1,21 @@ +const sui = require("../helper/chain/sui"); +const { getConfig } = require('../helper/cache'); + +async function suiTvl(api) { + const tvl = (await getConfig('dipcoin/perps-tvl', 'https://api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; + api.add(ADDRESSES.sui.USDC, tvl/1e12); +} + + +module.exports = { + hallmarks: [ + ['2025-10-15', "Launched the Perpetual Mainnet (v1.0)."], + ['2025-10-16', "Listed perpetual contracts for BTC, ETH, and SUI."], + ['2025-10-29', "Upgraded to Mainnet v1.1, introducing Take Profit/Stop Loss and margin management features."], + ['2025-10-31', "Listed perpetual contracts for SOL, BNB, and XRP."], + ], + sui: { + tvl: suiTvl + }, +} + diff --git a/projects/dipcoin/index.js b/projects/dipcoin-spot/index.js similarity index 69% rename from projects/dipcoin/index.js rename to projects/dipcoin-spot/index.js index b74b70fe839..b97dd5e8079 100644 --- a/projects/dipcoin/index.js +++ b/projects/dipcoin-spot/index.js @@ -2,7 +2,7 @@ const sui = require("../helper/chain/sui"); const { getConfig } = require('../helper/cache'); async function suiTvl(api) { - const pools = (await getConfig('dipcoin/amm-sui', 'https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress) + const pools = (await getConfig('dipcoin/spot-tvl', 'https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress); const res = await sui.getObjects(pools) res.forEach((i) => { const [coinA, coinB] = i.type.split('<')[1].split('>')[0].split(', ') @@ -14,7 +14,7 @@ async function suiTvl(api) { module.exports = { hallmarks: [ - ['2025-05-20', "Spot Launch"], + ['2025-05-20', "Launched the Spot Mainnet (v1.0)."], ], sui: { tvl: suiTvl From 0fae357684c1480e2698d77428ef0700bcc32e50 Mon Sep 17 00:00:00 2001 From: alan Date: Mon, 3 Nov 2025 18:38:17 +0800 Subject: [PATCH 03/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perps/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js index 9cbeb260f49..5f95258d8aa 100644 --- a/projects/dipcoin-perps/index.js +++ b/projects/dipcoin-perps/index.js @@ -1,5 +1,6 @@ const sui = require("../helper/chain/sui"); const { getConfig } = require('../helper/cache'); +const ADDRESSES = require('../helper/coreAssets.json'); async function suiTvl(api) { const tvl = (await getConfig('dipcoin/perps-tvl', 'https://api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; From a0573cd4165ed51bb01887177b5df879dcf5d637 Mon Sep 17 00:00:00 2001 From: alan Date: Mon, 3 Nov 2025 18:57:57 +0800 Subject: [PATCH 04/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perps/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js index 5f95258d8aa..91e6183974d 100644 --- a/projects/dipcoin-perps/index.js +++ b/projects/dipcoin-perps/index.js @@ -3,7 +3,7 @@ const { getConfig } = require('../helper/cache'); const ADDRESSES = require('../helper/coreAssets.json'); async function suiTvl(api) { - const tvl = (await getConfig('dipcoin/perps-tvl', 'https://api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; + const tvl = (await getConfig('dipcoin/perps-tvl', 'https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; api.add(ADDRESSES.sui.USDC, tvl/1e12); } From 2c3db8f8e9c7d1771af9474e8624257efc330df8 Mon Sep 17 00:00:00 2001 From: alan Date: Mon, 3 Nov 2025 23:46:03 +0800 Subject: [PATCH 05/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perps/index.js | 5 ++--- projects/dipcoin-spot/index.js | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js index 91e6183974d..3d64ec946df 100644 --- a/projects/dipcoin-perps/index.js +++ b/projects/dipcoin-perps/index.js @@ -1,9 +1,8 @@ -const sui = require("../helper/chain/sui"); -const { getConfig } = require('../helper/cache'); +const { get } = require("../helper/http"); const ADDRESSES = require('../helper/coreAssets.json'); async function suiTvl(api) { - const tvl = (await getConfig('dipcoin/perps-tvl', 'https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; + const tvl = (await get('https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; api.add(ADDRESSES.sui.USDC, tvl/1e12); } diff --git a/projects/dipcoin-spot/index.js b/projects/dipcoin-spot/index.js index b97dd5e8079..d336832298f 100644 --- a/projects/dipcoin-spot/index.js +++ b/projects/dipcoin-spot/index.js @@ -1,8 +1,8 @@ const sui = require("../helper/chain/sui"); -const { getConfig } = require('../helper/cache'); +const { get } = require("../helper/http"); async function suiTvl(api) { - const pools = (await getConfig('dipcoin/spot-tvl', 'https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress); + const pools = (await get('https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress); const res = await sui.getObjects(pools) res.forEach((i) => { const [coinA, coinB] = i.type.split('<')[1].split('>')[0].split(', ') From b37489796afcc0919943c3f66e4bee9d8dfbd593 Mon Sep 17 00:00:00 2001 From: alan Date: Wed, 5 Nov 2025 04:55:14 +0800 Subject: [PATCH 06/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perps/index.js | 3 ++- projects/dipcoin-spot/index.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js index 3d64ec946df..49f4f90704e 100644 --- a/projects/dipcoin-perps/index.js +++ b/projects/dipcoin-perps/index.js @@ -1,8 +1,9 @@ const { get } = require("../helper/http"); +const { getConfig } = require('../helper/cache'); const ADDRESSES = require('../helper/coreAssets.json'); async function suiTvl(api) { - const tvl = (await get('https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; + const tvl = (await getConfig('dipcoin/perps-sui', 'https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; api.add(ADDRESSES.sui.USDC, tvl/1e12); } diff --git a/projects/dipcoin-spot/index.js b/projects/dipcoin-spot/index.js index d336832298f..edfe86ba2f8 100644 --- a/projects/dipcoin-spot/index.js +++ b/projects/dipcoin-spot/index.js @@ -1,8 +1,9 @@ const sui = require("../helper/chain/sui"); +const { getConfig } = require('../helper/cache'); const { get } = require("../helper/http"); async function suiTvl(api) { - const pools = (await get('https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress); + const pools = (await getConfig('dipcoin/amm-sui', 'https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress) const res = await sui.getObjects(pools) res.forEach((i) => { const [coinA, coinB] = i.type.split('<')[1].split('>')[0].split(', ') From babf2da10659f815835d8a63dc480b36d76a962a Mon Sep 17 00:00:00 2001 From: alan Date: Wed, 5 Nov 2025 04:57:23 +0800 Subject: [PATCH 07/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-spot/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/dipcoin-spot/index.js b/projects/dipcoin-spot/index.js index edfe86ba2f8..e10997d7384 100644 --- a/projects/dipcoin-spot/index.js +++ b/projects/dipcoin-spot/index.js @@ -1,6 +1,5 @@ const sui = require("../helper/chain/sui"); const { getConfig } = require('../helper/cache'); -const { get } = require("../helper/http"); async function suiTvl(api) { const pools = (await getConfig('dipcoin/amm-sui', 'https://api.dipcoin.io/api/pools'))?.data?.map(i => i.poolAddress) From ec72056ed57ea6b0c9695a1b67d2327408719d6d Mon Sep 17 00:00:00 2001 From: alan Date: Wed, 5 Nov 2025 05:02:34 +0800 Subject: [PATCH 08/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/{dipcoin-spot => dipcoin}/index.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename projects/{dipcoin-spot => dipcoin}/index.js (100%) diff --git a/projects/dipcoin-spot/index.js b/projects/dipcoin/index.js similarity index 100% rename from projects/dipcoin-spot/index.js rename to projects/dipcoin/index.js From 4fdf3065fd06cbe36edd812a6d8f6bc717aa6114 Mon Sep 17 00:00:00 2001 From: alan Date: Wed, 5 Nov 2025 05:06:55 +0800 Subject: [PATCH 09/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/{dipcoin => dipcoin-spot}/index.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename projects/{dipcoin => dipcoin-spot}/index.js (100%) diff --git a/projects/dipcoin/index.js b/projects/dipcoin-spot/index.js similarity index 100% rename from projects/dipcoin/index.js rename to projects/dipcoin-spot/index.js From 2d8701d00657b7c465bfbdb0a6e843bd1e5ece95 Mon Sep 17 00:00:00 2001 From: alan Date: Wed, 5 Nov 2025 05:18:41 +0800 Subject: [PATCH 10/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/{dipcoin-spot => dipcoin}/index.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename projects/{dipcoin-spot => dipcoin}/index.js (100%) diff --git a/projects/dipcoin-spot/index.js b/projects/dipcoin/index.js similarity index 100% rename from projects/dipcoin-spot/index.js rename to projects/dipcoin/index.js From 2317409dbacd1b9e70c15de88309a22baaa60c34 Mon Sep 17 00:00:00 2001 From: alan Date: Thu, 6 Nov 2025 12:17:44 +0800 Subject: [PATCH 11/11] =?UTF-8?q?add=20tvl=E3=80=81volume=E3=80=81fee=20th?= =?UTF-8?q?ree=20meters=20for=20dipcoin=20spot=20and=20dipcoin=20perps.=20?= =?UTF-8?q?and=20combine=20dipcoin=20spot=20and=20dipcoin=20perps=20into?= =?UTF-8?q?=20one=20dipcoin=20group.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/dipcoin-perps/index.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/projects/dipcoin-perps/index.js b/projects/dipcoin-perps/index.js index 49f4f90704e..533efa02e6f 100644 --- a/projects/dipcoin-perps/index.js +++ b/projects/dipcoin-perps/index.js @@ -1,22 +1,25 @@ -const { get } = require("../helper/http"); -const { getConfig } = require('../helper/cache'); -const ADDRESSES = require('../helper/coreAssets.json'); +const ADDRESSES = require('../helper/coreAssets.json') +const sui = require("../helper/chain/sui"); + +const SUI_BANK_ID = + "0x3cc2bfbe6b9dc346f3f27a47b4b0c9eaaf0143c0c704726a1513a1e8c5d9a4c1"; async function suiTvl(api) { - const tvl = (await getConfig('dipcoin/perps-sui', 'https://gray-api.dipcoin.io/api/perp-market-api/tvl'))?.data?.tvl; - api.add(ADDRESSES.sui.USDC, tvl/1e12); -} + const object = await sui.getObject(SUI_BANK_ID); + const usdcAmount = object.fields.coin_balance; + // div by 1e6 as usdc coin has 6 precision + api.add(ADDRESSES.sui.USDC, usdcAmount); +} module.exports = { + sui: { + tvl: suiTvl + }, hallmarks: [ ['2025-10-15', "Launched the Perpetual Mainnet (v1.0)."], ['2025-10-16', "Listed perpetual contracts for BTC, ETH, and SUI."], ['2025-10-29', "Upgraded to Mainnet v1.1, introducing Take Profit/Stop Loss and margin management features."], ['2025-10-31', "Listed perpetual contracts for SOL, BNB, and XRP."], ], - sui: { - tvl: suiTvl - }, } -