Aller au contenu

Joe Lend (Banker Joe)

Connector for Joe Lend (Banker Joe) lending protocol (Compound V2 fork on Avalanche).

almanak.framework.connectors.joelend

Joe Lend (Banker Joe) Lending Connector (Compound V2 fork on Avalanche).

This module provides adapters and utilities for interacting with Joe Lend (Banker Joe), a lending/borrowing protocol on Avalanche using the jToken architecture.

Joe Lend Features: - Compound V2-style jToken model - Supply to earn yield (mint jTokens) - Borrow against collateral (enterMarkets + borrow) - Multiple asset markets: AVAX, USDC.e, USDT.e, WETH.e, WBTC.e, DAI.e

Supported Chains: - Avalanche

Example

from almanak.framework.connectors.joelend import ( JoeLendAdapter, JoeLendConfig, JoeLendReceiptParser, )

config = JoeLendConfig( chain="avalanche", wallet_address="0x...", ) adapter = JoeLendAdapter(config)

Supply USDC.e

result = adapter.supply(asset="USDC.e", amount=Decimal("1000"))

Parse receipts

parser = JoeLendReceiptParser(underlying_decimals=6) events = parser.parse_receipt(receipt)

JoeLendAdapter

JoeLendAdapter(
    config: JoeLendConfig,
    token_resolver: TokenResolver | None = None,
)

Adapter for Joe Lend (Banker Joe) lending protocol on Avalanche.

Provides methods to build transactions for supply, withdraw, borrow, and repay operations using the jToken (Compound V2) architecture.

get_market_info

get_market_info(asset: str) -> JoeLendMarketInfo | None

Get market info for an asset.

get_j_token_address

get_j_token_address(asset: str) -> str | None

Get the jToken address for an asset.

get_supported_assets

get_supported_assets() -> list[str]

Get list of supported asset symbols.

supply

supply(asset: str, amount: Decimal) -> TransactionResult

Build a supply (lend) transaction.

For ERC20 tokens: calls mint(uint256) on the jToken. For AVAX: calls mint() payable on jAVAX.

参数:

名称 类型 描述 默认
asset str

Asset symbol (e.g., "USDC", "AVAX")

必需
amount Decimal

Amount in underlying token units (e.g., 1000 USDC)

必需

返回:

类型 描述
TransactionResult

TransactionResult with TX data for execution

withdraw

withdraw(
    asset: str,
    amount: Decimal,
    *,
    withdraw_all: bool = False,
    redeem_amount: int | None = None,
) -> TransactionResult

Build a withdraw transaction.

Calls redeemUnderlying(uint256) on the jToken to withdraw exact underlying amount. For withdraw_all with redeem_amount, uses redeem(uint256) with exact jToken count. For withdraw_all with amount > 0, uses redeemUnderlying(amount_wei) with the tracked amount.

参数:

名称 类型 描述 默认
asset str

Asset symbol

必需
amount Decimal

Amount of underlying to withdraw

必需
withdraw_all bool

If True, withdraw entire balance

False
redeem_amount int | None

Exact jToken amount for redeem() when withdraw_all=True. Not yet wired from the compiler — reserved for future use when the compiler can query on-chain jToken balances.

None

返回:

类型 描述
TransactionResult

TransactionResult with TX data

borrow

borrow(asset: str, amount: Decimal) -> TransactionResult

Build a borrow transaction.

Calls borrow(uint256) on the jToken. Requires collateral to be supplied and enterMarkets() called first.

参数:

名称 类型 描述 默认
asset str

Asset symbol to borrow

必需
amount Decimal

Amount to borrow in underlying units

必需

返回:

类型 描述
TransactionResult

TransactionResult with TX data

repay

repay(
    asset: str, amount: Decimal, *, repay_all: bool = False
) -> TransactionResult

Build a repay transaction.

For ERC20: calls repayBorrow(uint256) on the jToken. For AVAX: calls repayBorrow() payable on jAVAX. For repay_all on ERC20: uses MAX_UINT256 to repay full debt. For repay_all on native AVAX: caller must pass exact debt as amount (MAX_UINT256 trick doesn't apply to msg.value).

参数:

名称 类型 描述 默认
asset str

Asset symbol

必需
amount Decimal

Amount to repay

必需
repay_all bool

If True, repay entire outstanding debt

False

返回:

类型 描述
TransactionResult

TransactionResult with TX data

enter_markets

enter_markets(assets: list[str]) -> TransactionResult

Build an enterMarkets transaction to enable assets as collateral.

参数:

名称 类型 描述 默认
assets list[str]

List of asset symbols to enable as collateral

必需

返回:

类型 描述
TransactionResult

TransactionResult with TX data

exit_market

exit_market(asset: str) -> TransactionResult

Build an exitMarket transaction to remove an asset from collateral.

Note: exitMarket is per-asset (not array), unlike enterMarkets. Will revert if the user has outstanding borrows against this collateral.

参数:

名称 类型 描述 默认
asset str

Asset symbol to remove from collateral

必需

返回:

类型 描述
TransactionResult

TransactionResult with TX data

JoeLendConfig dataclass

JoeLendConfig(
    chain: str = "avalanche",
    wallet_address: str = "",
    default_slippage_bps: int = 50,
)

Configuration for Joe Lend adapter.

JoeLendMarketInfo dataclass

JoeLendMarketInfo(
    asset: str,
    j_token_address: str,
    underlying_address: str | None,
    decimals: int,
    is_native: bool,
)

Information about a Joe Lend market (jToken).

JoeLendPosition dataclass

JoeLendPosition(
    supplied: dict[str, Decimal] = dict(),
    borrowed: dict[str, Decimal] = dict(),
)

User position in Joe Lend.

TransactionResult dataclass

TransactionResult(
    success: bool,
    tx_data: dict[str, Any] | None = None,
    gas_estimate: int = 0,
    description: str = "",
    error: str | None = None,
)

Result of building a transaction.

JoeLendEvent dataclass

JoeLendEvent(
    event_type: JoeLendEventType,
    event_name: str,
    log_index: int,
    transaction_hash: str,
    block_number: int,
    contract_address: str,
    data: dict[str, Any],
    raw_topics: list[str] = list(),
    raw_data: str = "",
    timestamp: datetime = (lambda: datetime.now(UTC))(),
)

Parsed Joe Lend event.

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

from_dict classmethod

from_dict(data: dict[str, Any]) -> JoeLendEvent

Create from dictionary.

JoeLendEventType

Bases: Enum

Joe Lend event types.

JoeLendReceiptParser

JoeLendReceiptParser(
    underlying_decimals: int = 18, **kwargs: Any
)

Parse Joe Lend transaction receipts.

Extracts supply, withdraw, borrow, and repay amounts from Compound V2-style events (Mint, Redeem, Borrow, RepayBorrow).

parse_receipt

parse_receipt(
    receipt: dict[str, Any],
    j_token_address: str | None = None,
) -> ParseResult

Parse a transaction receipt for Joe Lend events.

参数:

名称 类型 描述 默认
receipt dict[str, Any]

Transaction receipt dict with 'logs' field

必需
j_token_address str | None

Optional filter for specific jToken

None

返回:

类型 描述
ParseResult

ParseResult with extracted events and amounts

parse_logs

parse_logs(
    logs: list[dict[str, Any]],
    tx_hash: str = "",
    block_number: int = 0,
) -> list[JoeLendEvent]

Parse a list of log entries into Joe Lend events.

extract_supply_amount

extract_supply_amount(
    receipt: dict[str, Any],
) -> int | None

Extract supply amount from receipt for ResultEnricher.

Called by ResultEnricher for SUPPLY intents (field: supply_amount).

extract_borrow_amount

extract_borrow_amount(
    receipt: dict[str, Any],
) -> int | None

Extract borrow amount from receipt for ResultEnricher.

Called by ResultEnricher for BORROW intents (field: borrow_amount).

extract_withdraw_amount

extract_withdraw_amount(
    receipt: dict[str, Any],
) -> int | None

Extract withdraw amount from receipt for ResultEnricher.

Called by ResultEnricher for WITHDRAW intents (field: withdraw_amount).

extract_repay_amount

extract_repay_amount(receipt: dict[str, Any]) -> int | None

Extract repay amount from receipt for ResultEnricher.

Called by ResultEnricher for REPAY intents (field: repay_amount).

extract_supply_data

extract_supply_data(result: dict[str, Any]) -> dict | None

Extract supply data from receipt (legacy API).

extract_borrow_data

extract_borrow_data(result: dict[str, Any]) -> dict | None

Extract borrow data from receipt (legacy API).

extract_withdraw_data

extract_withdraw_data(
    result: dict[str, Any],
) -> dict | None

Extract withdraw data from receipt (legacy API).

extract_repay_data

extract_repay_data(result: dict[str, Any]) -> dict | None

Extract repay data from receipt (legacy API).

ParseResult dataclass

ParseResult(
    success: bool,
    events: list[JoeLendEvent] = list(),
    supply_amount: Decimal = Decimal("0"),
    withdraw_amount: Decimal = Decimal("0"),
    borrow_amount: Decimal = Decimal("0"),
    repay_amount: Decimal = Decimal("0"),
    j_tokens_minted: Decimal = Decimal("0"),
    j_tokens_redeemed: Decimal = Decimal("0"),
    error: str | None = None,
)

Result of parsing a transaction receipt.

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.