diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..a0f1aabdc 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -14,8 +14,8 @@ class PublicKeyRing { private async getKeysObject(): Promise<{ [key: string]: EnkryptAccount }> { const allKeys = await this.#keyring.getKeysObject(); if (process.env.IS_DEV) { - allKeys["0x99999990d598b918799f38163204bbc30611b6b6"] = { - address: "0x99999990d598b918799f38163204bbc30611b6b6", + allKeys["0x339d413ccefd986b1b3647a9cfa9cbbe70a30749"] = { + address: "0x339d413ccefd986b1b3647a9cfa9cbbe70a30749", basePath: "m/44'/60'/1'/0", name: "fake account #1", pathIndex: 0, diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts index 2f0c8e4d6..300826277 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts @@ -3,10 +3,12 @@ import EtherscanActivity from "./providers/etherscan"; import OkcActivity from "./providers/okc"; import TomoScan from "./providers/tomoscan"; import OntEVMActivity from "./providers/ont-evm"; +import TelosActivity from "./providers/telos"; export { RivetActivity, EtherscanActivity, OkcActivity, OntEVMActivity, TomoScan, + TelosActivity, }; diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index a829e77d4..85e128187 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -1,9 +1,9 @@ import { NetworkNames } from "@enkryptcom/types"; const NetworkEndpoints: Record = { - [NetworkNames.Ethereum]: "https://api.etherscan.io/", + [NetworkNames.Ethereum]: "https://eth.blockscout.com/", [NetworkNames.Binance]: "https://api.bscscan.com/", - [NetworkNames.Matic]: "https://api.polygonscan.com/", + [NetworkNames.Matic]: "https://polygon.blockscout.com/", [NetworkNames.Moonbeam]: "https://api-moonbeam.moonscan.io/", [NetworkNames.Moonriver]: "https://api-moonriver.moonscan.io/", [NetworkNames.KaruraEVM]: "https://blockscout.karura.network/", diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/configs.ts new file mode 100644 index 000000000..5ddc8a61e --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/configs.ts @@ -0,0 +1,7 @@ +import { NetworkNames } from "@enkryptcom/types"; + +const NetworkEndpoints: Record = { + [NetworkNames.Telos]: "https://api.teloscan.io/", +}; + +export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/index.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/index.ts new file mode 100644 index 000000000..9fec60183 --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/index.ts @@ -0,0 +1,88 @@ +import cacheFetch from "@/libs/cache-fetch"; +import { EvmNetwork } from "@/providers/ethereum/types/evm-network"; +import { + Activity, + ActivityStatus, + ActivityType, + EthereumRawInfo, +} from "@/types/activity"; +import { BaseNetwork } from "@/types/base-network"; +import { numberToHex } from "web3-utils"; +import { decodeTx } from "../../../transaction/decoder"; +import { NetworkEndpoints } from "./configs"; +import { TelosTXType } from "./types"; +const TTL = 30000; +const getAddressActivity = async ( + address: string, + endpoint: string +): Promise => { + return cacheFetch( + { + url: `${endpoint}v1/address/${address}/transactions`, + }, + TTL + ).then((res) => { + if (!res.success) return []; + const results = res.results as TelosTXType[]; + const newResults = results.map((tx) => { + const rawTx: EthereumRawInfo = { + blockHash: "0x", + blockNumber: numberToHex(tx.blockNumber), + contractAddress: tx.contractAddress + ? tx.contractAddress.toLowerCase() + : null, + data: tx.input, + effectiveGasPrice: tx.gasPrice, + from: tx.from.toLowerCase(), + to: tx.to === "" ? null : tx.to.toLowerCase(), + gas: tx.gasLimit, + gasUsed: tx.gasused, + nonce: numberToHex(tx.nonce), + status: tx.status === "0x1" ? true : false, + transactionHash: tx.hash, + value: tx.value, + timestamp: tx.timestamp, + }; + return rawTx; + }); + return newResults.slice(0, 50) as EthereumRawInfo[]; + }); +}; +export default async ( + network: BaseNetwork, + address: string +): Promise => { + address = address.toLowerCase(); + const enpoint = + NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; + const activities = await getAddressActivity(address, enpoint); + const Promises = activities.map((activity) => { + return decodeTx(activity, network as EvmNetwork).then((txData) => { + return { + from: activity.from, + to: activity.contractAddress + ? activity.contractAddress + : txData.tokenTo!, + isIncoming: activity.from !== address, + network: network.name, + rawInfo: activity, + status: activity.status + ? ActivityStatus.success + : ActivityStatus.failed, + timestamp: activity.timestamp ? activity.timestamp : 0, + value: txData.tokenValue, + transactionHash: activity.transactionHash, + type: ActivityType.transaction, + nonce: activity.nonce, + token: { + decimals: txData.tokenDecimals, + icon: txData.tokenImage, + name: txData.tokenName, + symbol: txData.tokenSymbol, + price: txData.currentPriceUSD.toString(), + }, + }; + }); + }); + return Promise.all(Promises); +}; diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/types.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/types.ts new file mode 100644 index 000000000..6ad5341d2 --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/telos/types.ts @@ -0,0 +1,16 @@ +export interface TelosTXType { + gasused: string; + contractAddress: string; + index: number; + nonce: number; + input: string; + gasLimit: string; + blockNumber: number; + from: string; + to: string; + value: string; + hash: string; + timestamp: number; + gasPrice: string; + status: "0x1" | "0x0"; +} diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index 007239be4..3d535eff3 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -119,6 +119,10 @@ const supportedNetworks: Record = { tbName: "rollux", cgPlatform: CoingeckoPlatform.Rollux, }, + [NetworkNames.Telos]: { + tbName: "tlos", + cgPlatform: CoingeckoPlatform.Telos, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index aa1c9a0fc..7fd2d3870 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -26,6 +26,7 @@ const TokenList: Record = { [NetworkNames.TomoChain]: `https://tokens.coingecko.com/${CoingeckoPlatform.TomoChain}/all.json`, [NetworkNames.Shibarium]: `https://tokens.coingecko.com/${CoingeckoPlatform.Shibarium}/all.json`, [NetworkNames.Rollux]: `https://tokens.coingecko.com/${CoingeckoPlatform.Rollux}/all.json`, + [NetworkNames.Telos]: `https://tokens.coingecko.com/${CoingeckoPlatform.Telos}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index b5de45cc7..1515cd7cd 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -48,4 +48,5 @@ export type SupportedNetworkNames = | NetworkNames.MaticZK | NetworkNames.Celo | NetworkNames.ZkSync + | NetworkNames.Telos | NetworkNames.Rollux; diff --git a/packages/extension/src/providers/ethereum/networks/icons/telos.svg b/packages/extension/src/providers/ethereum/networks/icons/telos.svg new file mode 100644 index 000000000..49cc05f82 Binary files /dev/null and b/packages/extension/src/providers/ethereum/networks/icons/telos.svg differ diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index af277273e..8f8596ceb 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -38,6 +38,7 @@ import syscoinNode from "./sys"; import rolluxTestNode from "./trlx"; import rolluxNode from "./rlx"; import cagaAnkara from "./cagaAnkara"; +import telosNode from "./tlos"; export default { sepolia: sepoliaNode, @@ -89,4 +90,5 @@ export default { rolluxTest: rolluxTestNode, rollux: rolluxNode, cagaAnkara: cagaAnkara, + telos: telosNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/rsk-testnet.ts b/packages/extension/src/providers/ethereum/networks/rsk-testnet.ts index 4dcbbcc21..8542dcd14 100644 --- a/packages/extension/src/providers/ethereum/networks/rsk-testnet.ts +++ b/packages/extension/src/providers/ethereum/networks/rsk-testnet.ts @@ -13,7 +13,8 @@ const rootstockTestnetOptions: EvmNetworkOptions = { name_long: "Rootstock Testnet", homePage: "https://rootstock.io/", blockExplorerTX: "https://explorer.testnet.rootstock.io/tx/[[txHash]]", - blockExplorerAddr: "https://explorer.testnet.rootstock.io/address/[[address]]", + blockExplorerAddr: + "https://explorer.testnet.rootstock.io/address/[[address]]", chainID: "0x1f", isTestNetwork: true, currencyName: "tRBTC", diff --git a/packages/extension/src/providers/ethereum/networks/tlos.ts b/packages/extension/src/providers/ethereum/networks/tlos.ts new file mode 100644 index 000000000..25fa28cfb --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/tlos.ts @@ -0,0 +1,27 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import { TelosActivity } from "../libs/activity-handlers"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; + +const ethOptions: EvmNetworkOptions = { + name: NetworkNames.Telos, + name_long: "Telos EVM", + homePage: "https://www.telos.net", + blockExplorerTX: "https://www.teloscan.io/tx/[[txHash]]", + blockExplorerAddr: "https://www.teloscan.io/address/[[address]]", + chainID: "0x28", + isTestNetwork: false, + currencyName: "TLOS", + currencyNameLong: "Telos", + node: "wss://telos.drpc.org", + icon: require("./icons/telos.svg"), + coingeckoID: "telos", + coingeckoPlatform: CoingeckoPlatform.Telos, + assetsInfoHandler, + activityHandler: wrapActivityHandler(TelosActivity), +}; + +const eth = new EvmNetwork(ethOptions); + +export default eth; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 8cd100af3..cb7f49134 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -72,6 +72,7 @@ export enum NetworkNames { RolluxTest = "TRLX", Rollux = "RLX", CagaAnkara = "CagaAnkara", + Telos = "TLOS" } export enum CoingeckoPlatform { @@ -114,4 +115,5 @@ export enum CoingeckoPlatform { Kadena = "kadena", Syscoin = "syscoin", Rollux = "rollux", + Telos = "telos" }