Skip to content

Commit ab7b61a

Browse files
refactor(ecosystem): move hardcoded addresses to settings for consistency
1 parent 90ea966 commit ab7b61a

File tree

6 files changed

+132
-44
lines changed

6 files changed

+132
-44
lines changed

src/flare_ai_kit/ecosystem/applications/cyclo.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Cyclo protocol connector for non-liquidating leverage on Flare."""
22

3-
from typing import TYPE_CHECKING, Final, Self
3+
from typing import TYPE_CHECKING, Self
44

55
import structlog
66
from eth_typing import ChecksumAddress
@@ -21,16 +21,8 @@ class Cyclo(Flare):
2121
2222
Cyclo allows users to lock collateral (sFLR) and mint cy* tokens that trade
2323
between $0-$1. Users can unlock collateral by burning cy* tokens + receipt NFTs.
24-
25-
Contract addresses (Flare mainnet):
26-
- cysFLR Vault: 0x19831cfB53A0dbeAD9866C43557C1D48DfF76567
27-
- cysFLR Receipt: 0xd387FC43E19a63036d8FCeD559E81f5dDeF7ef09
2824
"""
2925

30-
# Cyclo contract addresses on Flare mainnet
31-
CYSFLR_VAULT: Final[str] = "0x19831cfB53A0dbeAD9866C43557C1D48DfF76567"
32-
CYSFLR_RECEIPT: Final[str] = "0xd387FC43E19a63036d8FCeD559E81f5dDeF7ef09"
33-
3426
def __init__(self, settings: EcosystemSettings) -> None:
3527
"""Initialize Cyclo connector."""
3628
super().__init__(settings)
@@ -56,22 +48,38 @@ async def create(cls, settings: EcosystemSettings) -> Self:
5648
logger.info("Initializing Cyclo...")
5749

5850
try:
51+
# Get addresses from settings
52+
vault_address = (
53+
settings.contracts.coston2.cyclo_cysflr_vault
54+
if settings.is_testnet
55+
else settings.contracts.flare.cyclo_cysflr_vault
56+
)
57+
receipt_address = (
58+
settings.contracts.coston2.cyclo_cysflr_receipt
59+
if settings.is_testnet
60+
else settings.contracts.flare.cyclo_cysflr_receipt
61+
)
62+
63+
if not vault_address or not receipt_address:
64+
msg = "Cyclo contract addresses not configured in settings"
65+
raise CycloError(msg)
66+
5967
# Initialize cysFLR vault contract
6068
instance.vault_contract = instance.w3.eth.contract( # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
61-
address=instance.w3.to_checksum_address(cls.CYSFLR_VAULT),
69+
address=instance.w3.to_checksum_address(vault_address),
6270
abi=load_abi("CycloVaultSFLR"),
6371
)
6472

6573
# Initialize cysFLR receipt contract (ERC1155)
6674
instance.receipt_contract = instance.w3.eth.contract( # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
67-
address=instance.w3.to_checksum_address(cls.CYSFLR_RECEIPT),
75+
address=instance.w3.to_checksum_address(receipt_address),
6876
abi=load_abi("CycloReceiptSFLR"),
6977
)
7078

7179
logger.debug(
7280
"Cyclo initialized",
73-
vault_address=cls.CYSFLR_VAULT,
74-
receipt_address=cls.CYSFLR_RECEIPT,
81+
vault_address=vault_address,
82+
receipt_address=receipt_address,
7583
)
7684
return instance # noqa: TRY300
7785

src/flare_ai_kit/ecosystem/applications/firelight.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Firelight XRP staking protocol connector for Flare Network."""
22

3-
from typing import TYPE_CHECKING, Final
3+
from typing import TYPE_CHECKING
44

55
from eth_typing import ChecksumAddress
66
from structlog import get_logger
@@ -20,8 +20,6 @@
2020
class Firelight(Flare):
2121
"""Firelight XRP staking protocol connector (stXRP vault)."""
2222

23-
STXRP_VAULT: Final[str] = "0x4C18Ff3C89632c3Dd62E796c0aFA5c07c4c1B2b3"
24-
2523
def __init__(self, settings: EcosystemSettings) -> None:
2624
super().__init__(settings)
2725
self.vault_contract: Contract | None = None
@@ -44,12 +42,22 @@ async def create(cls, settings: EcosystemSettings) -> "Self":
4442
instance = cls(settings)
4543
logger.info("Initializing Firelight stXRP vault...")
4644
try:
45+
# Get address from settings
46+
vault_address = (
47+
settings.contracts.coston2.firelight_stxrp_vault
48+
if settings.is_testnet
49+
else settings.contracts.flare.firelight_stxrp_vault
50+
)
51+
if not vault_address:
52+
msg = "Firelight stXRP vault address not configured in settings"
53+
raise FirelightError(msg)
54+
4755
instance.vault_contract = instance.w3.eth.contract( # pyright: ignore[reportAttributeAccessIssue]
48-
address=instance.w3.to_checksum_address(cls.STXRP_VAULT),
56+
address=instance.w3.to_checksum_address(vault_address),
4957
abi=load_abi("FirelightVault_Implementation"), # Use implementation ABI
5058
)
5159
logger.debug(
52-
"Firelight stXRP vault initialized", contract_address=cls.STXRP_VAULT
60+
"Firelight stXRP vault initialized", contract_address=vault_address
5361
)
5462
return instance # noqa: TRY300
5563
except Exception as e:

src/flare_ai_kit/ecosystem/applications/kinetic.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Kinetic lending protocol connector for Flare Network."""
22

3-
from typing import TYPE_CHECKING, Final
3+
from typing import TYPE_CHECKING
44

55
from eth_typing import ChecksumAddress
66
from structlog import get_logger
@@ -20,8 +20,6 @@
2020
class Kinetic(Flare):
2121
"""Kinetic lending protocol connector (ksFLR market)."""
2222

23-
KSFLR_MARKET: Final[str] = "0x291487beC339c2fE5D83DD45F0a15EFC9Ac45656"
24-
2523
def __init__(self, settings: EcosystemSettings) -> None:
2624
super().__init__(settings)
2725
self.ksflr_contract: Contract | None = None
@@ -44,12 +42,22 @@ async def create(cls, settings: EcosystemSettings) -> "Self":
4442
instance = cls(settings)
4543
logger.info("Initializing Kinetic ksFLR market...")
4644
try:
45+
# Get address from settings
46+
ksflr_address = (
47+
settings.contracts.coston2.kinetic_ksflr
48+
if settings.is_testnet
49+
else settings.contracts.flare.kinetic_ksflr
50+
)
51+
if not ksflr_address:
52+
msg = "Kinetic ksFLR contract address not configured in settings"
53+
raise KineticError(msg)
54+
4755
instance.ksflr_contract = instance.w3.eth.contract( # pyright: ignore[reportAttributeAccessIssue]
48-
address=instance.w3.to_checksum_address(cls.KSFLR_MARKET),
56+
address=instance.w3.to_checksum_address(ksflr_address),
4957
abi=load_abi("KineticKToken"),
5058
)
5159
logger.debug(
52-
"Kinetic ksFLR market initialized", contract_address=cls.KSFLR_MARKET
60+
"Kinetic ksFLR market initialized", contract_address=ksflr_address
5361
)
5462
return instance # noqa: TRY300
5563
except Exception as e:

src/flare_ai_kit/ecosystem/applications/sceptre.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Sceptre liquid staking connector for Flare Network."""
22

3-
from typing import TYPE_CHECKING, Final
3+
from typing import TYPE_CHECKING
44

55
from eth_typing import ChecksumAddress
66
from structlog import get_logger
@@ -20,8 +20,6 @@
2020
class Sceptre(Flare):
2121
"""Sceptre liquid staking connector (stake FLR → receive sFLR)."""
2222

23-
SFLR_CONTRACT: Final[str] = "0x12e605bc104e93B45e1aD99F9e555f659051c2BB"
24-
2523
def __init__(self, settings: EcosystemSettings) -> None:
2624
super().__init__(settings)
2725
self.sflr_contract: Contract | None = None
@@ -44,12 +42,22 @@ async def create(cls, settings: EcosystemSettings) -> "Self":
4442
instance = cls(settings)
4543
logger.info("Initializing Sceptre sFLR connector...")
4644
try:
45+
# Get address from settings
46+
sflr_address = (
47+
settings.contracts.coston2.sceptre_sflr
48+
if settings.is_testnet
49+
else settings.contracts.flare.sceptre_sflr
50+
)
51+
if not sflr_address:
52+
msg = "Sceptre sFLR contract address not configured in settings"
53+
raise SceptreError(msg)
54+
4755
instance.sflr_contract = instance.w3.eth.contract( # pyright: ignore[reportAttributeAccessIssue]
48-
address=instance.w3.to_checksum_address(cls.SFLR_CONTRACT),
56+
address=instance.w3.to_checksum_address(sflr_address),
4957
abi=load_abi("SceptreSFLR"),
5058
)
5159
logger.debug(
52-
"Sceptre sFLR connector initialized", contract_address=cls.SFLR_CONTRACT
60+
"Sceptre sFLR connector initialized", contract_address=sflr_address
5361
)
5462
return instance # noqa: TRY300
5563
except Exception as e:

src/flare_ai_kit/ecosystem/applications/stargate.py

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@ class Stargate(Flare):
2020
# Flare Network (endpointID: 30295)
2121
FLARE_ENDPOINT_ID: Final[int] = 30295
2222

23-
# Stargate OFT Token Addresses on Flare
24-
STARGATE_ETH: Final[str] = "0x8e8539e4CcD69123c623a106773F2b0cbbc58746"
25-
STARGATE_USDC: Final[str] = "0x77C71633C34C3784ede189d74223122422492a0f"
26-
STARGATE_USDT: Final[str] = "0x1C10CC06DC6D35970d1D53B2A23c76ef370d4135"
27-
28-
TOKEN_MESSAGING: Final[str] = "0x45d417612e177672958dC0537C45a8f8d754Ac2E"
29-
TREASURER: Final[str] = "0x090194F1EEDc134A680e3b488aBB2D212dba8c01"
30-
3123
# Common Destination Chains
3224
CHAINS: Final[dict[str, int]] = {
3325
"ethereum": 30101,
@@ -44,6 +36,7 @@ class Stargate(Flare):
4436

4537
def __init__(self, settings: EcosystemSettings) -> None:
4638
super().__init__(settings)
39+
self.settings = settings
4740

4841
@classmethod
4942
async def create(cls, settings: EcosystemSettings) -> "Self":
@@ -63,12 +56,28 @@ async def create(cls, settings: EcosystemSettings) -> "Self":
6356
instance = cls(settings)
6457
logger.info("Initializing Stargate bridge connector...")
6558
try:
59+
# Verify addresses are configured
60+
contracts = (
61+
settings.contracts.coston2
62+
if settings.is_testnet
63+
else settings.contracts.flare
64+
)
65+
if not all(
66+
[
67+
contracts.stargate_token_messaging,
68+
contracts.stargate_treasurer,
69+
contracts.stargate_eth_oft,
70+
contracts.stargate_usdc_oft,
71+
contracts.stargate_usdt_oft,
72+
]
73+
):
74+
msg = "Stargate contract addresses not configured in settings"
75+
raise StargateError(msg)
76+
6677
logger.debug(
6778
"Stargate connector initialized",
6879
endpoint_id=cls.FLARE_ENDPOINT_ID,
69-
eth_oft=cls.STARGATE_ETH,
70-
usdc_oft=cls.STARGATE_USDC,
71-
usdt_oft=cls.STARGATE_USDT,
80+
network="testnet" if settings.is_testnet else "mainnet",
7281
)
7382
return instance # noqa: TRY300
7483
except Exception as e:
@@ -94,13 +103,19 @@ def get_oft_address(self, token: str) -> str:
94103
>>> print(f"USDC OFT: {oft_addr}")
95104
96105
"""
106+
contracts = (
107+
self.settings.contracts.coston2
108+
if self.settings.is_testnet
109+
else self.settings.contracts.flare
110+
)
111+
97112
token_upper = token.upper()
98113
if token_upper == "ETH":
99-
return self.STARGATE_ETH
114+
return str(contracts.stargate_eth_oft)
100115
if token_upper == "USDC":
101-
return self.STARGATE_USDC
116+
return str(contracts.stargate_usdc_oft)
102117
if token_upper == "USDT":
103-
return self.STARGATE_USDT
118+
return str(contracts.stargate_usdt_oft)
104119
msg = f"Unsupported token: {token}. Supported: ETH, USDC, USDT"
105120
raise StargateError(msg)
106121

@@ -168,11 +183,16 @@ def get_bridge_info(self) -> dict[str, str | int | list[str]]:
168183
>>> print(f"Flare endpoint: {info['endpoint_id']}")
169184
170185
"""
186+
contracts = (
187+
self.settings.contracts.coston2
188+
if self.settings.is_testnet
189+
else self.settings.contracts.flare
190+
)
171191
return { # pyright: ignore[reportReturnType]
172192
"network": "Flare",
173193
"endpoint_id": self.FLARE_ENDPOINT_ID,
174-
"token_messaging": self.TOKEN_MESSAGING,
175-
"treasurer": self.TREASURER,
194+
"token_messaging": str(contracts.stargate_token_messaging),
195+
"treasurer": str(contracts.stargate_treasurer),
176196
"supported_tokens": self.get_supported_tokens(),
177197
"supported_chains": self.get_supported_chains(),
178198
}

src/flare_ai_kit/ecosystem/settings.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ class ContractAddresses(BaseModel):
2121
sparkdex_swap_router: ChecksumAddress | None = None
2222
kinetic_comptroller: ChecksumAddress | None = None
2323
kinetic_ksflr: ChecksumAddress | None = None
24+
sceptre_sflr: ChecksumAddress | None = None
25+
cyclo_cysflr_vault: ChecksumAddress | None = None
26+
cyclo_cysflr_receipt: ChecksumAddress | None = None
27+
firelight_stxrp_vault: ChecksumAddress | None = None
28+
stargate_token_messaging: ChecksumAddress | None = None
29+
stargate_treasurer: ChecksumAddress | None = None
30+
stargate_eth_oft: ChecksumAddress | None = None
31+
stargate_usdc_oft: ChecksumAddress | None = None
32+
stargate_usdt_oft: ChecksumAddress | None = None
2433

2534

2635
class Contracts(BaseModel):
@@ -40,6 +49,33 @@ class Contracts(BaseModel):
4049
kinetic_ksflr=cast(
4150
"ChecksumAddress", "0x291487beC339c2fE5D83DD45F0a15EFC9Ac45656"
4251
),
52+
sceptre_sflr=cast(
53+
"ChecksumAddress", "0x12e605bc104e93B45e1aD99F9e555f659051c2BB"
54+
),
55+
cyclo_cysflr_vault=cast(
56+
"ChecksumAddress", "0x19831cfB53A0dbeAD9866C43557C1D48DfF76567"
57+
),
58+
cyclo_cysflr_receipt=cast(
59+
"ChecksumAddress", "0xd387FC43E19a63036d8FCeD559E81f5dDeF7ef09"
60+
),
61+
firelight_stxrp_vault=cast(
62+
"ChecksumAddress", "0x4C18Ff3C89632c3Dd62E796c0aFA5c07c4c1B2b3"
63+
),
64+
stargate_token_messaging=cast(
65+
"ChecksumAddress", "0x45d417612e177672958dC0537C45a8f8d754Ac2E"
66+
),
67+
stargate_treasurer=cast(
68+
"ChecksumAddress", "0x090194F1EEDc134A680e3b488aBB2D212dba8c01"
69+
),
70+
stargate_eth_oft=cast(
71+
"ChecksumAddress", "0x8e8539e4CcD69123c623a106773F2b0cbbc58746"
72+
),
73+
stargate_usdc_oft=cast(
74+
"ChecksumAddress", "0x77C71633C34C3784ede189d74223122422492a0f"
75+
),
76+
stargate_usdt_oft=cast(
77+
"ChecksumAddress", "0x1C10CC06DC6D35970d1D53B2A23c76ef370d4135"
78+
),
4379
)
4480
coston2: ContractAddresses = ContractAddresses()
4581

0 commit comments

Comments
 (0)