Compare commits

..

No commits in common. 'master' and 'main' have entirely different histories.
master ... main

  1. 14
      .gitignore
  2. 9
      README.md
  3. 9
      src/binance/LICENSE
  4. 153
      src/binance/POC.t.sol
  5. 135
      src/binance/Readme.md
  6. 65
      src/binance/alarmer.js
  7. 54
      src/binance/alarmer.ts
  8. 99
      src/binance/bnb.js
  9. 89
      src/binance/bnb.ts
  10. 83
      src/binance/bsc.js
  11. 84
      src/binance/bsc.ts
  12. 88
      src/binance/btc.js
  13. 74
      src/binance/btc.ts
  14. 209
      src/binance/dbWriter.js
  15. 207
      src/binance/dbWriter.ts
  16. 191
      src/binance/eth.js
  17. 191
      src/binance/eth.ts
  18. 53
      src/binance/helper.js
  19. 40
      src/binance/helper.ts
  20. 79
      src/binance/index.js
  21. 63
      src/binance/index.ts
  22. 42
      src/binance/package.json
  23. 222
      src/binance/process.js
  24. 211
      src/binance/process.ts
  25. 188
      src/binance/table.sql
  26. 85
      src/binance/trx.js
  27. 85
      src/binance/trx.ts
  28. 101
      src/binance/tsconfig.json
  29. 89
      src/binance/types.js
  30. 139
      src/binance/types.ts
  31. 4473
      src/binance/yarn.lock

14
.gitignore vendored

@ -1,14 +0,0 @@
# Compiler files
cache/
out/
lib/
# Ignores development broadcast logs
!/broadcast
/broadcast/*/31337/
/broadcast/**/dry-run/
node_modules/
# Dotenv file
.env

@ -1,9 +0,0 @@
project简述:
主要分成以下几块:
1. project:主要是给老大干的活,包括之前的各种分享:Euler等的材料
2. dune: 一个抓Dune页面内容的爬虫
3. prosanity: 一个破解私钥的工具
4. binance: 一个监控币安热钱包的脚本
5. g-bots: 一个抢着mint NFT的脚本
6. docs: 技术文档的归集
7. wolfGame: 一个flashbots的机器人

@ -1,9 +0,0 @@
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1,153 +0,0 @@
pragma solidity 0.8.12;
import "forge-std/Test.sol";
import "forge-std/console2.sol";
contract Getter {
function getETHBalance(address addr) public view returns (uint256) {
return address(addr).balance;
}
function isContract(address addr) public view returns (bool) {
uint256 size;
assembly {
size := extcodesize(addr)
}
return size != 0;
}
function isERC20(address addr) public view returns (bool) {
if (!isContract(addr)) return false;
(bool s,) = addr.staticcall(abi.encodeWithSignature("decimals()"));
return s;
}
function possiblePairs(
address token0,
address[] calldata token1s,
address[] calldata factories
) public view returns (bool found, address pair, uint256 amount) {
if (!isERC20(token0)) {
return (false, address(0), 0);
}
for (uint256 i = 0; i < token1s.length; i++) {
address token1 = token1s[i];
address factory = factories[i];
(bool s, bytes memory data) = factory.staticcall(
abi.encodeWithSignature("getPair(address,address)", token0, token1)
);
if (s) {
address pair = abi.decode(data, (address));
if (pair == address(0)) return (false, address(0), 0);
(bool s2, bytes memory data2) =
token1.staticcall(abi.encodeWithSignature("balanceOf(address)", pair));
if (s2) {
uint256 amount = abi.decode(data2, (uint256));
if (amount > 0) {
return (true, pair, amount);
}
}
}
}
return (false, address(0), 0);
}
function possiblePairsV3(
address token0,
address[] calldata token1s,
address[] calldata factories,
uint24[] calldata fees
) public view returns (bool found, address pair, uint256 amount) {
if (!isERC20(token0)) {
return (false, address(0), 0);
}
for (uint256 i = 0; i < token1s.length; i++) {
address token1 = token1s[i];
address factory = factories[i];
(bool s, bytes memory data) = factory.staticcall(
abi.encodeWithSignature(
"getPool(address,address,uint24)", token0, token1, fees[i]
)
);
if (s) {
address pair = abi.decode(data, (address));
if (pair == address(0)) return (false, address(0), 0);
(bool s2, bytes memory data2) =
token1.staticcall(abi.encodeWithSignature("balanceOf(address)", pair));
if (s2) {
uint256 amount = abi.decode(data2, (uint256));
if (amount > 0) {
return (true, pair, amount);
}
}
}
}
return (false, address(0), 0);
}
}
contract POC is Test {
Getter public getter;
address alice = address(1);
function setUp() public {
vm.createSelectFork(vm.envString("ETH_RPC_URL"), 16038375);
getter = new Getter();
}
function test_1() public {
vm.deal(alice, 1000 ether);
assertEq(getter.getETHBalance(alice), 1000 ether);
assertEq(getter.isContract(alice), false);
assertEq(getter.isContract(address(getter)), true);
assertEq(getter.isERC20(address(getter)), false);
}
function test_2() public {
address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address factory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
assertEq(getter.isERC20(WETH), true);
assertEq(getter.isERC20(USDT), true);
assertEq(getter.isERC20(factory), false);
address[] memory tokens = new address[](1);
tokens[0] = USDT;
address[] memory factories = new address[](1);
factories[0] = factory;
(bool found, address pair, uint256 amount) =
getter.possiblePairs(WETH, tokens, factories);
assertEq(found, true);
assertEq(pair, 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852);
assertEq(amount, 14782372483603);
tokens[0] = address(this);
(found, pair, amount) = getter.possiblePairs(WETH, tokens, factories);
assertEq(found, false);
assertEq(pair, address(0));
assertEq(amount, 0);
}
function test_3() public {
address factoryV3 = 0x1F98431c8aD98523631AE4a59f267346ea31F984;
address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address[] memory tokens = new address[](1);
tokens[0] = USDT;
address[] memory factories = new address[](1);
factories[0] = factoryV3;
uint24[] memory fees = new uint24[](1);
fees[0] = 3000;
(bool found, address pair, uint256 amount) =
getter.possiblePairsV3(WETH, tokens, factories, fees);
assertEq(found, true);
assertEq(pair, 0x4e68Ccd3E89f51C3074ca5072bbAC773960dFa36);
assertEq(amount, 18375033354951);
fees[0] = 1000;
(found, pair, amount) = getter.possiblePairsV3(WETH, tokens, factories, fees);
assertEq(found, false);
assertEq(pair, address(0));
assertEq(amount, 0);
}
}

@ -1,135 +0,0 @@
## Binance Wallet Monitor
这是一个监控币安冷热钱包的小脚本程序,主要依据是币安在其网站上公布的冷热钱包在各条链上的地址进行监控。
币安公布地址的网址连接如下:
https://www.binance.com/en/blog/community/our-commitment-to-transparency-2895840147147652626
### 设计思路:
从各条链上讲对应的token数据抓下来,存放在数据库中。然后另起一个process程序来处理数据用作报警。
#### 获取数据
主要涉及到如下几条链:
BTC,ETH,BNB,BSC,TRX链,
其中,ETH和BSC是EVM兼容链,采用的是multicall的方式直接一次调用RPC拿到数据,针对原生代币也通过调用智能合约的方式一并拿到数据。
针对非EVM兼容链,
- BNB链,主要参考的是币安官网对于BNB链的API,连接如下:
https://docs.bnbchain.org/docs/beaconchain/develop/api-reference/dex-api/paths/#apiv1accountaddress
调用的API方法为:/api/v1/account/{address}
要求是1秒钟,最多调用5次请求
- BTC链,主要使用的是blockonomics的API数据接口,也需要注册API key参考连接如下:
https://www.blockonomics.co/views/api.html
调用的API方法为:https://www.blockonomics.co/api/balance
- TRX链,使用的是TRX官方的tronweb连接库,需要先注册一个API KEY,然后使用该API KEY来进行API请求,参考连接如下:https://cn.developers.tron.network/v3.7/docs/tron-web-class
请求的方法是:调用对应合约的balanceOf方法
请求得到的数据最后都会归一化到同一个数据格式:
```js
export type BinanceInfo = {
"account": string,
"balance": string,
"decimals": number,
"symbol": SYMBOL,
"chain": CHAIN
}
```
然后在调用`types.ts`中的方法,将其映射到数据表对应的格式中。并插入数据库。所有的数据转换工作都在`types.ts`文件中完成。
### 报警逻辑
报警程序是独立的另一个程序,主要是查数据库,然后按规则触发报警。具体的报警规则是:
报警的标的是数量之和,跟价格无关。
1. 针对token,统计其在各条链上的数量之和,作为报警的数据源。
2. 对比当天的第一笔记录情况,如果下跌超过20%就触发报警,如果继续下跌超30%...90%也报警,然而反弹到20%则不报警
3. 对比所有记录的第一笔情况,或者上一次报警的记录情况,如果下跌超过20%就触发报警,如果继续下跌超30%也报警,然而反弹到20%则不报警
具体的实现非常依赖于以下sql的统计数据:`firstToday,last,curr`
```sql
-- 统计当天第一笔记录的balance之和: firstToday
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
record_balance_bnb_binance_wallet_balance
WHERE
token_address = 'BNB_BNB'
and timestamp = (
SELECT TIMESTAMP
FROM
record_balance_bnb_binance_wallet_balance
where
Date(now()) = Date(FROM_UNIXTIME(timestamp))
ORDER BY TIMESTAMP
LIMIT 1
)
limit 1
-- 统计上一次报警的记录的balnace之和,如果没有上一次报警记录,则统计所有记录的第一记录的balance之和:last
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
record_balance_bnb_binance_wallet_balance
WHERE
token_address = 'BNB_BNB'
and timestamp = IFNULL(
(
SELECT valueInt
FROM
global_params
where
keyStr = 'BNB_BNB__Last_Timestamp'
ORDER BY timestamp DESC
LIMIT 1
),(
SELECT TIMESTAMP
FROM
record_balance_bnb_binance_wallet_balance
where token_address = 'BNB_BNB'
ORDER BY TIMESTAMP
LIMIT 1
))
order by timestamp
limit 1
-- 统计当前最新的一次记录的balance之和:curr
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
record_balance_bnb_binance_wallet_balance
WHERE
token_address = 'BNB_BNB'
and timestamp = (
SELECT TIMESTAMP
FROM
record_balance_bnb_binance_wallet_balance
ORDER BY TIMESTAMP DESC
LIMIT 1
)
limit 1
```
具体的计算逻辑是参考了FTT价格报警的算法设计,知道当前的状态curr,要比较的状态firstToday或者是last,然后计算出delta值,然后根据delta值,去表格中查询对应的index,并将index与global index进行比较,如果index>gloabl index,说明下跌幅度扩大,触发报警;否则,说明下跌幅度收窄,则不触发报警。
重置global index的逻辑是:
针对last比较,每报警一次last,则需要重置一次last 的global index;
针对24h,如果firstToday的UTC时间戳与当前系统中维护的firstToday UTC时间戳不一样时,需要重置一次firstToday的global index
### Debug
报警程序卡住了,原因是插入中间表的时候存在唯一键冲突,但是错误处理没做好,pm2没有及时拉起来。
更改了中间表的唯一键,调试确认了能够正常报警。
即将uniqueKey进行了修改
```sql
DROP table if EXISTS global_params;
create table
`global_params` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`keyStr` varchar(255) NOT NULL,
`valueString` varchar(255) NOT NULL DEFAULT '',
`valueInt` BIGINT NOT NULL,
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`keyStr`,
`valueInt`,
`valueString`
) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
```

@ -1,65 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.send = void 0;
const url = "https://oapi.dingtalk.com/robot/send?access_token=4cb5640f1f79869eeeb77017bf1f71cd739ae2aedca5c19b9fb9506a9125d519";
const node_fetch_1 = __importDefault(require("node-fetch"));
require("log-timestamp");
function send(params) {
return __awaiter(this, void 0, void 0, function* () {
if (params === null)
return;
let body = {
"at": {
"isAtAll": true
},
"msgtype": "markdown",
"markdown": {
"title": "Binance报警",
"text": `
### Token
${params.token}
### Chain
${params.chain}
### Rule
${params.rule}
### AlarmInfo
- curr: ${params.alarmInfo.curr}
- last: ${params.alarmInfo.last}
- firstToday: ${params.alarmInfo.firstToday}
- 24h: ${params.alarmInfo.delta1}
- All: ${params.alarmInfo.delta2}
- detail: ${params.alarmInfo.detail}
### TIME:
${params.datetime}
`
}
};
let res = yield (0, node_fetch_1.default)(url, {
'method': "POST",
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json'
}
});
console.log(`the send message is ${JSON.stringify(body)}`);
const data = yield res.json();
console.log(data);
if (data.errmsg != 'ok') {
console.log(`=====================================> error happens, please check`);
process.exit(1);
}
});
}
exports.send = send;

@ -1,54 +0,0 @@
const url: string = "https://oapi.dingtalk.com/robot/send?access_token=4cb5640f1f79869eeeb77017bf1f71cd739ae2aedca5c19b9fb9506a9125d519"
import fetch from "node-fetch"
import { AlamerParams } from "./types";
require("log-timestamp")
export async function send(params: AlamerParams | null) {
if (params === null) return
let body = {
"at": {
"isAtAll": true
},
"msgtype": "markdown",
"markdown": {
"title": "Binance报警",
"text": `
### Token
${params.token}
### Chain
${params.chain}
### Rule
${params.rule}
### AlarmInfo
- curr: ${params.alarmInfo.curr}
- last: ${params.alarmInfo.last}
- firstToday: ${params.alarmInfo.firstToday}
- 24h: ${params.alarmInfo.delta1}
- All: ${params.alarmInfo.delta2}
- detail: ${params.alarmInfo.detail}
### TIME:
${params.datetime}
`}
}
let res = await fetch(url, {
'method': "POST",
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json'
}
})
console.log(`the send message is ${JSON.stringify(body)}`)
const data = await res.json()
console.log(data)
if (data.errmsg != 'ok') {
console.log(`=====================================> error happens, please check`)
process.exit(1)
}
}

@ -1,99 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBnb = void 0;
const fetch = require('node-fetch-with-proxy');
const addrs = [
"bnb1edrs5cukhx060e02u98v9j8spum7vhuqg9ctxd",
"bnb142q467df6jun6rt5u2ar58sp47hm5f9wvz2cvg",
"bnb1u2agwjat20494fmc6jnuau0ls937cfjn4pjwtn",
"bnb1lsmt5a8vqqus5fwslx8pyyemgjtg4y6ugj308t",
"bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz",
"bnb1jxfh2g85q3v0tdq56fnevx6xcxtcnhtsmcu64m",
"bnb1m5amny2gs3xdyta6pksmr43zu4727w24syyks7",
"bnb1panyupy43sazh4dka6fg3s08909ejhqz4k23eg",
"bnb1ymasdm96ld0v6s38ylvu0qsw0xmhdlhy47tpsg",
"bnb1tdcrvgjl580p2qv77y0cu2ezk3c80039psx6sh",
"bnb1e08c39tjpr5fvdh4cfhqmyclrh62ag45qmddud",
"bnb1lq4s05lgat8d0qh275q0elt4m9rs760m0ryced",
"bnb1t5fn9faqu5aanvexqu8dt9tah4jg20eun8gsee",
"bnb1dkckvfuqv7fjl902cvuqmde27skk94kjp09j99",
"bnb14u5qnp4peug4a6wlz327mx9xjd0xf6phe7ew8u",
"bnb19fk9hqqlp8xcwrt0w35weyufnglp43hlthev3l",
"bnb1uexf06gd94qsxdmqamk360d893dsrm8lvwyjsd",
"bnb1uwdm6vrfvx43wqj8cj3h362kad0g0nrk3gumg8",
"bnb1a5f0ghn3c2whfmz3z0wjggwcgsk2t26ynqn68x",
"bnb1s3czyqxaf4hyt3rueg9gss08nfnvxjzy5qfu2p",
"bnb1yud0r5kz3ctu07fwax3j753ueef6d0n0uxrx94",
"bnb1fxk3lmfu2h0qhywdump0hvggg6prlge88f42n9",
"bnb1erq4ykp99sm87tsrfg8mgjef350gqtzhsqwys6",
"bnb1u70jtt2umum4ag3vcpw2h8v8levm47t0mtjwmh",
"bnb1xrfwzlu9c5208lhtn7ywt0mjrhjh4nt4fjyqxy"
];
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function findBNBAmount(data) {
if (data == null || data.balances == null)
return 0;
let balances = data === null || data === void 0 ? void 0 : data.balances;
for (let i = 0; i < balances.length; i++) {
let symbol = balances[i].symbol;
if (symbol == "BNB") {
return balances[i].free.split('.')[0];
}
}
return 0;
}
function getBnbByAddr(addr) {
return __awaiter(this, void 0, void 0, function* () {
yield sleep(200);
let url = `https://dex.binance.org/api/v1/account/${addr}`;
// let url = 'https://testnet-dex.binance.org/api/v1/account/tbnb185tqzq3j6y7yep85lncaz9qeectjxqe5054cgn'
try {
let res = yield fetch(url, {
method: 'GET',
headers: { 'Content-Type': 'application/json' }
});
if (res.status != 200)
return 0;
let data = yield res.json();
let address = data.address;
let amount = findBNBAmount(data);
return address == addr ? amount : 0;
}
catch (e) {
console.log(e);
process.exit(1);
}
return 0;
});
}
function getBnb() {
return __awaiter(this, void 0, void 0, function* () {
let res = [];
for (let i = 0; i < addrs.length; i++) {
let ACCOUNT = addrs[i];
let balance = yield getBnbByAddr(ACCOUNT);
res.push({
"account": ACCOUNT,
"balance": balance,
"decimals": 0,
"symbol": "BNB",
"chain": "BNB"
});
}
console.log(res);
return res;
});
}
exports.getBnb = getBnb;
// getBnb();

@ -1,89 +0,0 @@
const fetch = require('node-fetch-with-proxy');
import { BinanceInfo } from './types';
const addrs = [
"bnb1edrs5cukhx060e02u98v9j8spum7vhuqg9ctxd",
"bnb142q467df6jun6rt5u2ar58sp47hm5f9wvz2cvg",
"bnb1u2agwjat20494fmc6jnuau0ls937cfjn4pjwtn",
"bnb1lsmt5a8vqqus5fwslx8pyyemgjtg4y6ugj308t",
"bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz",
"bnb1jxfh2g85q3v0tdq56fnevx6xcxtcnhtsmcu64m",
"bnb1m5amny2gs3xdyta6pksmr43zu4727w24syyks7",
"bnb1panyupy43sazh4dka6fg3s08909ejhqz4k23eg",
"bnb1ymasdm96ld0v6s38ylvu0qsw0xmhdlhy47tpsg",
"bnb1tdcrvgjl580p2qv77y0cu2ezk3c80039psx6sh",
"bnb1e08c39tjpr5fvdh4cfhqmyclrh62ag45qmddud",
"bnb1lq4s05lgat8d0qh275q0elt4m9rs760m0ryced",
"bnb1t5fn9faqu5aanvexqu8dt9tah4jg20eun8gsee",
"bnb1dkckvfuqv7fjl902cvuqmde27skk94kjp09j99",
"bnb14u5qnp4peug4a6wlz327mx9xjd0xf6phe7ew8u",
"bnb19fk9hqqlp8xcwrt0w35weyufnglp43hlthev3l",
"bnb1uexf06gd94qsxdmqamk360d893dsrm8lvwyjsd",
"bnb1uwdm6vrfvx43wqj8cj3h362kad0g0nrk3gumg8",
"bnb1a5f0ghn3c2whfmz3z0wjggwcgsk2t26ynqn68x",
"bnb1s3czyqxaf4hyt3rueg9gss08nfnvxjzy5qfu2p",
"bnb1yud0r5kz3ctu07fwax3j753ueef6d0n0uxrx94",
"bnb1fxk3lmfu2h0qhywdump0hvggg6prlge88f42n9",
"bnb1erq4ykp99sm87tsrfg8mgjef350gqtzhsqwys6",
"bnb1u70jtt2umum4ag3vcpw2h8v8levm47t0mtjwmh",
"bnb1xrfwzlu9c5208lhtn7ywt0mjrhjh4nt4fjyqxy"
]
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function findBNBAmount(data: any) {
if (data == null || data.balances == null) return 0
let balances = data?.balances
for (let i = 0; i < balances.length; i++) {
let symbol = balances[i].symbol
if (symbol == "BNB") {
return balances[i].free.split('.')[0]
}
}
return 0;
}
async function getBnbByAddr(addr: string) {
await sleep(200)
let url = `https://dex.binance.org/api/v1/account/${addr}`
// let url = 'https://testnet-dex.binance.org/api/v1/account/tbnb185tqzq3j6y7yep85lncaz9qeectjxqe5054cgn'
try {
let res = await fetch(url, {
method: 'GET',
headers: { 'Content-Type': 'application/json' }
})
if (res.status != 200) return 0
let data = await res.json()
let address = data.address
let amount = findBNBAmount(data)
return address == addr ? amount : 0
} catch (e) {
console.log(e)
process.exit(1)
}
return 0
}
export async function getBnb() {
let res: Array<BinanceInfo> = []
for (let i = 0; i < addrs.length; i++) {
let ACCOUNT = addrs[i]
let balance = await getBnbByAddr(ACCOUNT)
res.push({
"account": ACCOUNT,
"balance": balance,
"decimals": 0,
"symbol": "BNB",
"chain": "BNB"
})
}
console.log(res)
return res
}
// getBnb();

@ -1,83 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBsc = void 0;
const ethers_1 = require("ethers");
const utils_1 = require("ethers/lib/utils");
const multicallAddr = "0xcA11bde05977b3631167028862bE2a173976CA11";
const abi = [
"function balanceOf(address) external returns (uint256)",
"function getETHBalance(address) external returns (uint256)",
"function aggregate((address,bytes)[] memory calls) view external returns (uint256 blockNumber, bytes[] memory returnData)",
];
const inf = new utils_1.Interface(abi);
// const Getter = "0x8e82F2b42811054904c702EC1186DB24c6892b2E";
const Getter = "0x6726395AF114D916dF572055f22Ec58F697AA70e";
const ETH_ADDRS = [
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0x3c783c21a0383057d128bae431894a5c19f9cf06",
"0xdccf3b77da55107280bd850ea519df3705d1a75a",
"0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
"0x515b72ed8a97f42c568d6a143232775018f133c8",
"0xbd612a3f30dca67bf60a39fd0d35e39b7ab80774",
"0x01c952174c24e1210d26961d456a77a39e1f0bb0",
"0x29bdfbf7d27462a2d115748ace2bd71a2646946c",
"0xe2fc31f816a9b94326492132018c3aecc4a93ae1",
"0x73f5ebe90f27b46ea12e5795d16c4b408b19cc6f",
"0x161ba15a5f335c9f06bb5bbb0a9ce14076fbb645",
"0x1fbe2acee135d991592f167ac371f3dd893a508b",
"0xeb2d2f1b8c558a40207669291fda468e50c8a0bb",
"0xa180fe01b906a1be37be6c534a3300785b20d947"
];
const providerUrl = "https://binance.nodereal.io";
function encodeData() {
let res = [];
for (let i = 0; i < ETH_ADDRS.length; i++) {
let addr = ETH_ADDRS[i];
let calldata = inf.encodeFunctionData("getETHBalance", [addr]);
res.push([Getter, calldata]);
}
return res;
}
function decodeData(returnData) {
let res = [];
let offset = 0;
for (let i = 0; i < ETH_ADDRS.length; i++) {
let index = i + offset;
let addr = ETH_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("getETHBalance", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BNB",
"chain": "BSC"
});
}
return res;
}
function getBsc() {
return __awaiter(this, void 0, void 0, function* () {
let provider = new ethers_1.ethers.providers.JsonRpcProvider(providerUrl);
const multicall = new ethers_1.ethers.Contract(multicallAddr, abi, provider);
let data = encodeData();
let resCall = yield multicall.functions.aggregate(data);
let blockNumber = resCall.blockNumber;
let res = decodeData(resCall.returnData);
console.log(res);
return res;
});
}
exports.getBsc = getBsc;
// getBsc()

@ -1,84 +0,0 @@
import { ethers } from "ethers"
import { Interface } from "ethers/lib/utils"
import { BinanceInfo } from "./types"
const multicallAddr = "0xcA11bde05977b3631167028862bE2a173976CA11"
const abi = [
"function balanceOf(address) external returns (uint256)",
"function getETHBalance(address) external returns (uint256)",
"function aggregate((address,bytes)[] memory calls) view external returns (uint256 blockNumber, bytes[] memory returnData)",
]
const inf = new Interface(abi)
// const Getter = "0x8e82F2b42811054904c702EC1186DB24c6892b2E";
const Getter = "0x6726395AF114D916dF572055f22Ec58F697AA70e"
const ETH_ADDRS = [
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0x3c783c21a0383057d128bae431894a5c19f9cf06",
"0xdccf3b77da55107280bd850ea519df3705d1a75a",
"0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
"0x515b72ed8a97f42c568d6a143232775018f133c8",
"0xbd612a3f30dca67bf60a39fd0d35e39b7ab80774",
"0x01c952174c24e1210d26961d456a77a39e1f0bb0",
"0x29bdfbf7d27462a2d115748ace2bd71a2646946c",
"0xe2fc31f816a9b94326492132018c3aecc4a93ae1",
"0x73f5ebe90f27b46ea12e5795d16c4b408b19cc6f",
"0x161ba15a5f335c9f06bb5bbb0a9ce14076fbb645",
"0x1fbe2acee135d991592f167ac371f3dd893a508b",
"0xeb2d2f1b8c558a40207669291fda468e50c8a0bb",
"0xa180fe01b906a1be37be6c534a3300785b20d947"
]
const providerUrl = "https://binance.nodereal.io"
function encodeData() {
let res: Array<any> = [];
for (let i = 0; i < ETH_ADDRS.length; i++) {
let addr = ETH_ADDRS[i]
let calldata = inf.encodeFunctionData("getETHBalance", [addr])
res.push([Getter, calldata])
}
return res;
}
function decodeData(returnData: any) {
let res: Array<BinanceInfo> = []
let offset = 0
for (let i = 0; i < ETH_ADDRS.length; i++) {
let index = i + offset;
let addr = ETH_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("getETHBalance", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BNB",
"chain": "BSC"
})
}
return res;
}
export async function getBsc() {
let provider = new ethers.providers.JsonRpcProvider(providerUrl)
const multicall = new ethers.Contract(multicallAddr, abi, provider)
let data = encodeData();
let resCall = await multicall.functions.aggregate(data);
let blockNumber = resCall.blockNumber
let res = decodeData(resCall.returnData)
console.log(res)
return res;
}
// getBsc()

@ -1,88 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBtc = void 0;
const node_fetch_1 = __importDefault(require("node-fetch"));
const addrs = [
"34xp4vRoCGJym3xR7yCVPFHoCNxv4Twseo",
"3LYJfcfHPXYJreMsASk2jkn69LWEYKzexb",
"3M219KR5vEneNb47ewrPfWyb5jQ2DjxRP6",
"bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h"
];
function findBTCAmount(data, expectedAddr) {
var _a;
if (data == null || data.response == null)
return 0;
let response = data === null || data === void 0 ? void 0 : data.response[0];
let addr = response.addr;
let amount = (_a = response.confirmed + response.unconfirmed) !== null && _a !== void 0 ? _a : 0;
if (addr == expectedAddr) {
return amount;
}
return 0;
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function getBtcByAddr(addr) {
return __awaiter(this, void 0, void 0, function* () {
yield sleep(200);
let url = "https://www.blockonomics.co/api/balance";
const APIKEY = "gXXlZWMHUtd8z36YjQsLOcZ2UcSyP4PaTrawBrjQTnI";
let postData = { "addr": addr };
try {
let res = yield (0, node_fetch_1.default)(url, {
body: JSON.stringify(postData),
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': 'blockonomics',
'Accept': 'application/json',
'Authorization': 'Bearer ' + APIKEY
}
});
// console.log(res)
if (res.status != 200)
return 0;
let data = yield res.json();
let amount = findBTCAmount(data, addr);
return amount;
}
catch (e) {
console.log(e);
process.exit(1);
}
return 0;
});
}
function getBtc() {
return __awaiter(this, void 0, void 0, function* () {
let res = [];
for (let i = 0; i < addrs.length; i++) {
let ACCOUNT = addrs[i];
let balance = yield getBtcByAddr(ACCOUNT);
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 8,
"symbol": "BTC",
"chain": "BTC"
});
}
console.log(res);
return res;
});
}
exports.getBtc = getBtc;
// getBtc()

@ -1,74 +0,0 @@
import { BinanceInfo } from "./types"
import fetch from "node-fetch"
const addrs = [
"34xp4vRoCGJym3xR7yCVPFHoCNxv4Twseo",
"3LYJfcfHPXYJreMsASk2jkn69LWEYKzexb",
"3M219KR5vEneNb47ewrPfWyb5jQ2DjxRP6",
"bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h"
]
function findBTCAmount(data: any, expectedAddr: string) {
if (data == null || data.response == null) return 0
let response = data?.response[0]
let addr = response.addr
let amount = response.confirmed + response.unconfirmed ?? 0
if (addr == expectedAddr) {
return amount
}
return 0;
}
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getBtcByAddr(addr: string) {
await sleep(200)
let url = "https://www.blockonomics.co/api/balance"
const APIKEY = "gXXlZWMHUtd8z36YjQsLOcZ2UcSyP4PaTrawBrjQTnI"
let postData = { "addr": addr }
try {
let res = await fetch(url, {
body: JSON.stringify(postData),
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': 'blockonomics',
'Accept': 'application/json',
'Authorization': 'Bearer ' + APIKEY
}
})
// console.log(res)
if (res.status != 200) return 0
let data = await res.json()
let amount = findBTCAmount(data, addr)
return amount
} catch (e) {
console.log(e)
process.exit(1)
}
return 0
}
export async function getBtc() {
let res: Array<BinanceInfo> = []
for (let i = 0; i < addrs.length; i++) {
let ACCOUNT = addrs[i]
let balance = await getBtcByAddr(ACCOUNT)
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 8,
"symbol": "BTC",
"chain": "BTC"
})
}
console.log(res)
return res;
}
// getBtc()

@ -1,209 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DbWriter2 = exports.DbWriter = void 0;
const sequelize_1 = require("sequelize");
const types_1 = require("./types");
class DbWriter {
constructor(connectionInfo, tableName, chain, globalParamsTable) {
const instance = new sequelize_1.Sequelize(connectionInfo, { "logging": true });
this.globalPramasTable = globalParamsTable;
this.instance = instance;
this.chain = chain;
this.tableName = tableName;
this.dbWriter = instance.define('dbWriter', {
'id': {
type: sequelize_1.DataTypes.BIGINT,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
'pool_address': sequelize_1.DataTypes.CHAR,
'token_address': sequelize_1.DataTypes.CHAR,
'chain_id': sequelize_1.DataTypes.INTEGER,
'balance': sequelize_1.DataTypes.BIGINT,
'timestamp': sequelize_1.DataTypes.INTEGER,
'createdAt': sequelize_1.DataTypes.DATE,
'updatedAt': sequelize_1.DataTypes.DATE
}, {
'tableName': tableName,
'timestamps': false
});
}
getLastReportSumBySymbol(symbol) {
return __awaiter(this, void 0, void 0, function* () {
let token_address = (0, types_1.symbolToAddrByChain)(symbol, this.chain);
let suffix = "_Last_Timestamp";
let key = `${this.chain}_${symbol}_${suffix}`;
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = IFNULL(
(
SELECT valueInt
FROM
${this.globalPramasTable}
where
keyStr = '${key}'
ORDER BY timestamp DESC
LIMIT 1
),(
SELECT TIMESTAMP
FROM
${this.tableName}
where token_address = '${token_address}'
ORDER BY TIMESTAMP
LIMIT 1
))
order by timestamp
limit 1
`;
let res = yield this.instance.query(sql, { type: sequelize_1.QueryTypes.SELECT });
let balance = Number(res[0].balance);
let timestamp = Number(res[0].timestamp);
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance);
process.exit(1);
}
let sumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol };
console.log("last type", typeof (balance));
return sumInfo;
});
}
getFirstTodaySumBySymbol(symbol) {
return __awaiter(this, void 0, void 0, function* () {
let token_address = (0, types_1.symbolToAddrByChain)(symbol, this.chain);
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = (
SELECT TIMESTAMP
FROM
${this.tableName}
where
Date(now()) = Date(FROM_UNIXTIME(timestamp))
and token_address = '${token_address}'
ORDER BY TIMESTAMP
LIMIT 1
)
limit 1
`;
let res = yield this.instance.query(sql, { type: sequelize_1.QueryTypes.SELECT });
let balance = Number(res[0].balance);
let timestamp = Number(res[0].timestamp);
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance);
process.exit(1);
}
let sumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol };
console.log("last type", typeof (balance));
return sumInfo;
});
}
getCurrSumBySymbol(symbol) {
return __awaiter(this, void 0, void 0, function* () {
let token_address = (0, types_1.symbolToAddrByChain)(symbol, this.chain);
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = (
SELECT TIMESTAMP
FROM
${this.tableName}
where
token_address = '${token_address}'
ORDER BY TIMESTAMP DESC
LIMIT 1
)
limit 1
`;
let res = yield this.instance.query(sql, { type: sequelize_1.QueryTypes.SELECT });
// console.log(res)
let balance = Number(res[0].balance);
let timestamp = Number(res[0].timestamp);
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance);
process.exit(1);
}
let sumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol };
console.log("last type", typeof (balance));
return sumInfo;
});
}
write(params) {
return __awaiter(this, void 0, void 0, function* () {
let res = yield this.dbWriter.create(params);
return res;
});
}
writeAll(params) {
return __awaiter(this, void 0, void 0, function* () {
let res = yield this.dbWriter.bulkCreate(params);
return res;
});
}
}
exports.DbWriter = DbWriter;
class DbWriter2 {
constructor(connectionInfo) {
const instance = new sequelize_1.Sequelize(connectionInfo, { "logging": false });
this.dbWriter = instance.define('dbWriter', {
'id': {
type: sequelize_1.DataTypes.BIGINT,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
'keyStr': sequelize_1.DataTypes.CHAR,
'valueString': sequelize_1.DataTypes.CHAR,
'valueInt': sequelize_1.DataTypes.BIGINT,
'timestamp': sequelize_1.DataTypes.INTEGER,
'createdAt': sequelize_1.DataTypes.DATE,
'updatedAt': sequelize_1.DataTypes.DATE
}, {
'tableName': types_1.GLOBAL_PARAMS_TABLE,
'timestamps': false
});
}
getCurrValue(key) {
return __awaiter(this, void 0, void 0, function* () {
let res = yield this.dbWriter.findOne({
where: {
'keyStr': key
}
});
return res;
});
}
write(params) {
return __awaiter(this, void 0, void 0, function* () {
let res = yield this.dbWriter.create(params);
return res;
});
}
writeAll(params) {
return __awaiter(this, void 0, void 0, function* () {
let res = yield this.dbWriter.bulkCreate(params);
return res;
});
}
}
exports.DbWriter2 = DbWriter2;
// test_Dbwriter()

@ -1,207 +0,0 @@
// 3. dbwriter dbwriter主要负责写数据库
import dayjs from 'dayjs';
import { Sequelize, DataTypes, Model, DateDataType, QueryTypes } from 'sequelize';
import { BinanceInfo, CHAIN, DbParams, DbParams2, GLOBAL_PARAMS_TABLE, SUFFIX, SumInfo, SYMBOL, symbolToAddrByChain } from './types';
export class DbWriter {
dbWriter: any;
chain: CHAIN;
tableName: string;
instance: any;
globalPramasTable: string;
constructor(connectionInfo: string, tableName: string, chain: CHAIN, globalParamsTable: string) {
const instance = new Sequelize(connectionInfo, { "logging": true });
this.globalPramasTable = globalParamsTable
this.instance = instance
this.chain = chain
this.tableName = tableName
this.dbWriter = instance.define('dbWriter', {
'id': {
type: DataTypes.BIGINT,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
'pool_address': DataTypes.CHAR,
'token_address': DataTypes.CHAR,
'chain_id': DataTypes.INTEGER,
'balance': DataTypes.BIGINT,
'timestamp': DataTypes.INTEGER,
'createdAt': DataTypes.DATE,
'updatedAt': DataTypes.DATE
}, {
'tableName': tableName,
'timestamps': false
})
}
async getLastReportSumBySymbol(symbol: SYMBOL): Promise<SumInfo> {
let token_address: string = symbolToAddrByChain(symbol, this.chain)
let suffix: SUFFIX = "_Last_Timestamp"
let key: DbParams2["keyStr"] = `${this.chain}_${symbol}_${suffix}`
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = IFNULL(
(
SELECT valueInt
FROM
${this.globalPramasTable}
where
keyStr = '${key}'
ORDER BY timestamp DESC
LIMIT 1
),(
SELECT TIMESTAMP
FROM
${this.tableName}
where token_address = '${token_address}'
ORDER BY TIMESTAMP
LIMIT 1
))
order by timestamp
limit 1
`
let res: Array<any> = await this.instance.query(sql, { type: QueryTypes.SELECT });
let balance: number = Number(res[0].balance)
let timestamp: number = Number(res[0].timestamp)
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance)
process.exit(1);
}
let sumInfo: SumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol }
console.log("last type", typeof (balance))
return sumInfo
}
async getFirstTodaySumBySymbol(symbol: SYMBOL): Promise<SumInfo> {
let token_address: string = symbolToAddrByChain(symbol, this.chain)
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = (
SELECT TIMESTAMP
FROM
${this.tableName}
where
Date(now()) = Date(FROM_UNIXTIME(timestamp))
and token_address = '${token_address}'
ORDER BY TIMESTAMP
LIMIT 1
)
limit 1
`
let res: Array<any> = await this.instance.query(sql, { type: QueryTypes.SELECT });
let balance: number = Number(res[0].balance)
let timestamp: number = Number(res[0].timestamp)
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance)
process.exit(1);
}
let sumInfo: SumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol }
console.log("last type", typeof (balance))
return sumInfo
}
async getCurrSumBySymbol(symbol: SYMBOL): Promise<SumInfo> {
let token_address: string = symbolToAddrByChain(symbol, this.chain)
let sql = `
SELECT sum(balance) as balance, avg(timestamp) as timestamp
FROM
${this.tableName}
WHERE
token_address = '${token_address}'
and timestamp = (
SELECT TIMESTAMP
FROM
${this.tableName}
where
token_address = '${token_address}'
ORDER BY TIMESTAMP DESC
LIMIT 1
)
limit 1
`
let res: Array<any> = await this.instance.query(sql, { type: QueryTypes.SELECT });
// console.log(res)
let balance: number = Number(res[0].balance)
let timestamp: number = Number(res[0].timestamp)
if (timestamp < 1000) {
console.error("get data from db failed timestamp: %d, balance %d", timestamp, balance)
process.exit(1);
}
let sumInfo: SumInfo = { balance: balance, timestamp: timestamp, chain: this.chain, symbol: symbol }
console.log("last type", typeof (balance))
return sumInfo
}
async write(params: DbParams) {
let res = await this.dbWriter.create(params)
return res
}
async writeAll(params: Array<DbParams>) {
let res = await this.dbWriter.bulkCreate(params)
return res
}
}
export class DbWriter2 {
dbWriter: any;
constructor(connectionInfo: string) {
const instance = new Sequelize(connectionInfo, { "logging": false });
this.dbWriter = instance.define('dbWriter', {
'id': {
type: DataTypes.BIGINT,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
'keyStr': DataTypes.CHAR,
'valueString': DataTypes.CHAR,
'valueInt': DataTypes.BIGINT,
'timestamp': DataTypes.INTEGER,
'createdAt': DataTypes.DATE,
'updatedAt': DataTypes.DATE
}, {
'tableName': GLOBAL_PARAMS_TABLE,
'timestamps': false
})
}
async getCurrValue(key: DbParams2["keyStr"]): Promise<DbParams2["valueString"] | DbParams2["valueInt"]> {
let res = await this.dbWriter.findOne(
{
where: {
'keyStr': key
}
}
)
return res
}
async write(params: DbParams2) {
let res = await this.dbWriter.create(params)
return res
}
async writeAll(params: Array<DbParams2>) {
let res = await this.dbWriter.bulkCreate(params)
return res
}
}
// test_Dbwriter()

@ -1,191 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getEth = void 0;
const ethers_1 = require("ethers");
const utils_1 = require("ethers/lib/utils");
const multicallAddr = "0xcA11bde05977b3631167028862bE2a173976CA11";
const abi = [
"function balanceOf(address) external returns (uint256)",
"function getETHBalance(address) external returns (uint256)",
"function aggregate((address,bytes)[] memory calls) view external returns (uint256 blockNumber, bytes[] memory returnData)",
];
const inf = new utils_1.Interface(abi);
const Getter = "0x8e82F2b42811054904c702EC1186DB24c6892b2E";
const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
const USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const BUSD = "0x4Fabb145d64652a948d72533023f6E7A623C7C53";
const BNB = "0xB8c77482e45F1F44dE1745F52C74426C631bDD52";
const ETH_ADDRS = [
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x9696f59e4d72e237be84ffd425dcad154bf96976",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"0x4976a4a02f38326660d17bf34b431dc6e2eb2327"
];
const USDC_ADDRS = [
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d"
];
const USDT_ADDRS = [
"0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503",
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x9696f59e4d72e237be84ffd425dcad154bf96976",
"0x4976a4a02f38326660d17bf34b431dc6e2eb2327"
];
const BUSD_ADDRS = [
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503",
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549"
];
const BNB_ADDRS = [
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0xf977814e90da44bfa03b6295a0616a897441acec"
];
const providerUrl = "https://eth-rpc.gateway.pokt.network";
function encodeData() {
let res = [];
for (let i = 0; i < ETH_ADDRS.length; i++) {
let addr = ETH_ADDRS[i];
let calldata = inf.encodeFunctionData("getETHBalance", [addr]);
res.push([Getter, calldata]);
}
for (let i = 0; i < USDC_ADDRS.length; i++) {
let addr = USDC_ADDRS[i];
let calldata = inf.encodeFunctionData("balanceOf", [addr]);
res.push([USDC, calldata]);
}
for (let i = 0; i < USDT_ADDRS.length; i++) {
let addr = USDT_ADDRS[i];
let calldata = inf.encodeFunctionData("balanceOf", [addr]);
res.push([USDT, calldata]);
}
for (let i = 0; i < BUSD_ADDRS.length; i++) {
let addr = BUSD_ADDRS[i];
let calldata = inf.encodeFunctionData("balanceOf", [addr]);
res.push([BUSD, calldata]);
}
for (let i = 0; i < BNB_ADDRS.length; i++) {
let addr = BNB_ADDRS[i];
let calldata = inf.encodeFunctionData("balanceOf", [addr]);
res.push([BNB, calldata]);
}
return res;
}
function decodeData(returnData) {
let res = [];
let offset = 0;
for (let i = 0; i < ETH_ADDRS.length; i++) {
let index = i + offset;
let addr = ETH_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("getETHBalance", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "ETH",
"chain": "ETH"
});
}
// console.log(res)
offset += ETH_ADDRS.length;
for (let i = 0; i < USDC_ADDRS.length; i++) {
let index = i + offset;
let addr = USDC_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 6,
"symbol": "USDC",
"chain": "ETH"
});
}
offset += USDC_ADDRS.length;
for (let i = 0; i < USDT_ADDRS.length; i++) {
let index = i + offset;
let addr = USDT_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 6,
"symbol": "USDT",
"chain": "ETH"
});
}
offset += USDT_ADDRS.length;
for (let i = 0; i < BUSD_ADDRS.length; i++) {
let index = i + offset;
let addr = BUSD_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BUSD",
"chain": "ETH"
});
}
offset += BUSD_ADDRS.length;
for (let i = 0; i < BNB_ADDRS.length; i++) {
let index = i + offset;
let addr = BNB_ADDRS[i];
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata);
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BNB",
"chain": "ETH"
});
}
return res;
}
function getEth() {
return __awaiter(this, void 0, void 0, function* () {
let connection = { "url": providerUrl, "timeout": 120000 };
let provider = new ethers_1.ethers.providers.JsonRpcProvider(connection);
const multicall = new ethers_1.ethers.Contract(multicallAddr, abi, provider);
let data = encodeData();
console.log(data);
let resCall = yield multicall.functions.aggregate(data);
console.log(resCall.returnData);
let blockNumber = resCall.blockNumber;
let res = decodeData(resCall.returnData);
console.log(res);
// console.log(blockNumber)
return res;
});
}
exports.getEth = getEth;
// getEth()

@ -1,191 +0,0 @@
import { BinanceInfo } from "./types";
import { ethers } from "ethers";
import { Interface } from "ethers/lib/utils";
const multicallAddr = "0xcA11bde05977b3631167028862bE2a173976CA11"
const abi = [
"function balanceOf(address) external returns (uint256)",
"function getETHBalance(address) external returns (uint256)",
"function aggregate((address,bytes)[] memory calls) view external returns (uint256 blockNumber, bytes[] memory returnData)",
]
const inf = new Interface(abi)
const Getter = "0x8e82F2b42811054904c702EC1186DB24c6892b2E";
const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
const USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const BUSD = "0x4Fabb145d64652a948d72533023f6E7A623C7C53";
const BNB = "0xB8c77482e45F1F44dE1745F52C74426C631bDD52";
const ETH_ADDRS = [
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x9696f59e4d72e237be84ffd425dcad154bf96976",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"0x4976a4a02f38326660d17bf34b431dc6e2eb2327"
]
const USDC_ADDRS = [
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d"
]
const USDT_ADDRS = [
"0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503",
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549",
"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x9696f59e4d72e237be84ffd425dcad154bf96976",
"0x4976a4a02f38326660d17bf34b431dc6e2eb2327"
]
const BUSD_ADDRS = [
"0xf977814e90da44bfa03b6295a0616a897441acec",
"0x47ac0Fb4F2D84898e4D9E7b4DaB3C24507a6D503",
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0x5a52e96bacdabb82fd05763e25335261b270efcb",
"0xa344c7aDA83113B3B56941F6e85bf2Eb425949f3",
"0xdfd5293d8e347dfe59e90efd55b2956a1343963d",
"0x28c6c06298d514db089934071355e5743bf21d60",
"0x21a31ee1afc51d94c2efccaa2092ad1028285549"
]
const BNB_ADDRS = [
"0xbe0eb53f46cd790cd13851d5eff43d12404d33e8",
"0xf977814e90da44bfa03b6295a0616a897441acec"
]
const providerUrl = "https://eth-rpc.gateway.pokt.network"
function encodeData() {
let res: Array<any> = [];
for (let i = 0; i < ETH_ADDRS.length; i++) {
let addr = ETH_ADDRS[i]
let calldata = inf.encodeFunctionData("getETHBalance", [addr])
res.push([Getter, calldata])
}
for (let i = 0; i < USDC_ADDRS.length; i++) {
let addr = USDC_ADDRS[i]
let calldata = inf.encodeFunctionData("balanceOf", [addr])
res.push([USDC, calldata])
}
for (let i = 0; i < USDT_ADDRS.length; i++) {
let addr = USDT_ADDRS[i]
let calldata = inf.encodeFunctionData("balanceOf", [addr])
res.push([USDT, calldata])
}
for (let i = 0; i < BUSD_ADDRS.length; i++) {
let addr = BUSD_ADDRS[i]
let calldata = inf.encodeFunctionData("balanceOf", [addr])
res.push([BUSD, calldata])
}
for (let i = 0; i < BNB_ADDRS.length; i++) {
let addr = BNB_ADDRS[i]
let calldata = inf.encodeFunctionData("balanceOf", [addr])
res.push([BNB, calldata])
}
return res;
}
function decodeData(returnData: any) {
let res: Array<BinanceInfo> = []
let offset = 0
for (let i = 0; i < ETH_ADDRS.length; i++) {
let index = i + offset;
let addr = ETH_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("getETHBalance", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "ETH",
"chain": "ETH"
})
}
// console.log(res)
offset += ETH_ADDRS.length;
for (let i = 0; i < USDC_ADDRS.length; i++) {
let index = i + offset;
let addr = USDC_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 6,
"symbol": "USDC",
"chain": "ETH"
})
}
offset += USDC_ADDRS.length;
for (let i = 0; i < USDT_ADDRS.length; i++) {
let index = i + offset;
let addr = USDT_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 6,
"symbol": "USDT",
"chain": "ETH"
})
}
offset += USDT_ADDRS.length;
for (let i = 0; i < BUSD_ADDRS.length; i++) {
let index = i + offset;
let addr = BUSD_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BUSD",
"chain": "ETH"
})
}
offset += BUSD_ADDRS.length;
for (let i = 0; i < BNB_ADDRS.length; i++) {
let index = i + offset;
let addr = BNB_ADDRS[i]
let returndata = returnData[index];
let amount = inf.decodeFunctionResult("balanceOf", returndata)
res.push({
"account": addr,
"balance": amount[0].toString(),
"decimals": 18,
"symbol": "BNB",
"chain": "ETH"
})
}
return res;
}
export async function getEth() {
let connection = { "url": providerUrl, "timeout": 120000 }
let provider = new ethers.providers.JsonRpcProvider(connection)
const multicall = new ethers.Contract(multicallAddr, abi, provider)
let data = encodeData();
console.log(data)
let resCall = await multicall.functions.aggregate(data);
console.log(resCall.returnData)
let blockNumber = resCall.blockNumber
let res = decodeData(resCall.returnData)
console.log(res)
// console.log(blockNumber)
return res;
}
// getEth()

@ -1,53 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendMessage = void 0;
function sendMessage(last, delta) {
return __awaiter(this, void 0, void 0, function* () {
const url = "https://events.pagerduty.com/v2/enqueue";
const payload = {
"payload": {
"summary": "FTT 报警推送",
"severity": "info",
"component": "postgres",
"group": "prod-datapipe",
"class": "deploy",
"source": "api-server",
"custom_details": {
"content": {
"msg": "FTT价格异动: last: " + last + " delta: " + delta
},
"err": "no"
}
},
"routing_key": "473f1e095163480cd0017acb5febfaa4",
"event_action": "trigger",
"links": [
{
"href": "https://etherscan.io/address/0xa190e4add711e463b1e5d8f42bcf3a242cc45720",
"text": "https://etherscan.io/address/0xa190e4add711e463b1e5d8f42bcf3a242cc45720"
}
]
};
console.log(payload);
// let response = await fetch(url, {
// method: 'POST', // *GET, POST, PUT, DELETE, etc.
// headers: {
// 'Content-Type': 'application/json'
// },
// redirect: 'follow', // manual, *follow, error
// body: JSON.stringify(payload) // body data type must match "Content-Type" header
// })
// console.log(response)
});
}
exports.sendMessage = sendMessage;
// sendMessage();

@ -1,40 +0,0 @@
import fetch from 'node-fetch';
export async function sendMessage(last: number, delta: number) {
const url: string = "https://events.pagerduty.com/v2/enqueue"
const payload = {
"payload": {
"summary": "FTT 报警推送",
"severity": "info",
"component": "postgres",
"group": "prod-datapipe",
"class": "deploy",
"source": "api-server",
"custom_details": {
"content": {
"msg": "FTT价格异动: last: " + last + " delta: " + delta
},
"err": "no"
}
},
"routing_key": "473f1e095163480cd0017acb5febfaa4",
"event_action": "trigger",
"links": [
{
"href": "https://etherscan.io/address/0xa190e4add711e463b1e5d8f42bcf3a242cc45720",
"text": "https://etherscan.io/address/0xa190e4add711e463b1e5d8f42bcf3a242cc45720"
}
]
};
console.log(payload)
// let response = await fetch(url, {
// method: 'POST', // *GET, POST, PUT, DELETE, etc.
// headers: {
// 'Content-Type': 'application/json'
// },
// redirect: 'follow', // manual, *follow, error
// body: JSON.stringify(payload) // body data type must match "Content-Type" header
// })
// console.log(response)
}
// sendMessage();

@ -1,79 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const bnb_1 = require("./bnb");
const bsc_1 = require("./bsc");
const btc_1 = require("./btc");
const dbWriter_1 = require("./dbWriter");
const eth_1 = require("./eth");
const trx_1 = require("./trx");
const types_1 = require("./types");
require("log-timestamp");
function runEth(dbWriter) {
return __awaiter(this, void 0, void 0, function* () {
let resEth = yield (0, eth_1.getEth)();
let resEthToDb = (0, types_1.parseBatch)(resEth);
yield dbWriter.writeAll(resEthToDb);
});
}
function runBtc(dbWriter) {
return __awaiter(this, void 0, void 0, function* () {
let resBtc = yield (0, btc_1.getBtc)();
let resBtcToDb = (0, types_1.parseBatch)(resBtc);
yield dbWriter.writeAll(resBtcToDb);
});
}
function runTrx(dbWriter) {
return __awaiter(this, void 0, void 0, function* () {
let resTrx = yield (0, trx_1.getTrx)();
let resTrxToDb = (0, types_1.parseBatch)(resTrx);
yield dbWriter.writeAll(resTrxToDb);
});
}
function runBnb(dbWriter) {
return __awaiter(this, void 0, void 0, function* () {
let resBnb = yield (0, bnb_1.getBnb)();
let resBnbToDb = (0, types_1.parseBatch)(resBnb);
yield dbWriter.writeAll(resBnbToDb);
});
}
function runBsc(dbWriter) {
return __awaiter(this, void 0, void 0, function* () {
let resBsc = yield (0, bsc_1.getBsc)();
let resBscToDb = (0, types_1.parseBatch)(resBsc);
yield dbWriter.writeAll(resBscToDb);
});
}
const SLEEP_TIME = 100000;
function main() {
return __awaiter(this, void 0, void 0, function* () {
let trxDb = new dbWriter_1.DbWriter(types_1.connectionInfo, types_1.TRX_TABLE_NAME, "TRX", types_1.GLOBAL_PARAMS_TABLE);
let ethDb = new dbWriter_1.DbWriter(types_1.connectionInfo, types_1.ETH_TABLE_NAME, "ETH", types_1.GLOBAL_PARAMS_TABLE);
let btcDb = new dbWriter_1.DbWriter(types_1.connectionInfo, types_1.BTC_TABLE_NAME, "BTC", types_1.GLOBAL_PARAMS_TABLE);
let bscDb = new dbWriter_1.DbWriter(types_1.connectionInfo, types_1.BSC_TABLE_NAME, "BSC", types_1.GLOBAL_PARAMS_TABLE);
let bnbDb = new dbWriter_1.DbWriter(types_1.connectionInfo, types_1.BNB_TABLE_NAME, "BNB", types_1.GLOBAL_PARAMS_TABLE);
while (true) {
yield runEth(ethDb);
yield runBsc(bscDb);
yield runTrx(trxDb);
yield runBnb(bnbDb);
yield runBtc(btcDb);
yield sleep(SLEEP_TIME);
}
});
}
main().catch((e) => {
console.error(e);
process.exit(1);
});
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

@ -1,63 +0,0 @@
import dayjs from 'dayjs';
import { getBnb } from './bnb';
import { getBsc } from './bsc';
import { getBtc } from './btc';
import { DbWriter } from './dbWriter';
import { getEth } from './eth';
import { getTrx } from './trx';
import { BNB_TABLE_NAME, BSC_TABLE_NAME, BTC_TABLE_NAME, connectionInfo, ETH_TABLE_NAME, GLOBAL_PARAMS_TABLE, parseBatch, TRX_TABLE_NAME } from './types';
require("log-timestamp")
async function runEth(dbWriter: DbWriter) {
let resEth = await getEth();
let resEthToDb = parseBatch(resEth)
await dbWriter.writeAll(resEthToDb)
}
async function runBtc(dbWriter: DbWriter) {
let resBtc = await getBtc();
let resBtcToDb = parseBatch(resBtc)
await dbWriter.writeAll(resBtcToDb)
}
async function runTrx(dbWriter: DbWriter) {
let resTrx = await getTrx();
let resTrxToDb = parseBatch(resTrx)
await dbWriter.writeAll(resTrxToDb)
}
async function runBnb(dbWriter: DbWriter) {
let resBnb = await getBnb();
let resBnbToDb = parseBatch(resBnb)
await dbWriter.writeAll(resBnbToDb)
}
async function runBsc(dbWriter: DbWriter) {
let resBsc = await getBsc();
let resBscToDb = parseBatch(resBsc)
await dbWriter.writeAll(resBscToDb)
}
const SLEEP_TIME = 100000
async function main() {
let trxDb = new DbWriter(connectionInfo, TRX_TABLE_NAME, "TRX", GLOBAL_PARAMS_TABLE)
let ethDb = new DbWriter(connectionInfo, ETH_TABLE_NAME, "ETH", GLOBAL_PARAMS_TABLE)
let btcDb = new DbWriter(connectionInfo, BTC_TABLE_NAME, "BTC", GLOBAL_PARAMS_TABLE)
let bscDb = new DbWriter(connectionInfo, BSC_TABLE_NAME, "BSC", GLOBAL_PARAMS_TABLE)
let bnbDb = new DbWriter(connectionInfo, BNB_TABLE_NAME, "BNB", GLOBAL_PARAMS_TABLE)
while (true) {
await runEth(ethDb)
await runBsc(bscDb)
await runTrx(trxDb)
await runBnb(bnbDb)
await runBtc(btcDb)
await sleep(SLEEP_TIME)
}
}
main().catch((e) => {
console.error(e)
process.exit(1)
})
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}

@ -1,42 +0,0 @@
{
"name": "ethernaut-x-foundry-main",
"version": "1.0.0",
"description": "初始化的一个Foundry玩CTF项目模板,感觉还是很不错的",
"main": "N",
"directories": {
"lib": "lib"
},
"scripts": {
"prettier": "prettier --write 'src/**/*.sol'",
"prettier:list": "prettier --list-different 'src/**/*.sol'",
"prettier:check": "prettier --check 'src/**/*.sol'",
"solhint": "solhint --config ./.solhint.json 'src/**/*.sol' --fix",
"solhint:check": "solhint --config ./.solhint.json 'src/**/*.sol'",
"lint": "npm run prettier && npm run solhint",
"lint:check": "npm run prettier:check && npm run solhint:check"
},
"devDependencies": {
"@types/node": "^18.8.2",
"@types/node-fetch": "^2.6.2",
"node-fetch": "^2.6.7",
"prettier": "^2.5.1",
"prettier-plugin-solidity": "^1.0.0-beta.19",
"solhint": "^3.3.6"
},
"homepage": "https://github.com/bixia/ethernaut-x-foundry-main#readme",
"dependencies": {
"@node-real/web3": "^1.0.8",
"@shazow/whatsabi": "^0.2.1",
"bitcoin": "^3.0.3",
"dayjs": "^1.11.5",
"dotenv": "16.0.3",
"ethers": "^5.4.0",
"log-timestamp": "^0.3.0",
"mysql": "^2.18.1",
"mysql2": "^2.3.3",
"node-fetch-with-proxy": "^0.1.6",
"sequelize": "^6.25.8",
"tronweb": "^4.4.0",
"ts-node": "10.9.1"
}
}

@ -1,222 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Process = void 0;
const dayjs_1 = __importDefault(require("dayjs"));
const alarmer_1 = require("./alarmer");
const dbWriter_1 = require("./dbWriter");
const types_1 = require("./types");
require("log-timestamp");
const step = [0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1];
function getIndex(delta) {
for (let i = 1; i < step.length; i++) {
let cur = step[i];
if (delta > cur)
return i - 1;
}
return 0;
}
function judge(globalIndex, delta) {
let curIndex = getIndex(delta);
if (globalIndex < curIndex) {
globalIndex = curIndex;
return { globalIndex: globalIndex, shouldTrigger: true };
}
return { globalIndex: globalIndex, shouldTrigger: false };
}
function calSum(infos) {
let res = 0;
for (let i = 0; i < infos.length; i++) {
res += infos[i].balance;
}
return res;
}
function getFirstTodayTimestamp(infos) {
let res = 0;
for (let i = 0; i < infos.length; i++) {
if (res < infos[i].timestamp)
res = infos[i].timestamp;
}
return res;
}
class Process {
constructor(symbol, chains) {
this.chains = [];
this.dbWriters = [];
this.globalIndex = 0;
this.globalIndex2 = 0;
this.firstTodayTimestamp = 0;
this.symbol = symbol;
this.chains = chains;
this.info = { "symbol": this.symbol, "curr": [], "last": [], "firstToday": [] };
this.dbGloabl = new dbWriter_1.DbWriter2(types_1.connectionInfo);
for (let i = 0; i < chains.length; i++) {
let tableName = (0, types_1.getTableNameByChain)(chains[i]);
let dbWriter = new dbWriter_1.DbWriter(types_1.connectionInfo, tableName, chains[i], types_1.GLOBAL_PARAMS_TABLE);
this.dbWriters.push(dbWriter);
}
}
getData() {
return __awaiter(this, void 0, void 0, function* () {
this.info = { "symbol": this.symbol, "curr": [], "last": [], "firstToday": [] };
for (let i = 0; i < this.dbWriters.length; i++) {
let dbwriter = this.dbWriters[i];
this.info.curr.push(yield dbwriter.getCurrSumBySymbol(this.symbol));
this.info.last.push(yield dbwriter.getLastReportSumBySymbol(this.symbol));
this.info.firstToday.push(yield dbwriter.getFirstTodaySumBySymbol(this.symbol));
}
let firstTodayTimestamp = getFirstTodayTimestamp(this.info.firstToday);
if (this.firstTodayTimestamp < firstTodayTimestamp) {
this.firstTodayTimestamp = firstTodayTimestamp;
this.globalIndex = 0;
console.log(this.symbol, " reset global index to 0");
}
return this.info;
});
}
judgeToday() {
let curr = calSum(this.info.curr);
let firstToday = calSum(this.info.firstToday);
let globalIndex = this.globalIndex;
if (curr == 0 || firstToday == 0)
return false;
let delta = (curr - firstToday) / firstToday;
let shouldTrigger = judge(globalIndex, delta).shouldTrigger;
this.globalIndex = judge(globalIndex, delta).globalIndex;
return shouldTrigger;
}
judgeLast() {
let curr = calSum(this.info.curr);
let last = calSum(this.info.last);
let globalIndex2 = this.globalIndex2;
if (curr == 0 || last == 0)
return false;
let delta = (curr - last) / last;
let shouldTrigger = judge(globalIndex2, delta).shouldTrigger;
this.globalIndex2 = judge(globalIndex2, delta).globalIndex;
return shouldTrigger;
}
updateGlobalParamsTable(type) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
let globalParams = [];
let suffix = "_Last_Timestamp";
for (let i = 0; i < this.info.curr.length; i++) {
let params = {
'keyStr': `${this.chains[i]}_${this.symbol}_${suffix}`,
'valueInt': (_a = this.info.curr[i].timestamp) !== null && _a !== void 0 ? _a : 0,
'valueString': type,
'timestamp': (0, dayjs_1.default)().unix()
};
globalParams.push(params);
}
yield this.dbGloabl.writeAll(globalParams);
});
}
sendMessage(rule) {
return __awaiter(this, void 0, void 0, function* () {
console.log(this.globalIndex);
console.log(this.globalIndex2);
console.log("triggerred");
let curr = calSum(this.info.curr);
let firstToday = calSum(this.info.firstToday);
let last = calSum(this.info.last);
let delta1 = (curr - firstToday) / firstToday;
let delta2 = (curr - last) / last;
let params = {
"chain": this.chains,
"token": this.symbol,
"rule": rule,
"datetime": (0, dayjs_1.default)().format("YYYY-MM-DD HH:mm:ssZ[Z]").toString(),
"alarmInfo": {
curr: curr,
last: last,
firstToday: firstToday,
delta1: delta1,
delta2: delta2,
detail: JSON.stringify(this.info)
}
};
yield (0, alarmer_1.send)(params);
});
}
triggerToday() {
return __awaiter(this, void 0, void 0, function* () {
yield this.updateGlobalParamsTable("COMPARE_TO_FIRST_TODAY");
yield this.sendMessage("COMPARE_TO_TODAY");
});
}
triggerLast() {
return __awaiter(this, void 0, void 0, function* () {
this.globalIndex2 = 0;
yield this.updateGlobalParamsTable("COMPARE_TO_LAST");
yield this.sendMessage("COMPARE_TO_LAST");
});
}
}
exports.Process = Process;
function start(process) {
return __awaiter(this, void 0, void 0, function* () {
let info = yield process.getData();
console.log(info);
let shouldTriggerToday = process.judgeToday();
let shouldTriggerLast = process.judgeLast();
console.log("global index today", process.globalIndex);
console.log("global index last", process.globalIndex2);
console.log(shouldTriggerToday);
console.log(shouldTriggerLast);
if (shouldTriggerToday) {
yield process.triggerToday();
}
if (shouldTriggerLast) {
yield process.triggerLast();
}
});
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function main() {
return __awaiter(this, void 0, void 0, function* () {
let bnbProcess = new Process("BNB", ["ETH", "BSC", "BNB"]);
let ethProcess = new Process("ETH", ["ETH"]);
let usdcProcess = new Process("USDC", ["TRX", "ETH"]);
let usdtProcess = new Process("USDT", ["TRX", "ETH"]);
let btcProcess = new Process("BTC", ["BTC"]);
let busdProcess = new Process("BUSD", ["ETH"]);
while (true) {
yield sleep(10000);
yield start(bnbProcess);
yield start(ethProcess);
yield start(usdcProcess);
yield start(usdtProcess);
yield start(btcProcess);
yield start(busdProcess);
}
});
}
main().catch((e) => {
console.error(e);
process.exit(1);
});
// async function test() {
// let process = new Process("BNB", ["ETH", "BSC", "BNB"]);
// let info = await process.getData()
// console.log(info)
// let judge1 = process.judgeLast();
// let judge2 = process.judgeToday();
// await process.triggerToday();
// // await process.sendMessage("COMPARE_TO_TODAY")
// }
// test()

@ -1,211 +0,0 @@
import dayjs from "dayjs";
import { send } from "./alarmer";
import { DbWriter, DbWriter2 } from "./dbWriter";
import { sendMessage } from "./helper";
import { AlamerParams, CHAIN, connectionInfo, DataInfo, DbParams2, getTableNameByChain, GLOBAL_PARAMS_TABLE, RULE, SUFFIX, SumInfo, SYMBOL } from "./types";
require("log-timestamp")
const step = [0, -0.1, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -1]
function getIndex(delta: number) {
for (let i = 1; i < step.length; i++) {
let cur = step[i]
if (delta > cur) return i - 1
}
return 0
}
function judge(globalIndex: number, delta: number) {
let curIndex = getIndex(delta)
if (globalIndex < curIndex) {
globalIndex = curIndex
return { globalIndex: globalIndex, shouldTrigger: true }
}
return { globalIndex: globalIndex, shouldTrigger: false }
}
function calSum(infos: SumInfo[]): number {
let res = 0
for (let i = 0; i < infos.length; i++) {
res += infos[i].balance
}
return res
}
function getFirstTodayTimestamp(infos: SumInfo[]): number {
let res = 0
for (let i = 0; i < infos.length; i++) {
if (res < infos[i].timestamp) res = infos[i].timestamp
}
return res
}
export class Process {
symbol: SYMBOL;
chains: CHAIN[] = [];
dbWriters: DbWriter[] = [];
alamer: any;
info: DataInfo;
globalIndex = 0;
globalIndex2 = 0;
dbGloabl: DbWriter2;
firstTodayTimestamp: number = 0;
constructor(symbol: SYMBOL, chains: CHAIN[]) {
this.symbol = symbol
this.chains = chains
this.info = { "symbol": this.symbol, "curr": [], "last": [], "firstToday": [] }
this.dbGloabl = new DbWriter2(connectionInfo)
for (let i = 0; i < chains.length; i++) {
let tableName = getTableNameByChain(chains[i])
let dbWriter = new DbWriter(connectionInfo, tableName, chains[i], GLOBAL_PARAMS_TABLE)
this.dbWriters.push(dbWriter)
}
}
async getData() {
this.info = { "symbol": this.symbol, "curr": [], "last": [], "firstToday": [] }
for (let i = 0; i < this.dbWriters.length; i++) {
let dbwriter = this.dbWriters[i]
this.info.curr.push(await dbwriter.getCurrSumBySymbol(this.symbol))
this.info.last.push(await dbwriter.getLastReportSumBySymbol(this.symbol))
this.info.firstToday.push(await dbwriter.getFirstTodaySumBySymbol(this.symbol))
}
let firstTodayTimestamp = getFirstTodayTimestamp(this.info.firstToday)
if (this.firstTodayTimestamp < firstTodayTimestamp) {
this.firstTodayTimestamp = firstTodayTimestamp
this.globalIndex = 0
console.log(this.symbol, " reset global index to 0")
}
return this.info
}
judgeToday(): boolean {
let curr = calSum(this.info.curr)
let firstToday = calSum(this.info.firstToday)
let globalIndex = this.globalIndex
if (curr == 0 || firstToday == 0) return false;
let delta = (curr - firstToday) / firstToday
let shouldTrigger = judge(globalIndex, delta).shouldTrigger
this.globalIndex = judge(globalIndex, delta).globalIndex
return shouldTrigger
}
judgeLast(): boolean {
let curr = calSum(this.info.curr)
let last = calSum(this.info.last)
let globalIndex2 = this.globalIndex2
if (curr == 0 || last == 0) return false;
let delta = (curr - last) / last
let shouldTrigger = judge(globalIndex2, delta).shouldTrigger
this.globalIndex2 = judge(globalIndex2, delta).globalIndex
return shouldTrigger
}
async updateGlobalParamsTable(type: string) {
let globalParams: DbParams2[] = []
let suffix: SUFFIX = "_Last_Timestamp"
for (let i = 0; i < this.info.curr.length; i++) {
let params: DbParams2 = {
'keyStr': `${this.chains[i]}_${this.symbol}_${suffix}`,
'valueInt': this.info.curr[i].timestamp ?? 0,
'valueString': type,
'timestamp': dayjs().unix()
}
globalParams.push(params)
}
await this.dbGloabl.writeAll(globalParams)
}
async sendMessage(rule: RULE) {
console.log(this.globalIndex)
console.log(this.globalIndex2)
console.log("triggerred");
let curr = calSum(this.info.curr)
let firstToday = calSum(this.info.firstToday)
let last = calSum(this.info.last)
let delta1 = (curr - firstToday) / firstToday
let delta2 = (curr - last) / last
let params: AlamerParams = {
"chain": this.chains,
"token": this.symbol,
"rule": rule,
"datetime": dayjs().format("YYYY-MM-DD HH:mm:ssZ[Z]").toString(),
"alarmInfo": {
curr: curr,
last: last,
firstToday: firstToday,
delta1: delta1,
delta2: delta2,
detail: JSON.stringify(this.info)
}
}
await send(params)
}
async triggerToday() {
await this.updateGlobalParamsTable("COMPARE_TO_FIRST_TODAY")
await this.sendMessage("COMPARE_TO_TODAY")
}
async triggerLast() {
this.globalIndex2 = 0
await this.updateGlobalParamsTable("COMPARE_TO_LAST")
await this.sendMessage("COMPARE_TO_LAST")
}
}
async function start(process: Process) {
let info = await process.getData()
console.log(info)
let shouldTriggerToday = process.judgeToday();
let shouldTriggerLast = process.judgeLast();
console.log("global index today", process.globalIndex)
console.log("global index last", process.globalIndex2)
console.log(shouldTriggerToday)
console.log(shouldTriggerLast)
if (shouldTriggerToday) {
await process.triggerToday()
}
if (shouldTriggerLast) {
await process.triggerLast()
}
}
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
let bnbProcess: Process = new Process("BNB", ["ETH", "BSC", "BNB"]);
let ethProcess: Process = new Process("ETH", ["ETH"])
let usdcProcess: Process = new Process("USDC", ["TRX", "ETH"]);
let usdtProcess: Process = new Process("USDT", ["TRX", "ETH"])
let btcProcess: Process = new Process("BTC", ["BTC"]);
let busdProcess: Process = new Process("BUSD", ["ETH"]);
while (true) {
await sleep(10000)
await start(bnbProcess)
await start(ethProcess)
await start(usdcProcess)
await start(usdtProcess)
await start(btcProcess)
await start(busdProcess)
}
}
main().catch((e) => {
console.error(e)
process.exit(1)
})
// async function test() {
// let process = new Process("BNB", ["ETH", "BSC", "BNB"]);
// let info = await process.getData()
// console.log(info)
// let judge1 = process.judgeLast();
// let judge2 = process.judgeToday();
// await process.triggerToday();
// // await process.sendMessage("COMPARE_TO_TODAY")
// }
// test()

@ -1,188 +0,0 @@
-- Active: 1660702011366@@47.74.235.176@3206@binance
-- DROP TABLE IF EXISTS `binance_info`;
-- CREATE TABLE
-- `binance_info` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `chain` varchar(255) NOT NULL,
-- `roundId` INTEGER NOT NULL,
-- `symbol` varchar(255),
-- `decimals` integer,
-- `balance` varchar(255),
-- `account` varchar(255),
-- `amount` BIGINT,
-- `day` TIMESTAMP,
-- `createdAt` DATETIME,
-- `updatedAt` DATETIME,
-- PRIMARY KEY (`id`)
-- );
drop table
if EXISTS `record_balance_ethereum_binance_wallet_balance`;
CREATE TABLE
`record_balance_ethereum_binance_wallet_balance` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`pool_address` varchar(255) NOT NULL COMMENT '资产池合约地址',
`token_address` varchar(255) NOT NULL COMMENT '通证合约地址',
`balance` decimal(50, 20) NOT NULL COMMENT '持有数量',
`chain_id` int NOT NULL COMMENT '链id',
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`pool_address`,
`token_address`,
`create_time`
) USING BTREE COMMENT '通证+资产池+时间全局唯一索引'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
drop table
if EXISTS `record_balance_bitcoin_binance_wallet_balance`;
CREATE TABLE
`record_balance_bitcoin_binance_wallet_balance` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`pool_address` varchar(255) NOT NULL COMMENT '资产池合约地址',
`token_address` varchar(255) NOT NULL COMMENT '通证合约地址',
`balance` decimal(50, 20) NOT NULL COMMENT '持有数量',
`chain_id` int NOT NULL COMMENT '链id',
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`pool_address`,
`token_address`,
`create_time`
) USING BTREE COMMENT '通证+资产池+时间全局唯一索引'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
drop table if EXISTS `record_balance_trx_binance_wallet_balance`;
CREATE TABLE
`record_balance_trx_binance_wallet_balance` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`pool_address` varchar(255) NOT NULL COMMENT '资产池合约地址',
`token_address` varchar(255) NOT NULL COMMENT '通证合约地址',
`balance` decimal(50, 20) NOT NULL COMMENT '持有数量',
`chain_id` int NOT NULL COMMENT '链id',
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`pool_address`,
`token_address`,
`create_time`
) USING BTREE COMMENT '通证+资产池+时间全局唯一索引'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
drop table if EXISTS `record_balance_bnb_binance_wallet_balance`;
CREATE TABLE
`record_balance_bnb_binance_wallet_balance` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`pool_address` varchar(255) NOT NULL COMMENT '资产池合约地址',
`token_address` varchar(255) NOT NULL COMMENT '通证合约地址',
`balance` decimal(50, 20) NOT NULL COMMENT '持有数量',
`chain_id` int NOT NULL COMMENT '链id',
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`pool_address`,
`token_address`,
`create_time`
) USING BTREE COMMENT '通证+资产池+时间全局唯一索引'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
drop table if EXISTS `record_balance_bsc_binance_wallet_balance`;
CREATE TABLE
`record_balance_bsc_binance_wallet_balance` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`pool_address` varchar(255) NOT NULL COMMENT '资产池合约地址',
`token_address` varchar(255) NOT NULL COMMENT '通证合约地址',
`balance` decimal(50, 20) NOT NULL COMMENT '持有数量',
`chain_id` int NOT NULL COMMENT '链id',
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`pool_address`,
`token_address`,
`create_time`
) USING BTREE COMMENT '通证+资产池+时间全局唯一索引'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
DROP table if EXISTS global_params;
create table
`global_params` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`keyStr` varchar(255) NOT NULL,
`valueString` varchar(255) NOT NULL DEFAULT '',
`valueInt` BIGINT NOT NULL,
`timestamp` int NOT NULL COMMENT '时间戳',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `balance_idx` (
`keyStr`,
`valueInt`,
`valueString`
) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
SELECT sum(balance)
FROM
record_balance_ethereum_binance_wallet_balance AS a
WHERE
token_address = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
and timestamp = (
SELECT TIMESTAMP
FROM
record_balance_ethereum_binance_wallet_balance
ORDER BY
TIMESTAMP DESC
LIMIT 1
)
SELECT sum(balance)
FROM
record_balance_ethereum_binance_wallet_balance AS a
WHERE
token_address = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
and timestamp = (
SELECT TIMESTAMP
FROM
record_balance_ethereum_binance_wallet_balance
where
Date(now()) = Date(FROM_UNIXTIME(timestamp))
ORDER BY TIMESTAMP
LIMIT 1
)
select value
from global_params
where
key = 'ETH_Last_Timestamp'
order by timestamp desc
limit 1

@ -1,85 +0,0 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTrx = void 0;
const TronWeb = require('tronweb');
const tronWeb = new TronWeb({
fullHost: 'https://api.trongrid.io/',
headers: { "TRON-PRO-API-KEY": '3b166d2d-80cd-4e64-9151-037cf1cda7d1', 'Content-Type': 'application/json' },
privateKey: '3481E79956D4BD95F358AC96D151C976392FC4E3FC132F78A847906DE588C145'
});
const USDC_ADDRS = [
"TV6MuMXfmLbBqPZvBHdwFsDnQeVfnmiuSi"
];
const USDC = "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8";
const USDT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
const USDT_ADDRS = ["TMuA6YqfCeX8EhbfYEg5y7S4DqzSJireY9",
"TWd4WrZ9wn84f5x1hZhL4DHvk738ns5jwb",
"TV6MuMXfmLbBqPZvBHdwFsDnQeVfnmiuSi",
"TJDENsfBJs4RFETt1X1W8wMDc8M5XnJhCe",
"TAzsQ9Gx8eqFNFSKbeXrbi45CuVPHzA8wr",
"TQrY8tryqsYVCYS3MFbtffiPp2ccyn4STm",
"TNXoiAJ3dct8Fjg4M9fkLFh9S2v9TXc32G",
"TYASr5UV6HEcXatwdFQfmLVUqQQQMUxHLS"];
function getTrx() {
return __awaiter(this, void 0, void 0, function* () {
let entry = [{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}];
const contract = tronWeb.contract(entry, USDT);
let res = [];
for (let i = 0; i < USDT_ADDRS.length; i++) {
let ACCOUNT = USDT_ADDRS[i];
let balance = yield contract.methods.balanceOf(ACCOUNT).call();
// console.log("account", ACCOUNT, " balance ", balance.div(PRECISION).toString())
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 6,
"symbol": "USDT",
"chain": "TRX"
});
}
let contract2 = tronWeb.contract(entry, USDC);
for (let i = 0; i < USDC_ADDRS.length; i++) {
let ACCOUNT = USDC_ADDRS[i];
let balance = yield contract2.methods.balanceOf(ACCOUNT).call();
// console.log("account", ACCOUNT, " balance ", balance.div(PRECISION).toString())
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 6,
"symbol": "USDC",
"chain": "TRX"
});
}
console.log(res);
return res;
});
}
exports.getTrx = getTrx;
// getTrx()

@ -1,85 +0,0 @@
import { BinanceInfo } from "./types";
import { BigNumber } from 'ethers';
const TronWeb = require('tronweb');
const tronWeb = new TronWeb({
fullHost: 'https://api.trongrid.io/',
headers: { "TRON-PRO-API-KEY": '3b166d2d-80cd-4e64-9151-037cf1cda7d1', 'Content-Type': 'application/json' },
privateKey: '3481E79956D4BD95F358AC96D151C976392FC4E3FC132F78A847906DE588C145'
});
const USDC_ADDRS = [
"TV6MuMXfmLbBqPZvBHdwFsDnQeVfnmiuSi"
]
const USDC = "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8"
const USDT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
const USDT_ADDRS = ["TMuA6YqfCeX8EhbfYEg5y7S4DqzSJireY9",
"TWd4WrZ9wn84f5x1hZhL4DHvk738ns5jwb",
"TV6MuMXfmLbBqPZvBHdwFsDnQeVfnmiuSi",
"TJDENsfBJs4RFETt1X1W8wMDc8M5XnJhCe",
"TAzsQ9Gx8eqFNFSKbeXrbi45CuVPHzA8wr",
"TQrY8tryqsYVCYS3MFbtffiPp2ccyn4STm",
"TNXoiAJ3dct8Fjg4M9fkLFh9S2v9TXc32G",
"TYASr5UV6HEcXatwdFQfmLVUqQQQMUxHLS"]
export async function getTrx() {
let entry = [{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}]
const contract = tronWeb.contract(entry, USDT);
let res: Array<BinanceInfo> = []
for (let i = 0; i < USDT_ADDRS.length; i++) {
let ACCOUNT = USDT_ADDRS[i]
let balance = await contract.methods.balanceOf(ACCOUNT).call();
// console.log("account", ACCOUNT, " balance ", balance.div(PRECISION).toString())
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 6,
"symbol": "USDT",
"chain": "TRX"
})
}
let contract2 = tronWeb.contract(entry, USDC);
for (let i = 0; i < USDC_ADDRS.length; i++) {
let ACCOUNT = USDC_ADDRS[i]
let balance = await contract2.methods.balanceOf(ACCOUNT).call();
// console.log("account", ACCOUNT, " balance ", balance.div(PRECISION).toString())
res.push({
"account": ACCOUNT,
"balance": balance.toString(),
"decimals": 6,
"symbol": "USDC",
"chain": "TRX"
})
}
console.log(res)
return res
}
// getTrx()

@ -1,101 +0,0 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Projects */
// "incremental": true, /* Enable incremental compilation */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "resolveJsonModule": true, /* Enable importing .json files */
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
// "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}

@ -1,89 +0,0 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTableNameByChain = exports.symbolToAddrByChain = exports.chainToChainId = exports.parseBatch = exports.parseBinanceInfoToDb = exports.ETH_ETH = exports.ETH_BNB = exports.ETH_BUSD = exports.ETH_USDC = exports.ETH_USDT = exports.TRX_USDC = exports.TRX_USDT = exports.BSC_BNB = exports.BNB_BNB = exports.BTC = exports.BSC_TABLE_NAME = exports.BNB_TABLE_NAME = exports.TRX_TABLE_NAME = exports.BTC_TABLE_NAME = exports.ETH_TABLE_NAME = exports.GLOBAL_PARAMS_TABLE = exports.connectionInfo = void 0;
const dayjs_1 = __importDefault(require("dayjs"));
const ethers_1 = require("ethers");
// export const connectionInfo: string = 'mysql://root:admin123@localhost:3306/monitor';
// export const connectionInfo: string = 'mysql://root:admin123@localhost:3306/binance';
exports.connectionInfo = 'mysql://root:123456@47.74.235.176:3206/binance';
exports.GLOBAL_PARAMS_TABLE = 'global_params';
exports.ETH_TABLE_NAME = "record_balance_ethereum_binance_wallet_balance";
exports.BTC_TABLE_NAME = "record_balance_bitcoin_binance_wallet_balance";
exports.TRX_TABLE_NAME = "record_balance_trx_binance_wallet_balance";
exports.BNB_TABLE_NAME = "record_balance_bnb_binance_wallet_balance";
exports.BSC_TABLE_NAME = "record_balance_bsc_binance_wallet_balance";
exports.BTC = "BTC";
exports.BNB_BNB = "BNB_BNB";
exports.BSC_BNB = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c";
exports.TRX_USDT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
exports.TRX_USDC = "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8";
exports.ETH_USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
exports.ETH_USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
exports.ETH_BUSD = "0x4Fabb145d64652a948d72533023f6E7A623C7C53";
exports.ETH_BNB = "0xB8c77482e45F1F44dE1745F52C74426C631bDD52";
exports.ETH_ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
function parseBinanceInfoToDb(info) {
let precision = ethers_1.BigNumber.from(10).pow(info.decimals);
let db = {
"pool_address": info.account,
"token_address": symbolToAddrByChain(info.symbol, info.chain),
"balance": ethers_1.BigNumber.from(info.balance).div(precision).toNumber(),
"chain_id": chainToChainId(info.chain),
"timestamp": (0, dayjs_1.default)().unix()
};
return db;
}
exports.parseBinanceInfoToDb = parseBinanceInfoToDb;
function parseBatch(infos) {
let res = [];
for (let i = 0; i < infos.length; i++) {
res.push(parseBinanceInfoToDb(infos[i]));
}
return res;
}
exports.parseBatch = parseBatch;
function chainToChainId(chain) {
switch (chain) {
case "BSC":
return 56;
case "ETH":
return 1;
case "BTC":
return -1;
case "TRX":
return -2;
case "BNB":
return -3;
}
}
exports.chainToChainId = chainToChainId;
function symbolToAddrByChain(symbol, chain) {
switch (true) {
case ((chain === "BTC")): return exports.BTC;
case ((chain === "BNB")): return exports.BNB_BNB;
case ((chain === "BSC")): return exports.BSC_BNB;
case ((chain === "TRX") && (symbol === "USDT")): return exports.TRX_USDT;
case ((chain === "TRX") && (symbol === "USDC")): return exports.TRX_USDC;
case ((chain === "ETH") && (symbol === "USDT")): return exports.ETH_USDT;
case ((chain === "ETH") && (symbol === "USDC")): return exports.ETH_USDC;
case ((chain === "ETH") && (symbol === "ETH")): return exports.ETH_ETH;
case ((chain === "ETH") && (symbol === "BUSD")): return exports.ETH_BUSD;
case ((chain === "ETH") && (symbol === "BNB")): return exports.ETH_BNB;
}
return "";
}
exports.symbolToAddrByChain = symbolToAddrByChain;
function getTableNameByChain(chain) {
switch (true) {
case (chain === "BTC"): return exports.BTC_TABLE_NAME;
case (chain === "ETH"): return exports.ETH_TABLE_NAME;
case (chain === "TRX"): return exports.TRX_TABLE_NAME;
case (chain === "BSC"): return exports.BSC_TABLE_NAME;
case (chain === "BNB"): return exports.BNB_TABLE_NAME;
}
return "";
}
exports.getTableNameByChain = getTableNameByChain;

@ -1,139 +0,0 @@
import dayjs from "dayjs"
import { BigNumber } from "ethers"
// export const connectionInfo: string = 'mysql://root:admin123@localhost:3306/monitor';
// export const connectionInfo: string = 'mysql://root:admin123@localhost:3306/binance';
export const connectionInfo: string = 'mysql://root:123456@47.74.235.176:3206/binance';
export const GLOBAL_PARAMS_TABLE: string = 'global_params'
export type BinanceInfo = {
"account": string,
"balance": string,
"decimals": number,
"symbol": SYMBOL,
"chain": CHAIN
}
export type SumInfo = {
"balance": number,
"timestamp": number,
"chain": CHAIN,
"symbol": SYMBOL
}
export type DataInfo = {
"symbol": SYMBOL,
"curr": SumInfo[],
"last": SumInfo[],
"firstToday": SumInfo[]
}
export type DbParams = {
"pool_address": string,
"token_address": string,
"balance": number,
"chain_id": CHAIN_ID,
"timestamp": number
}
export type DbParams2 = {
"keyStr": `${CHAIN}_${SYMBOL}_${SUFFIX}`,
"valueString": string,
"valueInt": number,
"timestamp": number
}
export type AlarmInfo = {
"curr": number,
"last": number,
"firstToday": number,
"delta1": number,
"delta2": number,
"detail": string
}
export type AlamerParams = {
"token": SYMBOL,
"chain": CHAIN[],
"rule": RULE,
"alarmInfo": AlarmInfo,
"datetime": string
}
export type RULE = "COMPARE_TO_TODAY" | "COMPARE_TO_LAST"
export type CHAIN = "BNB" | "BSC" | "BTC" | "TRX" | "ETH"
export type SYMBOL = "BNB" | "ETH" | "BTC" | "USDC" | "USDT" | "BUSD"
export type CHAIN_ID = 1 | 56 | -1 | -2 | -3
export const ETH_TABLE_NAME = "record_balance_ethereum_binance_wallet_balance"
export const BTC_TABLE_NAME = "record_balance_bitcoin_binance_wallet_balance"
export const TRX_TABLE_NAME = "record_balance_trx_binance_wallet_balance"
export const BNB_TABLE_NAME = "record_balance_bnb_binance_wallet_balance"
export const BSC_TABLE_NAME = "record_balance_bsc_binance_wallet_balance"
export type SUFFIX = "_Last_Timestamp" | "_Toady_Timestamp"
export const BTC = "BTC"
export const BNB_BNB = "BNB_BNB"
export const BSC_BNB = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"
export const TRX_USDT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"
export const TRX_USDC = "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8"
export const ETH_USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
export const ETH_USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
export const ETH_BUSD = "0x4Fabb145d64652a948d72533023f6E7A623C7C53"
export const ETH_BNB = "0xB8c77482e45F1F44dE1745F52C74426C631bDD52"
export const ETH_ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
export function parseBinanceInfoToDb(info: BinanceInfo): DbParams {
let precision = BigNumber.from(10).pow(info.decimals)
let db: DbParams = {
"pool_address": info.account,
"token_address": symbolToAddrByChain(info.symbol, info.chain),
"balance": BigNumber.from(info.balance).div(precision).toNumber(),
"chain_id": chainToChainId(info.chain),
"timestamp": dayjs().unix()
}
return db
}
export function parseBatch(infos: BinanceInfo[]): DbParams[] {
let res: DbParams[] = []
for (let i = 0; i < infos.length; i++) {
res.push(parseBinanceInfoToDb(infos[i]))
}
return res
}
export function chainToChainId(chain: CHAIN): CHAIN_ID {
switch (chain) {
case "BSC":
return 56
case "ETH":
return 1
case "BTC":
return -1
case "TRX":
return -2
case "BNB":
return -3
}
}
export function symbolToAddrByChain(symbol: string, chain: CHAIN): string {
switch (true) {
case ((chain === "BTC")): return BTC;
case ((chain === "BNB")): return BNB_BNB;
case ((chain === "BSC")): return BSC_BNB;
case ((chain === "TRX") && (symbol === "USDT")): return TRX_USDT;
case ((chain === "TRX") && (symbol === "USDC")): return TRX_USDC;
case ((chain === "ETH") && (symbol === "USDT")): return ETH_USDT;
case ((chain === "ETH") && (symbol === "USDC")): return ETH_USDC;
case ((chain === "ETH") && (symbol === "ETH")): return ETH_ETH;
case ((chain === "ETH") && (symbol === "BUSD")): return ETH_BUSD;
case ((chain === "ETH") && (symbol === "BNB")): return ETH_BNB;
}
return ""
}
export function getTableNameByChain(chain: CHAIN): string {
switch (true) {
case (chain === "BTC"): return BTC_TABLE_NAME;
case (chain === "ETH"): return ETH_TABLE_NAME;
case (chain === "TRX"): return TRX_TABLE_NAME;
case (chain === "BSC"): return BSC_TABLE_NAME;
case (chain === "BNB"): return BNB_TABLE_NAME;
}
return ""
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save