Platforms

A Platform is an immutable, cached identifier for a trading venue. Every asset, owner, and operator is bound to a platform, enabling consistent cross-venue comparisons.

Platform (Base Class)

from financepype.platforms.platform import Platform

binance = Platform(identifier="binance")
kraken = Platform(identifier="kraken")

print(str(binance))   # binance
print(repr(binance))  # <Platform: binance>

Caching / Singleton Behaviour

Platforms use a global cache keyed on ClassName:identifier[:key=value...]. Constructing the same class with the same arguments always returns the same Python object.

p1 = Platform(identifier="binance")
p2 = Platform(identifier="binance")
assert p1 is p2  # True

To clear the cache (e.g., in tests):

Platform.clear_cache()

Immutability

Platform uses model_config = ConfigDict(frozen=True). Fields cannot be changed after construction.

CentralizedPlatform

Use CentralizedPlatform for centralized exchanges. It adds optional sub_identifier (for sub-accounts or paper trading modes) and domain (for API base URL tracking).

from financepype.platforms.centralized import CentralizedPlatform

okx = CentralizedPlatform(
    identifier="okx",
    sub_identifier="demo",   # e.g. paper trading account
    domain="www.okx.com",
)

# Sub-identifier is included in the cache key
okx_demo = CentralizedPlatform(identifier="okx", sub_identifier="demo")
okx_live = CentralizedPlatform(identifier="okx", sub_identifier=None)
assert okx_demo is not okx_live

BlockchainPlatform

Use BlockchainPlatform for blockchain networks. It adds chain-specific metadata.

from financepype.platforms.blockchain import BlockchainPlatform, BlockchainType

# BlockchainType is an empty enum that you extend in your project
class MyBlockchainType(BlockchainType):
    EVM = "EVM"
    SOLANA = "SOLANA"

ethereum = BlockchainPlatform(
    identifier="ethereum",
    type=MyBlockchainType.EVM,
    chain_id=1,
    local=False,
    testnet=False,
)

sepolia = BlockchainPlatform(
    identifier="sepolia",
    type=MyBlockchainType.EVM,
    chain_id=11155111,
    testnet=True,
)

ganache = BlockchainPlatform(
    identifier="ganache",
    type=MyBlockchainType.EVM,
    local=True,
)

BlockchainPlatform Fields

Field Type Default Description
type BlockchainType required Blockchain ecosystem
local bool False Local dev chain (Ganache, Hardhat)
testnet bool False Test network
chain_id int \| str \| None None Chain ID (EVM) or equivalent

Extending BlockchainType

BlockchainType is an empty enum. Define your own values by subclassing:

from enum import Enum
from financepype.platforms.blockchain import BlockchainType

class ChainType(BlockchainType):
    EVM = "EVM"
    COSMOS = "COSMOS"
    SOLANA = "SOLANA"
    SUI = "SUI"

Comparing Platforms

Platforms support standard Python equality and hashing based on their identifier and additional keyword arguments used during construction.

binance_a = Platform(identifier="binance")
binance_b = Platform(identifier="binance")
assert binance_a == binance_b    # True (same object)
assert hash(binance_a) == hash(binance_b)

different = Platform(identifier="coinbase")
assert binance_a != different

Using Platforms in Context

Platforms are used consistently throughout the framework:

from financepype.platforms.platform import Platform
from financepype.assets.factory import AssetFactory
from financepype.owners.owner import OwnerIdentifier
from financepype.markets.trading_pair import TradingPair

platform = Platform(identifier="binance")

# Assets are scoped to a platform
btc = AssetFactory.get_asset(platform, "BTC")

# Owner identifiers embed the platform
owner = OwnerIdentifier(platform=platform, name="trader1")
print(owner.identifier)  # binance:trader1

# Trading pairs are platform-agnostic (no platform field on TradingPair itself)
# but rules and assets connect them to platforms
pair = TradingPair(name="BTC-USDT")