erc_4626.vault_protocol.upshift.offchain_metadata

Documentation for eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata Python module.

Upshift vault offchain metadata.

Upshift’s public vault API provides display metadata that is not available from the vault contracts. In particular, it exposes a vault description, hardcoded_strategists and named operator wallets. The API does not publish a field named curator. We therefore keep strategist and operator identities separate and only expose strategists through the generic vault manager field.

Reference:

Module Attributes

DEFAULT_API_BASE_URL

Canonical Upshift public API root.

DEFAULT_CACHE_DURATION

Refresh vault metadata every two days.

DEFAULT_TIMEOUT

Timeout for one Upshift public API request.

Functions

fetch_upshift_vault_metadata(web3, ...[, ...])

Fetch cached public metadata for one Upshift vault.

Classes

UpshiftAPYOverride

Optional APY-display overrides for an Upshift vault.

UpshiftComposabilityIntegration

External protocol integration for an Upshift receipt token.

UpshiftEOAOperator

Named EOA operator wallet linked to an Upshift vault.

UpshiftHistoricalSnapshot

One historical NAV snapshot from the Upshift API.

UpshiftInstantRedeemConfig

Instant-redemption configuration returned for a vault.

UpshiftInstantRedeemableAsset

One asset accepted by an instant-redemption configuration.

UpshiftNAVPricingOverride

One token NAV pricing override keyed by a TokenSpec-* identifier.

UpshiftOperator

Unlabelled operator address and implementation type.

UpshiftPlatformFeeOverride

Platform-fee override configured for an Upshift vault.

UpshiftReceiptTokenIntegration

Token integration metadata for an Upshift receipt token.

UpshiftReportedAPY

Current APY breakdown reported by Upshift.

UpshiftReward

Reward programme associated with an Upshift vault.

UpshiftSolanaVaultMetadata

Solana-specific metadata returned for an Upshift vault.

UpshiftStellarVaultMetadata

Stellar-specific metadata returned for an Upshift vault.

UpshiftStrategist

Strategy brand configured in Upshift's hardcoded_strategists list.

UpshiftSubaccount

Custody subaccount assigned to a vault.

UpshiftVaultAPIResponse

Complete raw response from Upshift's tokenized-vault endpoint.

UpshiftVaultMetadata

Normalised public metadata for one Upshift vault.

DEFAULT_CACHE_PATH = PosixPath('/home/runner/.tradingstrategy/cache/upshift')

Directory for cached Upshift vault API responses.

DEFAULT_API_BASE_URL = 'https://api.upshift.finance'

Canonical Upshift public API root.

DEFAULT_CACHE_DURATION = datetime.timedelta(days=2)

Refresh vault metadata every two days.

DEFAULT_TIMEOUT = 30.0

Timeout for one Upshift public API request.

class UpshiftAPYOverride

Bases: TypedDict

Optional APY-display overrides for an Upshift vault.

Example response: {"hardcoded_apy": 0.12, "is_show_hardcoded_apy": True}.

hardcoded_apy: Optional[float]

Manual APY shown in the Upshift app. Example: 0.12 for 12%.

is_show_compound_apy: bool

Show compounded APY in the app. Example: False.

is_show_hardcoded_apy: bool

Show hardcoded_apy in the app. Example: True.

is_show_target_apy: bool

Show the vault’s target APY in the app. Example: False.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftPlatformFeeOverride

Bases: TypedDict

Platform-fee override configured for an Upshift vault.

Example response: {"management_fee": 0, "is_fee_waived": False}.

management_fee: Optional[float]

Platform management-fee fraction. Example: 0.

is_fee_waived: bool

Whether Upshift waives the platform fee. Example: False.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftInstantRedeemableAsset

Bases: TypedDict

One asset accepted by an instant-redemption configuration.

Example response: {"symbol": "USCC", "decimals": 6, "spread_bps": 5}.

symbol: str

Asset ticker. Example: "USCC".

address: str

Asset contract address. Example: "0x14d60E7FDC0D71d8611742720E4C50E7a974020c".

decimals: int

Asset decimal places. Example: 6.

spread_bps: Union[int, float]

Instant-redemption spread in basis points. Example: 5.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftInstantRedeemConfig

Bases: TypedDict

Instant-redemption configuration returned for a vault.

Example response: {"output_asset_symbol": "USDC", "is_paused": False, "available_liquidity": 1000000000000}.

subaccount_address: str

Custody subaccount used for instant redemption. Example: "0x1E0e...B4b7".

output_asset_symbol: str

Asset paid to an instant redeemer. Example: "USDC".

is_paused: bool

Whether instant redemption is paused. Example: False.

available_liquidity: Union[int, float]

Raw available output-asset liquidity. Example: 1000000000000.

redeemable_assets: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftInstantRedeemableAsset]

Assets that can be redeemed immediately. Example: one USCC record.

id: str

Upshift instant-redemption configuration UUID. Example: "373efcf4-29de-4c2d-a04c-36607a8a9b90".

tokenized_vault_id: str

Parent vault UUID. Example: "9ae0f5c3-ceb3-4e00-a476-334ccc2c7878".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftNAVPricingOverride

Bases: TypedDict

One token NAV pricing override keyed by a TokenSpec-* identifier.

Example response: {"mode": "hardpeg", "value": 1}.

mode: str

Pricing method. Example: "hardpeg".

value: Union[int, float]

Price override value. Example: 1.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftHistoricalSnapshot

Bases: TypedDict

One historical NAV snapshot from the Upshift API.

Example response: {"block_id": 25396895, "asset_share_ratio": 1.0, "tvl": 0.0}.

asset_share_ratio: float

Vault asset/share ratio. Example: 1.0.

block_id: int

Source blockchain block number. Example: 25396895.

id: str

Snapshot UUID. Example: "fa3d0233-8dec-4a21-814b-b718a581a945".

snapshot_datetime: str

Snapshot timestamp. Example: "2026-06-25T20:01:28.699921".

total_assets: float

Raw vault asset balance. Example: 0.0.

total_shares: float

Raw vault share supply. Example: 0.0.

tvl: float

Upshift-reported TVL in USD. Example: 0.0.

underlying_price: float

Underlying token USD price. Example: 0.999701.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftEOAOperator

Bases: TypedDict

Named EOA operator wallet linked to an Upshift vault.

Example response: {"name": "NEMO USDC Yield Sub 1", "wallet_role": None}.

address: str

Operator wallet address. Example: "0xfb1898bB5955FdD11704e397104c6a0e0725EB17".

id: str

Upshift operator UUID. Example: "e70a2d03-6570-4d7a-a70b-02781cd5b264".

name: str

Operator display name. Example: "NEMO USDC Yield Sub 1".

wallet_role: Optional[str]

Optional assigned wallet role. Example: None.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftStrategist

Bases: TypedDict

Strategy brand configured in Upshift’s hardcoded_strategists list.

Example response: {"strategist_name": "NEMO", "website_url": None}.

id: str

Upshift strategist UUID. Example: "73d92b73-e01d-4bf7-90a4-f0a514c12970".

Strategist logo URL. Example: "https://imagedelivery.net/.../public".

strategist_name: str

Strategist brand name. Example: "NEMO".

website_url: Optional[str]

Strategist website URL. Example: None.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftOperator

Bases: TypedDict

Unlabelled operator address and implementation type.

Example response: {"address": "0x1F6d81a390d74a57C314Ef57Ac0cb6749176Cf3E", "operator_type": "eoa"}.

address: str

Operator address. Example: "0x1F6d81a390d74a57C314Ef57Ac0cb6749176Cf3E".

operator_type: str

Operator implementation type. Example: "eoa".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftSubaccount

Bases: TypedDict

Custody subaccount assigned to a vault.

Example response: {"address": "0xC8c0Ffb8Ff3BDA26321224e800B3B38AEaB48799", "wallet_role": None, "strategist": None}.

address: str

Subaccount address. Example: "0xC8c0Ffb8Ff3BDA26321224e800B3B38AEaB48799".

wallet_role: Optional[str]

Optional wallet role. Example: None.

strategist: Optional[str]

Optional associated strategist. Example: None.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftReward

Bases: TypedDict

Reward programme associated with an Upshift vault.

Example response: {"text": "Upshift Points", "multiplier": 5.0, "end_datetime": None}.

tokenizedvault_id: str

Parent vault UUID. Example: "5dd9319f-9f32-4bfe-a9cb-e12899f48ee0".

created_at: str

Reward record creation timestamp. Example: "2026-05-14T19:18:14.429000".

id: str

Reward UUID. Example: "2fe7671c-a857-4676-af72-8aad8ce47b82".

img_url: Optional[str]

Reward image URL. Example: "".

start_datetime: Optional[str]

Reward programme start timestamp. Example: "2026-05-03T20:00:00".

updated_at: str

Reward record update timestamp. Example: "2026-05-14T19:18:14.429000".

text: str

Human-readable reward description. Example: "Upshift Points".

multiplier: float

Reward multiplier. Example: 5.0.

end_datetime: Optional[str]

Optional reward programme end timestamp. Example: None.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftComposabilityIntegration

Bases: TypedDict

External protocol integration for an Upshift receipt token.

Example response: {"name": "Uniswap", "earning_multiplier": 0.0, "description": "Provide liquidity to UniswapV4 AUSD-earnAUSD 0.01%"}.

name: str

Integrated protocol name. Example: "Uniswap".

description: Optional[str]

Human-readable integration description. Example: "Provide liquidity to UniswapV4 AUSD-earnAUSD 0.01%".

earning_multiplier: float

Additional earning multiplier. Example: 0.0.

protocol_url: Optional[str]

External protocol URL. Example: "https://app.merkl.xyz/opportunities/...".

logo_url: Optional[str]

External protocol logo URL. Example: "https://upload.wikimedia.org/.../Uniswap_Logo.svg.png".

tokenized_vault_id: str

Parent vault UUID. Example: "672db4d8-72cd-46cb-bde3-746d1dd973a8".

id: str

Integration UUID. Example: "1f0bddff-84da-4b08-b528-daafb17d8ec9".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftReceiptTokenIntegration

Bases: TypedDict

Token integration metadata for an Upshift receipt token.

Example response: {"symbol": "USDT", "chain": 1, "is_transferable": True}.

address: str

Integrated token address. Example: "0xdAC17F958D2ee523a2206206994597C13D831ec7".

chain: int

Integrated token EVM chain ID. Example: 1.

shorthand: Optional[str]

Token shorthand. Example: "usdt_eth".

tiingo_ticker: Optional[str]

Tiingo ticker. Example: "usdtusd".

is_transferable: bool

Whether token transfers are enabled. Example: True.

updated_at: str

Integration update timestamp. Example: "2025-03-03T15:40:02.573601".

position_id: Optional[str]

Optional external position ID. Example: None.

token_class: str

Token classification. Example: "TokenSpec".

symbol: str

Token ticker. Example: "USDT".

img_url: Optional[str]

Token image URL. Example: "https://coin-images.coingecko.com/.../Tether.png".

id: str

Integration UUID. Example: "a86f126b-f951-4a00-adb5-14411e691675".

created_at: str

Integration creation timestamp. Example: "2024-06-27T15:17:27.208246".

stable_token_pair_id: Optional[str]

Optional stable-token pair UUID. Example: "b90ac83f-5a4a-475e-8cca-ec81847ef842".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftReportedAPY

Bases: TypedDict

Current APY breakdown reported by Upshift.

Example response: {"apy": 0.1, "underlying_apy": 0.0, "rewards_compounded": 0.0}.

underlying_apy: Optional[float]

Underlying strategy APY. Example: 0.0.

rewards_compounded: Optional[float]

APY from compounded rewards. Example: 0.0.

liquid_apy: Optional[float]

Liquid reward APY. Example: 0.0.

id: str

Report UUID. Example: "78d43044-2c0a-40dd-bbcd-043750ecc38f".

updated_at: str

Report update timestamp. Example: "2025-11-20T18:38:43.474000".

tokenized_vault_id: str

Parent vault UUID. Example: "672db4d8-72cd-46cb-bde3-746d1dd973a8".

apy: Optional[float]

Total reported APY. Example: 0.1 for 10%.

rewards_claimable: Optional[float]

APY from claimable rewards. Example: 0.0.

explainer: Optional[str]

Optional APY methodology explanation. Example: "".

created_at: str

Report creation timestamp. Example: "2025-11-20T18:38:43.474000".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftSolanaVaultMetadata

Bases: TypedDict

Solana-specific metadata returned for an Upshift vault.

Example response: {"deposit_token_symbol": "USDC", "deposit_token_decimals": 6}.

vault_state_pda: str

Solana vault state PDA. Example: "HegTiqVxUvnh3fD9ZA2v7PF3XnoqHgz4ytJRZKdLJ5ra".

share_mint: str

Solana receipt-token mint. Example: "CnhPtD2gHHrUvfuA6HrDdLQBKjGgVL8HZMJNCZdXuWEs".

deposit_mint: str

Solana denomination-token mint. Example: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v".

deposit_token_symbol: str

Denomination-token ticker. Example: "USDC".

deposit_token_decimals: int

Denomination-token decimal places. Example: 6.

program_id: str

Upshift Solana programme ID. Example: "up12bytoZBmwofqsySf2uqKQ7zpfeKiAWwfvqzJjtRt".

id: str

Solana metadata UUID. Example: "8de00f2c-f8c9-4471-a038-6484eca9a067".

tokenized_vault_id: str

Parent vault UUID. Example: "09bd056e-5fd5-47e9-a655-6e844c492341".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftStellarVaultMetadata

Bases: TypedDict

Stellar-specific metadata returned for an Upshift vault.

Example response: {"deposit_token_symbol": "USDC", "network_name": "mainnet"}.

deposit_token_address: str

Stellar denomination-token address. Example: "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75".

deposit_token_symbol: str

Denomination-token ticker. Example: "USDC".

deposit_token_decimals: int

Denomination-token decimal places. Example: 7.

network_name: str

Stellar network name. Example: "mainnet".

utila_vault_id: str

Utila vault identifier. Example: "vaults/7a9612947ff0".

utila_wallet_id: str

Utila wallet identifier. Example: "wallets/d1ab1d873291".

id: str

Stellar metadata UUID. Example: "0d6aee1e-37b5-412d-8e99-b050c0f806e5".

tokenized_vault_id: str

Parent vault UUID. Example: "139fab4b-278d-4f1a-b338-cfcb67b01921".

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftVaultAPIResponse

Bases: TypedDict

Complete raw response from Upshift’s tokenized-vault endpoint.

All 61 documented top-level fields were observed in the live response for NEMO USDC Prime on 2026-07-23. Nested structures are modelled by the associated Upshift* TypedDicts above.

Reference:

address: str

Vault deployment address. Example: "0x955256B31097dDf47a9E47A95aDfDFB4460D8522".

yield_distributor: Optional[str]

Optional yield-distributor address. Example: None.

chain: int

EVM chain ID. Example: 1 for Ethereum mainnet.

description: Optional[str]

Vault strategy description. Example: "NEMO USDC Prime is an automated, multi-strategy...".

internal_type: str

Upshift implementation family. Example: "multiAssetVault".

public_type: Optional[str]

Marketplace product category. Example: "DeFi Yield".

Whether Upshift highlights the vault. Example: False.

is_visible: Optional[bool]

Whether Upshift displays the vault publicly. Example: True.

weekly_performance_fee_bps: Optional[float]

Weekly performance fee in basis points. Example: 20.0.

platform_fee_override: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftPlatformFeeOverride]

Optional platform-fee override. Example: {"management_fee": 0, "is_fee_waived": False}.

start_datetime: Optional[str]

Vault creation timestamp. Example: "2026-06-25T10:19:00".

vault_name: Optional[str]

Upshift display name. Example: "NEMO USDC Prime".

reserve_target: Optional[float]

Target reserve amount. Example: 0.0.

reserve_tolerance: Optional[float]

Allowed reserve variation. Example: 0.0.

withdrawal_alert_threshold: Optional[float]

Withdrawal-alert threshold. Example: None.

withdrawal_alert_channels: Optional[str]

Withdrawal-alert channel selection. Example: "both".

status: str

Vault lifecycle status. Example: "active".

is_charge_fees_manual: bool

Whether fee charging requires a manual action. Example: False.

receipt_token_symbol: Optional[str]

Receipt-token symbol. Example: "NEMO USDC Yield".

enable_external_assets_update: bool

Whether external asset updates are enabled. Example: False.

is_distributor_fee_wrapper: bool

Whether the vault wraps distributor fees. Example: False.

vault_logo_url: Optional[str]

Vault logo URL. Example: "https://imagedelivery.net/.../nemoicon-light.svg/public".

risk: Optional[str]

Risk label set by Upshift. Example: None.

max_daily_drawdown: Optional[float]

Maximum daily drawdown fraction. Example: None.

chain_type: str

Chain family. Example: "evm".

enabled_historical_price_horizons: list[int]

Historical APY windows in days. Example: [7, 30].

is_spotlighted: bool

Whether Upshift spotlights the vault. Example: False.

show_cap_filled: bool

Whether Upshift shows a filled-cap indicator. Example: False.

withdrawal_only: bool

Whether only withdrawals are currently enabled. Example: False.

historical_apy: dict[str, float]

Historical simple APY keyed by horizon days. Example: {"7": 0.31189842638050264}.

default_apy_horizon: Optional[int]

Default APY horizon in days. Example: 7.

management_fee_waived_until_date: Optional[str]

Management-fee waiver expiry timestamp. Example: None.

management_fee_waived_until_tvl: Optional[float]

Management-fee waiver TVL threshold. Example: None.

performance_fee_waived_until_date: Optional[str]

Performance-fee waiver expiry timestamp. Example: None.

performance_fee_waived_until_tvl: Optional[float]

Performance-fee waiver TVL threshold. Example: None.

nav_base_asset_token_id: Optional[str]

NAV base-token metadata identifier. Example: None.

nav_pricing_overrides: Optional[dict[str, eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftNAVPricingOverride]]

Token pricing overrides keyed by TokenSpec-*. Example: {"TokenSpec-1-0xA0b8...": {"mode": "hardpeg", "value": 1}}.

apy_override: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftAPYOverride]

Optional APY display overrides. Example: {"hardcoded_apy": 0.12, "is_show_hardcoded_apy": True}.

max_drawdown: Optional[float]

Largest historical drawdown fraction. Example: 0.0002156861650454448.

latest_reported_tvl: Optional[float]

Latest reported TVL in USD. Example: 3591665.1170049477.

campaign_apy: Optional[float]

Campaign APY override. Example: None.

metrics_last_updated: Optional[str]

Metrics calculation timestamp. Example: "2026-07-23T17:01:41.120995".

id: str

Upshift vault UUID. Example: "58c28ee6-aff6-49e0-9291-625f9f82e90f".

solana_vault_metadata: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftSolanaVaultMetadata]

Solana-specific metadata. Example: None for an EVM vault.

stellar_vault_metadata: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftStellarVaultMetadata]

Stellar-specific metadata. Example: None for an EVM vault.

instant_redeem_config: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftInstantRedeemConfig]

Optional instant-redemption configuration. Example: None.

view_type: Optional[str]

App visibility mode. Example: "all".

rewards: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftReward]

Reward programmes. Example: one {"text": "Upshift Points", "multiplier": 5.0} record.

reported_apy: Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftReportedAPY]

Current APY breakdown. Example: None.

receipt_token_integrations: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftReceiptTokenIntegration]

Receipt-token integration metadata. Example: [].

hardcoded_strategists: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftStrategist]

Strategy brands. Example: one {"strategist_name": "NEMO"} record.

composability_integrations: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftComposabilityIntegration]

External composability integrations. Example: [].

cached_at: Optional[str]

API cache timestamp. Example: None.

historical_snapshots: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftHistoricalSnapshot]

Historical NAV snapshots. Example: one {"block_id": 25396895, "tvl": 0.0} record.

subaccounts: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftSubaccount]

Vault custody subaccounts. Example: [].

eoa_operators: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftEOAOperator]

Named EOA operator wallets. Example: one {"name": "NEMO USDC Yield Sub 1"} record.

historical_compound_apy: dict[str, float]

Historical compounded APY keyed by horizon days. Example: {"7": 0.3647473251285198}.

tvl: Optional[float]

Current reported TVL in USD. Example: 3591665.1170049477.

pnl_per_share: dict[str, float]

Return per share keyed by horizon days. Example: {"7": 0.005170042919987905}.

daily_pnl_per_share: dict[str, float]

Daily return per share keyed by timestamp. Example: {"2026-07-23T00:00:00": 0.0008179999999999854}.

operators: list[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftOperator]

Contract operators. Example: one {"operator_type": "eoa"} record.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

class UpshiftVaultMetadata

Bases: TypedDict

Normalised public metadata for one Upshift vault.

The data is sourced from GET /v1/tokenized_vaults/{address}. Upshift’s hardcoded_strategists identifies a strategy brand, not a curator role, so it is represented as strategist_names rather than mislabelled as curator data.

Reference:

chain_id: int

EVM chain ID reported by Upshift.

vault_address: eth_typing.evm.HexAddress

Checksummed vault contract address.

name: Optional[str]

Display name configured in Upshift, if any.

description: Optional[str]

Full strategy description configured in Upshift, if any.

strategist_names: tuple[str, ...]

Strategy brands from the API’s hardcoded_strategists records.

operator_names: tuple[str, ...]

Human-readable names of EOA operator wallets.

status: Optional[str]

Vault lifecycle status, such as "active" or "closed".

internal_type: Optional[str]

Upshift implementation family, such as "multiAssetVault".

is_visible: Optional[bool]

Whether Upshift currently displays the vault in its frontend.

__init__(*args, **kwargs)
__new__(**kwargs)
clear()

Remove all items from the dict.

copy()

Return a shallow copy of the dict.

fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items()

Return a set-like object providing a view on the dict’s items.

keys()

Return a set-like object providing a view on the dict’s keys.

pop(k[, d]) v, remove specified key and return the corresponding value.

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

Return an object providing a view on the dict’s values.

fetch_upshift_vault_metadata(web3, vault_address, *, cache_path=PosixPath('/home/runner/.tradingstrategy/cache/upshift'), api_base_url='https://api.upshift.finance', now_=None, max_cache_duration=datetime.timedelta(days=2), timeout=30.0)

Fetch cached public metadata for one Upshift vault.

Reads GET /v1/tokenized_vaults/{address} from Upshift’s public API and caches its raw response by EVM chain and vault address. A failed refresh returns a valid stale cache when one exists, so a temporary API outage does not remove already-discovered vault descriptions or strategist identities.

The API exposes named strategists and EOA operators, but no explicit curator field. Callers must not interpret either as a verified curator record without separate registry evidence.

Parameters
  • web3 (web3.main.Web3) – Web3 connection used only to obtain the EVM chain ID.

  • vault_address (Union[eth_typing.evm.HexAddress, str]) – Upshift vault deployment address.

  • cache_path (pathlib.Path) – Directory for cached raw JSON responses.

  • api_base_url (str) – Upshift API root. Override this with a test server URL in tests.

  • now – Optional current naive UTC timestamp for cache-expiry tests.

  • max_cache_duration (datetime.timedelta) – Maximum age of a cache response before refreshing it.

  • timeout (float) – HTTP timeout in seconds.

  • now_ (Optional[datetime.datetime]) –

Returns

Parsed vault metadata, or None when Upshift has no accessible matching record.

Return type

Optional[eth_defi.erc_4626.vault_protocol.upshift.offchain_metadata.UpshiftVaultMetadata]