Skip to content

Commit

Permalink
ALL-6928 - Add TON L0
Browse files Browse the repository at this point in the history
  • Loading branch information
Hathoriel committed Jul 16, 2024
1 parent 5f87a32 commit 50bd9c0
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 8 deletions.
1 change: 1 addition & 0 deletions src/dto/Currency.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export enum Currency {
ATOM = 'ATOM',
IOTA = 'IOTA',
CSPR = 'CSPR',
TON = 'TON'
}

export function networkToCurrency(network: Network): Currency {
Expand Down
13 changes: 13 additions & 0 deletions src/dto/Network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export enum Network {
ZILLIQA = 'zilliqa-mainnet',
BITCOIN_ELECTRS = 'bitcoin-mainnet-electrs',
CASPER = 'casper-mainnet',
TON = 'ton-mainnet',


// Testnets
Expand Down Expand Up @@ -110,6 +111,7 @@ export enum Network {
IOTA_TESTNET = 'iota-testnet',
BITCOIN_ELECTRS_TESTNET = 'bitcoin-testnet-electrs',
ROSTRUM_TESTNET = 'bch-testnet-rostrum',
TON_TESTNET = 'ton-testnet'
}

export const EVM_BASED_NETWORKS = [
Expand Down Expand Up @@ -267,6 +269,7 @@ export const IOTA_LOAD_BALANCER_NETWORKS = [Network.IOTA]
export const BITCOIN_ELECTRS_NETWORKS = [Network.BITCOIN_ELECTRS, Network.BITCOIN_ELECTRS_TESTNET]
export const IOTA_NETWORKS = [Network.IOTA, Network.IOTA_TESTNET]
export const CASPER_NETWORKS = [Network.CASPER]
export const TON_NETWORKS = [Network.TON, Network.TON_TESTNET]

export const LOAD_BALANCER_NETWORKS = [
...UTXO_LOAD_BALANCER_NETWORKS,
Expand Down Expand Up @@ -388,6 +391,8 @@ export const isElectrsNetwork = (network: Network) => BITCOIN_ELECTRS_NETWORKS.i

export const isCasperNetwork = (network: Network) => CASPER_NETWORKS.includes(network)

export const isTonNetwork = (network: Network) => TON_NETWORKS.includes(network)

export const isSameGetBlockNetwork = (network: Network) =>
isUtxoBasedNetwork(network) ||
isEvmBasedNetwork(network) ||
Expand Down Expand Up @@ -960,5 +965,13 @@ export const NETWORK_METADATA: Record<Network, NetworkMetadata> = {
[Network.CASPER]: {
currency: Currency.CSPR,
testnet: false,
},
[Network.TON]: {
currency: Currency.TON,
testnet: false,
},
[Network.TON_TESTNET]: {
currency: Currency.TON,
testnet: true
}
}
8 changes: 8 additions & 0 deletions src/dto/rpc/TonRpcSuite.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export interface GetStatus {
rest_online: boolean
indexing_latency: number
}

export interface TonRpcSuite {
getStatus(): Promise<GetStatus>
}
19 changes: 19 additions & 0 deletions src/service/rpc/other/AbstractTonRpc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { PostI } from '../../../dto/PostI'
import { GetI } from '../../../dto/GetI'
import { QueryParams } from '../../../dto'
import { Utils } from '../../../util'
import { GetStatus, TonRpcSuite } from '../../../dto/rpc/TonRpcSuite'

export abstract class AbstractTonRpc implements TonRpcSuite {
protected abstract post<T>(post: PostI): Promise<T>

protected abstract get<T>(get: GetI): Promise<T>

private async sendGet<T>({ path, queryParams }: { path: string; queryParams?: QueryParams }): Promise<T> {
return this.get({ path: Utils.addQueryParams({ basePath: path, queryParams: queryParams }) })
}

getStatus(): Promise<GetStatus> {
return this.sendGet({ path: '/v2/status' })
}
}
40 changes: 40 additions & 0 deletions src/service/rpc/other/TonRpc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { GetI } from 'src/dto/GetI'
import { Container, Service } from 'typedi'
import { TatumConnector } from '../../../connector/tatum.connector'
import { PostI } from '../../../dto/PostI'
import { CONFIG, Utils } from '../../../util'
import { TatumConfig } from '../../tatum'
import { AbstractTonRpc } from './AbstractTonRpc'
import { TonRpcSuite } from '../../../dto/rpc/TonRpcSuite'

@Service({
factory: (data: { id: string }) => {
return new TonRpc(data.id)
},
transient: true,
})
export class TonRpc extends AbstractTonRpc implements TonRpcSuite {
protected readonly connector: TatumConnector
protected readonly config: TatumConfig

constructor(id: string) {
super()
this.connector = Container.of(id).get(TatumConnector)
this.config = Container.of(id).get(CONFIG)
}

public destroy() {
// Do nothing
}

protected post<T>(post: PostI): Promise<T> {
const basePath = Utils.getV3RpcUrl(this.config)
return this.connector.post({ ...post, basePath })
}

protected get<T>(get: GetI): Promise<T> {
const basePath = Utils.getV3RpcUrl(this.config)
return this.connector.get({ ...get, basePath })
}
}
10 changes: 10 additions & 0 deletions src/service/tatum/tatum.other.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { Token } from '../token'
import { TatumSdkChain } from './tatum'
import { CosmosRpcSuite } from '../../dto/rpc/CosmosRpcSuite'
import { CasperRpcSuite } from '../../dto/rpc/CasperRpcSuite'
import { TonRpcSuite } from '../../dto/rpc/TonRpcSuite'

export abstract class BaseOther extends TatumSdkChain {
ipfs: Ipfs
Expand Down Expand Up @@ -151,6 +152,15 @@ export class Casper extends BaseOther {
}
}

export class Ton extends BaseOther {
rpc: TonRpcSuite

constructor(id: string) {
super(id)
this.rpc = Utils.getRpc<TonRpcSuite>(id, Container.of(id).get(CONFIG))
}
}

export class AlgorandAlgod extends BaseOther {
rpc: AlgorandAlgodRpcSuite

Expand Down
45 changes: 37 additions & 8 deletions src/util/util.shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@ import {
isAlgorandAlgodNetwork,
isAlgorandIndexerNetwork,
isBnbLoadBalancerNetwork,
isCardanoNetwork, isCasperNetwork, isCosmosNetwork,
isCardanoNetwork,
isCasperNetwork,
isCosmosNetwork,
isDogecoinLoadBalancedNetwork,
isEosLoadBalancerNetwork,
isEosNetwork,
isEvmArchiveNonArchiveBeaconLoadBalancerNetwork,
isEvmArchiveNonArchiveLoadBalancerNetwork,
isEvmBasedNetwork,
isEvmLoadBalancerNetwork,
isIotaLoadBalancerNetwork, isIotaNetwork,
isIotaLoadBalancerNetwork,
isIotaNetwork,
isKadenaLoadBalancerNetwork,
isNativeEvmLoadBalancerNetwork,
isRostrumLoadBalancerNetwork,
Expand All @@ -24,6 +27,7 @@ import {
isStellarLoadBalancerNetwork,
isStellarNetwork,
isTezosNetwork,
isTonNetwork,
isTronLoadBalancerNetwork,
isTronNetwork,
isUtxoBasedNetwork,
Expand All @@ -50,11 +54,14 @@ import {
Base,
BinanceSmartChain,
Bitcoin,
BitcoinCash, BitcoinElectrs,
BitcoinCash,
BitcoinElectrs,
Bnb,
CardanoRosetta, Casper,
CardanoRosetta,
Casper,
Celo,
Chiliz, CosmosRosetta,
Chiliz,
CosmosRosetta,
Cronos,
Dogecoin,
Eos,
Expand Down Expand Up @@ -83,7 +90,7 @@ import {
Solana,
Stellar,
TatumConfig,
Tezos,
Tezos, Ton,
Tron,
UtxoRpc,
Vechain,
Expand Down Expand Up @@ -119,11 +126,16 @@ import { CONFIG, LOGGER } from './di.tokens'
import { IotaRpc } from '../service/rpc/other/IotaRpc'
import { CosmosLoadBalancerRpc } from '../service/rpc/other/CosmosLoadBalancerRpc'
import { CasperLoadBalancerRpc } from '../service/rpc/other/CasperLoadBalancerRpc'
import { TonRpc } from '../service/rpc/other/TonRpc'

export const Utils = {
getRpc: <T>(id: string, config: TatumConfig): T => {
const { network } = config

if(isTonNetwork(network)) {
return Container.of(id).get(TonRpc) as T
}

if(isCasperNetwork(network)) {
return Container.of(id).get(CasperLoadBalancerRpc) as T
}
Expand Down Expand Up @@ -341,14 +353,19 @@ export const Utils = {
isAlgorandIndexerNetwork(network) ||
isStellarLoadBalancerNetwork(network) ||
isKadenaLoadBalancerNetwork(network) ||
isIotaLoadBalancerNetwork(network)
isIotaLoadBalancerNetwork(network) ||
isTonNetwork(network)
) {
return null
}

throw new Error(`Network ${network} is not supported.`)
},
getStatusUrl(network: Network, url: string): string {
if (isTonNetwork(network)) {
return `${url}v2/liteserver/get_masterchain_info`
}

if (isIotaLoadBalancerNetwork(network)) {
return `${url}api/core/v2/info`
}
Expand Down Expand Up @@ -410,13 +427,18 @@ export const Utils = {
isAlgorandIndexerNetwork(network) ||
isStellarLoadBalancerNetwork(network) ||
isKadenaLoadBalancerNetwork(network) ||
isIotaLoadBalancerNetwork(network)
isIotaLoadBalancerNetwork(network) ||
isTonNetwork(network)
) {
return 'GET'
}
return 'POST'
},
parseStatusPayload: (network: Network, response: JsonRpcResponse<any> | any) => {
if (isTonNetwork(network)) {
return new BigNumber((response.last.seqno as number) || -1).toNumber()
}

if (isCasperNetwork(network)) {
return new BigNumber((response.result.last_added_block_info.height as number) || -1).toNumber()
}
Expand Down Expand Up @@ -472,6 +494,10 @@ export const Utils = {
throw new Error(`Network ${network} is not supported.`)
},
isResponseOk: (network: Network, response: JsonRpcResponse<any> | any) => {
if (isTonNetwork(network)) {
return response.last.seqno !== undefined
}

if (isCasperNetwork(network)) {
return response.result.last_added_block_info.height !== undefined
}
Expand Down Expand Up @@ -886,6 +912,9 @@ export const Utils = {
return new BitcoinElectrs(id) as T
case Network.CASPER:
return new Casper(id) as T
case Network.TON:
case Network.TON_TESTNET:
return new Ton(id) as T
default:
return new FullSdk(id) as T
}
Expand Down

0 comments on commit 50bd9c0

Please sign in to comment.