Skip to content

Commit 1d753c8

Browse files
authoredJan 23, 2025
Merge pull request #601 from fernando-syslabs/main
Update Syscoin and Rollux integration
2 parents c64ec7b + ffdf960 commit 1d753c8

File tree

16 files changed

+190
-74
lines changed

16 files changed

+190
-74
lines changed
 

‎README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Enkrypt is a web3 wallet built from the ground up to support the multi-chain fut
9999
- Shiden
100100
- Shiden EVM
101101
- Sepolia
102-
- Syscoin
102+
- Syscoin NEVM
103103
- Telos EVM
104104
- Unique
105105
- Vara Network

‎packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ const NetworkEndpoints: Record<string, string> = {
5151
[NetworkNames.FormTestnet]: 'https://testnet-explorer.form.network/',
5252
[NetworkNames.ArtheraTest]: 'https://explorer-test.arthera.net/',
5353
[NetworkNames.Arthera]: 'https://explorer.arthera.net/',
54-
[NetworkNames.SyscoinTest]: 'https://tanenbaum.io/',
55-
[NetworkNames.Syscoin]: 'https://explorer.syscoin.org/',
54+
[NetworkNames.SyscoinNEVMTest]: 'https://explorer.tanenbaum.io/',
55+
[NetworkNames.SyscoinNEVM]: 'https://explorer.syscoin.org/',
5656
[NetworkNames.RolluxTest]: 'https://rollux.tanenbaum.io/',
5757
[NetworkNames.Rollux]: 'https://explorer.rollux.com/',
5858
[NetworkNames.Blast]: 'https://api.blastscan.io/',

‎packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { EvmNetwork } from '../../types/evm-network';
2020
import { getKnownNetworkTokens } from './token-lists';
2121
import { CoingeckoPlatform, NetworkNames } from '@enkryptcom/types';
2222
import { NATIVE_TOKEN_ADDRESS } from '../common';
23+
import getBlockscoutBalances from "./blockscout";
2324
import getTomoBalances from './tomochain';
2425
import getSolBalances from './solanachain';
2526
import { CoinGeckoTokenMarket } from '@/libs/market-data/types';
@@ -120,9 +121,13 @@ const supportedNetworks: Record<SupportedNetworkNames, SupportedNetwork> = {
120121
tbName: 'shib',
121122
cgPlatform: CoingeckoPlatform.Shibarium,
122123
},
124+
[NetworkNames.SyscoinNEVM]: {
125+
cgPlatform: CoingeckoPlatform.Syscoin,
126+
bsEndpoint: true,
127+
},
123128
[NetworkNames.Rollux]: {
124-
tbName: 'rollux',
125129
cgPlatform: CoingeckoPlatform.Rollux,
130+
bsEndpoint: true,
126131
},
127132
[NetworkNames.Telos]: {
128133
tbName: 'tlos',
@@ -191,6 +196,8 @@ const getTokens = (
191196
return getTomoBalances(chain, address);
192197
} else if (chain === NetworkNames.Solana) {
193198
return getSolBalances(network, address);
199+
} else if (supportedNetworks[chain].bsEndpoint) {
200+
return getBlockscoutBalances(chain, address);
194201
}
195202
let url = '';
196203
if (chain === NetworkNames.Ethereum || chain === NetworkNames.Binance)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { SupportedNetworkNames, TokenBalance } from "./types/tokenbalance-mew";
2+
import { NetworkEndpoints } from "@/providers/ethereum/libs/activity-handlers/providers/etherscan/configs";
3+
import { NATIVE_TOKEN_ADDRESS } from "../common";
4+
import { numberToHex } from "web3-utils";
5+
6+
interface TokenBalanceType {
7+
token: string;
8+
quantity: string;
9+
error?: unknown;
10+
}
11+
12+
interface TokenResponseItem {
13+
token: {
14+
address: string;
15+
decimals: string;
16+
name: string;
17+
symbol: string;
18+
};
19+
value: string;
20+
}
21+
22+
interface TokenResponse {
23+
items: TokenResponseItem[];
24+
}
25+
26+
const getBlockscoutBalances = (
27+
chain: SupportedNetworkNames,
28+
address: string
29+
): Promise<TokenBalance[]> => {
30+
const encodedAddress = encodeURIComponent(address);
31+
const nativeTokenUrl = `${NetworkEndpoints[chain]}api/v2/addresses/${encodedAddress}`;
32+
const tokenBalancesUrl = `${NetworkEndpoints[chain]}api/v2/addresses/${encodedAddress}/tokens?type=ERC-20`;
33+
34+
return Promise.all([
35+
fetch(nativeTokenUrl).then((res) => res.json()),
36+
fetch(tokenBalancesUrl).then((res) => res.json()),
37+
])
38+
.then(([nativeResponse, tokenResponse]: [any, TokenResponse]) => {
39+
if (!nativeResponse?.coin_balance || !tokenResponse?.items) {
40+
return Promise.reject("Error fetching balance data");
41+
}
42+
43+
if (Number.isNaN(Number(nativeResponse.coin_balance))) {
44+
return Promise.reject("Invalid native token balance");
45+
}
46+
47+
// Map native token balance
48+
const nativeBalance: TokenBalanceType = {
49+
token: NATIVE_TOKEN_ADDRESS,
50+
quantity: nativeResponse.coin_balance,
51+
};
52+
53+
// Map token balances
54+
const tokenBalances: TokenBalanceType[] = Array.isArray(
55+
tokenResponse?.items
56+
)
57+
? tokenResponse.items
58+
.filter(
59+
(item) =>
60+
item?.token?.address &&
61+
typeof item.token.address === "string" &&
62+
item.value !== undefined
63+
)
64+
.map((item) => ({
65+
token: item.token.address.toLowerCase(),
66+
quantity: item.value,
67+
}))
68+
: [];
69+
70+
// Merge native token and token balances
71+
const allBalances = [nativeBalance, ...tokenBalances];
72+
73+
// Convert to TokenBalance format
74+
return allBalances.map((tb) => ({
75+
contract: tb.token,
76+
balance: numberToHex(tb.quantity), // Convert to hex format
77+
}));
78+
})
79+
.catch((error) => {
80+
console.error("Error fetching balances:", error);
81+
throw error;
82+
});
83+
};
84+
85+
export default getBlockscoutBalances;

‎packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { CoingeckoPlatform, NetworkNames } from '@enkryptcom/types';
33
import { CGToken, SupportedNetworkNames } from './types/tokenbalance-mew';
44
const TOKEN_FETCH_TTL = 1000 * 60 * 60;
55
const TokenList: Record<SupportedNetworkNames, string> = {
6+
[NetworkNames.SyscoinNEVM]: `https://tokens.coingecko.com/${CoingeckoPlatform.Syscoin}/all.json`,
7+
[NetworkNames.Rollux]: `https://tokens.coingecko.com/${CoingeckoPlatform.Rollux}/all.json`,
68
[NetworkNames.Binance]: `https://tokens.coingecko.com/${CoingeckoPlatform.Binance}/all.json`,
79
[NetworkNames.Ethereum]: `https://tokens.coingecko.com/${CoingeckoPlatform.Ethereum}/all.json`,
810
[NetworkNames.Matic]: `https://tokens.coingecko.com/${CoingeckoPlatform.Matic}/all.json`,

‎packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ export interface TokenBalance {
55
balance: string;
66
}
77
export interface SupportedNetwork {
8-
tbName: string;
8+
tbName?: string;
99
cgPlatform?: string;
10+
bsEndpoint?: boolean;
1011
}
1112
export interface CGToken {
1213
chainId: `0x${string}`;
@@ -50,6 +51,7 @@ export type SupportedNetworkNames =
5051
| NetworkNames.Celo
5152
| NetworkNames.ZkSync
5253
| NetworkNames.Telos
54+
| NetworkNames.SyscoinNEVM
5355
| NetworkNames.Rollux
5456
| NetworkNames.Sanko
5557
| NetworkNames.Degen

‎packages/extension/src/providers/ethereum/networks/index.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ import shibNode from './shib';
3434
import artheraNode from './aa';
3535
import formTestnet from './form-testnet';
3636
import artheraTestNode from './aat';
37-
import syscoinTestNode from './tsys';
38-
import syscoinNode from './sys';
39-
import rolluxTestNode from './trlx';
40-
import rolluxNode from './rlx';
37+
import syscoinNEVMTestNode from './syscoin/nevm-testnet';
38+
import syscoinNEVMNode from './syscoin/nevm';
39+
import rolluxTestNode from './syscoin/rollux-testnet';
40+
import rolluxNode from './syscoin/rollux';
4141
import cagaAnkara from './cagaAnkara';
4242
import telosNode from './tlos';
4343
import blastNode from './blast';
@@ -108,8 +108,8 @@ export default {
108108
arthera: artheraNode,
109109
formTestnet: formTestnet,
110110
artheraTest: artheraTestNode,
111-
syscoinTest: syscoinTestNode,
112-
syscoin: syscoinNode,
111+
syscoinNEVMTest: syscoinNEVMTestNode,
112+
syscoinNEVM: syscoinNEVMNode,
113113
rolluxTest: rolluxTestNode,
114114
rollux: rolluxNode,
115115
cagaAnkara: cagaAnkara,

‎packages/extension/src/providers/ethereum/networks/sys.ts

-26
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import icon from '../icons/tsys_nevm.svg';
2+
import { NetworkNames } from '@enkryptcom/types';
3+
import { EvmNetwork, EvmNetworkOptions } from '../../types/evm-network';
4+
import { EtherscanActivity } from '../../libs/activity-handlers';
5+
import wrapActivityHandler from '@/libs/activity-state/wrap-activity-handler';
6+
7+
const syscoinNEVMTestOptions: EvmNetworkOptions = {
8+
name: NetworkNames.SyscoinNEVMTest,
9+
name_long: 'Syscoin NEVM Testnet',
10+
homePage: 'https://www.syscoin.org/',
11+
blockExplorerTX: 'https://explorer.tanenbaum.io/tx/[[txHash]]',
12+
blockExplorerAddr: 'https://explorer.tanenbaum.io/address/[[address]]',
13+
chainID: '0x1644',
14+
isTestNetwork: true,
15+
currencyName: 'TSYS',
16+
currencyNameLong: 'Test Syscoin',
17+
node: 'wss://rpc.tanenbaum.io/wss',
18+
icon,
19+
buyLink: 'https://faucet.syscoin.org',
20+
activityHandler: wrapActivityHandler(EtherscanActivity),
21+
};
22+
23+
const syscoinNEVMTest = new EvmNetwork(syscoinNEVMTestOptions);
24+
25+
export default syscoinNEVMTest;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import icon from '../icons/sys_nevm.svg';
2+
import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types";
3+
import { EvmNetwork, EvmNetworkOptions } from "../../types/evm-network";
4+
import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew";
5+
import { EtherscanActivity } from "../../libs/activity-handlers";
6+
import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler";
7+
8+
const syscoinNEVMOptions: EvmNetworkOptions = {
9+
name: NetworkNames.SyscoinNEVM,
10+
name_long: "Syscoin NEVM",
11+
homePage: "https://www.syscoin.org/",
12+
blockExplorerTX: "https://explorer.syscoin.org/tx/[[txHash]]",
13+
blockExplorerAddr: "https://explorer.syscoin.org/address/[[address]]",
14+
chainID: "0x39",
15+
isTestNetwork: false,
16+
currencyName: "SYS",
17+
currencyNameLong: "Syscoin",
18+
node: "wss://rpc.syscoin.org/wss",
19+
coingeckoID: "syscoin",
20+
coingeckoPlatform: CoingeckoPlatform.Syscoin,
21+
icon,
22+
assetsInfoHandler,
23+
buyLink: 'https://trade.coinify.com/syscoin?defaultCryptoCurrency=SYSEVM&cryptoCurrencies=SYSROLLUX,SYSEVM,SYS&targetPage=buy',
24+
activityHandler: wrapActivityHandler(EtherscanActivity),
25+
};
26+
27+
const syscoinNEVM = new EvmNetwork(syscoinNEVMOptions);
28+
29+
export default syscoinNEVM;

‎packages/extension/src/providers/ethereum/networks/trlx.ts ‎packages/extension/src/providers/ethereum/networks/syscoin/rollux-testnet.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import icon from './icons/tsys_rollux.svg';
1+
import icon from '../icons/tsys_rollux.svg';
22
import { NetworkNames } from '@enkryptcom/types';
3-
import { EvmNetwork, EvmNetworkOptions } from '../types/evm-network';
4-
import { EtherscanActivity } from '../libs/activity-handlers';
3+
import { EvmNetwork, EvmNetworkOptions } from '../../types/evm-network';
4+
import { EtherscanActivity } from '../../libs/activity-handlers';
55
import wrapActivityHandler from '@/libs/activity-state/wrap-activity-handler';
66

77
const rolluxTestOptions: EvmNetworkOptions = {
@@ -16,6 +16,7 @@ const rolluxTestOptions: EvmNetworkOptions = {
1616
currencyNameLong: 'Test Syscoin',
1717
node: 'wss://rpc-tanenbaum.rollux.com/wss',
1818
icon,
19+
buyLink: 'https://faucet.rollux.com',
1920
activityHandler: wrapActivityHandler(EtherscanActivity),
2021
};
2122

‎packages/extension/src/providers/ethereum/networks/rlx.ts ‎packages/extension/src/providers/ethereum/networks/syscoin/rollux.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import icon from './icons/sys_rollux.svg';
1+
import icon from '../icons/sys_rollux.svg';
22
import { NetworkNames, CoingeckoPlatform } from '@enkryptcom/types';
3-
import { EvmNetwork, EvmNetworkOptions } from '../types/evm-network';
4-
import { EtherscanActivity } from '../libs/activity-handlers';
3+
import { EvmNetwork, EvmNetworkOptions } from '../../types/evm-network';
4+
import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew";
5+
import { EtherscanActivity } from '../../libs/activity-handlers';
56
import wrapActivityHandler from '@/libs/activity-state/wrap-activity-handler';
6-
import assetsInfoHandler from '@/providers/ethereum/libs/assets-handlers/assetinfo-mew';
77

88
const rolluxOptions: EvmNetworkOptions = {
99
name: NetworkNames.Rollux,
@@ -20,6 +20,7 @@ const rolluxOptions: EvmNetworkOptions = {
2020
coingeckoPlatform: CoingeckoPlatform.Rollux,
2121
icon,
2222
assetsInfoHandler,
23+
buyLink: 'https://trade.coinify.com/syscoin?defaultCryptoCurrency=SYSROLLUX&cryptoCurrencies=SYSROLLUX,SYSEVM,SYS&targetPage=buy',
2324
activityHandler: wrapActivityHandler(EtherscanActivity),
2425
};
2526

‎packages/extension/src/providers/ethereum/networks/tsys.ts

-24
This file was deleted.

‎packages/extension/src/providers/ethereum/types/evm-network.ts

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface EvmNetworkOptions {
3434
currencyNameLong: string;
3535
node: string;
3636
icon: string;
37+
buyLink?: string | undefined;
3738
coingeckoID?: string;
3839
coingeckoPlatform?: CoingeckoPlatform;
3940
basePath?: string;
@@ -98,6 +99,7 @@ export class EvmNetwork extends BaseNetwork {
9899

99100
baseOptions.customTokens = baseOptions.customTokens ?? true;
100101
super(baseOptions);
102+
this.options = options;
101103

102104
this.chainID = options.chainID;
103105
this.assetsInfoHandler = options.assetsInfoHandler;

‎packages/extension/src/ui/action/App.vue

+16-4
Original file line numberDiff line numberDiff line change
@@ -362,14 +362,26 @@ const toggleDepositWindow = () => {
362362
showDepositWindow.value = !showDepositWindow.value;
363363
};
364364
const openBuyPage = () => {
365-
const buyLink =
366-
currentNetwork.value.name === NetworkNames.KadenaTestnet
367-
? (currentNetwork.value as KadenaNetwork).options.buyLink
368-
: `https://ccswap.myetherwallet.com/?to=${currentNetwork.value.displayAddress(
365+
const buyLink = (() => {
366+
switch (currentNetwork.value.name) {
367+
case NetworkNames.KadenaTestnet:
368+
return (currentNetwork.value as KadenaNetwork).options.buyLink;
369+
case NetworkNames.SyscoinNEVM:
370+
case NetworkNames.Rollux:
371+
return `${(currentNetwork.value as EvmNetwork).options.buyLink}&address=${currentNetwork.value.displayAddress(
372+
accountHeaderData.value.selectedAccount!.address
373+
)}`;
374+
case NetworkNames.SyscoinNEVMTest:
375+
case NetworkNames.RolluxTest:
376+
return (currentNetwork.value as EvmNetwork).options.buyLink;
377+
default:
378+
return `https://ccswap.myetherwallet.com/?to=${currentNetwork.value.displayAddress(
369379
accountHeaderData.value.selectedAccount!.address,
370380
)}&network=${currentNetwork.value.name}&crypto=${
371381
currentNetwork.value.currencyName
372382
}&platform=enkrypt`;
383+
}
384+
})();
373385
Browser.tabs.create({
374386
url: buyLink,
375387
});

‎packages/types/src/networks.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ export enum NetworkNames {
6868
FormTestnet = "FormTestnet",
6969
AssetHubDOT = "AssetHubDOT",
7070
AssetHubKSM = "AssetHubKSM",
71-
SyscoinTest = "TSYS",
72-
Syscoin = "SYS",
71+
SyscoinNEVMTest = "TSYS",
72+
SyscoinNEVM = "SYS",
7373
RolluxTest = "TRLX",
7474
Rollux = "RLX",
7575
CagaAnkara = "CagaAnkara",

0 commit comments

Comments
 (0)
Please sign in to comment.