🐍 fyuz-sdk (Python)
Typed, zero-dependency Python client for the Fyuz bonding-curve launchpad on BNB Smart Chain.
Homepage · API · Repository · TypeScript · Go · Rust
Fyuz tokens trade on an internal bonding curve until they reach a $30,000 market cap, then
graduate into a PancakeSwap V2 pair. Before graduation there is no DEX pool anywhere on chain, so
this API is the only source of price, liquidity and curve state for a pre-graduation token. This
package wraps every one of its 28 read-only endpoints in frozen dataclasses, and builds unsigned
bonding-curve transactions your own wallet signs. Standard library only — urllib, json,
dataclasses. No requests, no httpx, no pydantic, no web3.
📦 Install
pip install fyuz-sdk # import name: fyuz
From a checkout of this repository:
pip install /path/to/fyuz/sdk/python
Requires Python 3.9+. Ships a py.typed marker, so mypy and Pyright see the annotations.
⚡ Quickstart
from fyuz import FyuzClient
with FyuzClient() as fyuz:
print(fyuz.health().status) # 'ok'
# One dense row per token: cap, volume, holders, graduation progress.
for t in fyuz.discover(tab="trending", limit=3):
print(f"{t.symbol:<8} ${t.marketcap:>10,.0f} {t.graduation_pct:5.1f}% to graduation")
# Full curve state for one token — prices stay exact decimal strings.
detail = fyuz.get_token("bsc", "0x42322852a918f94186b7dfda2e0e3f4ad3528480")
token = detail.token_details
print(token.token_symbol, token.price, token.graduated)
Real output, run against https://api.fyuz.fun:
ok
PROGI $ 4,473 14.9% to graduation
TUTACO $ 4,473 14.9% to graduation
SRIRA $ 4,473 14.9% to graduation
KIMKACHU 7.853031083E-9 False
🏆 Why this SDK
| 🧬 Four SDKs, one behaviour | TypeScript, Go, Python and Rust ship the same API and the same semantics. Pick a language, not a feature set. |
| 🔬 Fork-tested against the real contract | Not just stubs: ../scripts/fork-test.sh forks BNB Smart Chain and runs all four suites against the deployed Fyuz proxy 0x33a98bef6496684a8dac83734d9ceb0cefc7019c. |
| 🧊 One behaviour, checked field by field | Each SDK writes a conformance record on the fork, and ../scripts/fork-test.sh compares every leaf field across all four — same quotes, same calldata, same decoded pool state, wei for wei. |
| 🎯 Quotes checked on the real curve | Every quote is verified against getSwapOutput on chain. Exact-tokens pricing was verified correct to the wei by bisecting the deployed contract. |
| 💥 Reverts classified from real revert data | The error table is driven by payloads the live contract returned — SwapExpired 0x2b32713d, SlippageExceeded 0x8199f5f3 — not by fixtures someone typed. |
| 🧪 Hermetic offline suite | 177 Python tests, no network required (164 TypeScript, 100 Go, 130 Rust + 47 doctests alongside). |
| 🔐 Never signs, never broadcasts | The SDK builds {chainId, to, data, value} and stops. Your key never enters this package — which is also why it needs no crypto dependency. |
| 🔄 No release needed for a proxy upgrade | Contract address, chain id and RPC come from GET /config at runtime. A new chain or an upgraded proxy needs no new SDK. |
🎓 What "graduation" means
pair_address is None and no DEX pool exists anywhere until a token graduates at a $30,000 market
cap. Nothing on PancakeSwap, DexScreener or any aggregator will show a pre-graduation token, because
it does not exist there yet.
pool_type is 1 for PancakeSwap V2, 2 for V3 and 3 for V4 — direct launches, which skip the
bonding curve entirely, also report 3, and are told apart by launched_at / graduated rather
than by this field. The API types it as a plain integer with no enum, so treat the set as open and
always handle an unrecognised value.
network is the chain slug. The API serves BNB Smart Chain ("bsc", chain 56) and Robinhood Chain
(chain 4663); every token today is on BSC.
🔢 Precision: decimal fields are strings, and they stay strings
Token amounts, prices, market caps and every *_wei value arrive as decimal strings, because
18-decimal values and uint256 wei amounts do not survive a round trip through a 64-bit float:
>>> float("123456789.123456789123456789")
123456789.12345679 # four digits gone, silently
This SDK keeps them as str in the models and never parses them into float. When you need
arithmetic, use the opt-in helpers — they go through decimal.Decimal and are exact:
from fyuz import to_decimal, wei_to_bnb
mcap = to_decimal(token.marketcap) # Decimal('4566.671076655321500000')
paid = wei_to_bnb(stats.total_paid_wei) # Decimal BNB, no rounding
Aggregates computed server-side — volume_usd, points, reward_eth, pot_bnb, everything on
DiscoverToken, Portfolio, WalletStats and the analytics endpoints — are genuine float values
on the wire and are typed as float here.
Timestamps: Trade.date, KingReign.started_at, RoundReceipt.time_end and friends are int UNIX
seconds. Token.created_at / updated_at / launched_at / creation_time and
ChatMessage.date are RFC-3339 strings. Convert either with from_unix() / parse_datetime().
| Helper | Purpose |
|---|---|
to_decimal(str) |
Decimal-string field → exact Decimal |
wei_to_bnb(str) |
Wei decimal string → exact Decimal BNB |
parse_datetime(str) |
RFC-3339 field → aware datetime |
from_unix(int) |
UNIX-seconds field → aware UTC datetime |
All four pass None straight through, so nullable fields stay nullable.
⚠️ None is not 0
Several fields are nullable and their None means unknown, not zero — usually because an RPC
read failed or an on-chain settlement has not been indexed yet. Rendering them as 0 is a
correctness bug:
| Field | None means |
|---|---|
Pot.pot_bnb, Pot.total_points |
RPC unreachable / no Distributor configured — hide the figure |
Claimable.claimable_wei |
Unknown — hide the banner, do not say "nothing owed" |
TokenDetail.curve_holding |
The chain read failed — the curve balance is unknown |
RoundReceipt.pot_wei / distributed_wei / winner_amount_wei |
Settlement not indexed yet |
Token.pair_address, Token.launched_at |
The token has not graduated |
KingReign.ended_at |
The reign is still running |
📚 API surface
All 28 endpoints are unauthenticated and read-only.
Market data, trades and analytics — 12 methods
| Method | Endpoint | Returns |
|---|---|---|
health() |
GET /health |
HealthStatus |
get_config() |
GET /config |
ChainConfig |
discover(...) |
GET /discover |
List[DiscoverToken] |
list_tokens(...) |
GET /tokens |
TokenPage |
iter_tokens(...) |
GET /tokens (all pages) |
Iterator[Token] |
get_king() |
GET /tokens/king |
Optional[Token] |
get_token(network, token_address, ...) |
GET /tokens/{network}/{tokenAddress} |
TokenDetail |
get_recent_trades(...) |
GET /trades/recent |
RecentTrades |
get_token_trades(token_address, ...) |
POST /trades |
List[Trade] |
get_chart_data(token_address, interval, from_ts, to_ts, ...) |
GET /trades/getChartData |
List[Candle] |
get_token_analytics(network, address) |
GET /analytics/token/{network}/{address} |
TokenAnalytics |
get_top_traders(network, address) |
GET /analytics/top-traders/{network}/{address} |
List[TopTrader] |
POST /trades is a POST only because the token address travels in the body. It is unauthenticated,
read-only and safe to poll.
Wallets, leaderboards and rewards — 10 methods
| Method | Endpoint | Returns |
|---|---|---|
get_wallet(address) |
GET /wallet/{address} |
WalletStats |
get_portfolio(address) |
GET /portfolio/{address} |
Portfolio |
get_user_leaderboard(limit=...) |
GET /users/leaderboard |
List[LeaderboardEntry] |
get_user_profile(address) |
GET /users/profile/{address} |
UserProfile |
get_top_holders(count, ...) |
GET /users/top/{count} |
List[TopHolderEntry] |
get_kings_history() |
GET /kings/history |
List[KingReign] |
get_season() |
GET /season |
Season |
get_referral_leaderboard(limit=...) |
GET /referrals/leaderboard |
List[ReferralLeaderEntry] |
get_tier(address) |
GET /tier/{address} |
TierInfo |
get_rewards(address) |
GET /rewards/{address} |
Rewards |
Distributor — client.distributor.*, 7 methods
Fyuz streams a 0.3% leaderboard fee into a Distributor contract. Every round it pays 90% of the pot pro-rata by points and hands the remainder to a Chainlink-VRF-picked winner.
| Method | Endpoint | Returns |
|---|---|---|
distributor.get_stats() |
GET /distributor/stats |
PayoutStats |
distributor.get_pot() |
GET /distributor/pot |
Pot |
distributor.get_shares(...) |
GET /distributor/shares |
Shares |
distributor.list_rounds(...) |
GET /distributor/rounds |
List[RoundReceipt] |
distributor.get_round(round_id) |
GET /distributor/rounds/{id} |
RoundDetail |
distributor.get_payouts(address) |
GET /distributor/payouts/{address} |
AddressPayouts |
distributor.get_claimable(address) |
GET /distributor/claimable/{address} |
Claimable |
Offline address book — fyuz_address, chain_addresses, known_chains
GET /config stays the authority at runtime. The address book is for what that lookup cannot do:
a verified address before any server is reachable, or when you have deliberately decided not to
trust the API for the to of a transaction that moves money.
from fyuz import fyuz_address, chain_addresses, known_chains, BSC
fyuz_address(56) # '0x33a98bef6496684a8dac83734d9ceb0cefc7019c'
chain_addresses("bsc").rpc_url # 'https://bsc-dataseed.bnbchain.org'
BSC.distributor # '0x2c88255f6a80296a3aa8c328e5ff308d74615c7b'
[c.network for c in known_chains()]
Every address is lower-cased, matching what normalize_address() produces, so a plain == against
SDK output is correct. tests/test_addresses.py asserts these constants against
shared/addresses/, so the two cannot drift.
📄 Pagination
list_tokens() returns one page plus token_count. iter_tokens() walks every page lazily — pages
are fetched on demand, so breaking out of the loop stops the requests:
for token in fyuz.iter_tokens(search_word="pepe", page_size=100):
if token.graduated:
print(token.token_symbol, token.pair_address)
Iteration ends at the first of: a page shorter than page_size, an empty page, token_count being
reached, or max_pages (default MAX_ITER_PAGES = 10_000) requests. page_size is clamped to
MAX_SERVER_PAGE_SIZE = 100, because the server clamps it too and every page would then look short.
💱 Trading — unsigned transactions only
client.trade builds unsigned bonding-curve transactions. It never sees a private key, never
signs and never broadcasts — you hand {chainId, to, data, value} to web3.py, eth-account, a
hardware signer or a multisig UI, and that library owns the key. That is also why this package
still has zero runtime dependencies: signing is the part that needs a crypto library, and it is not
here.
from fyuz import FyuzClient, format_units, parse_units
TOKEN = "0x42322852a918f94186b7dfda2e0e3f4ad3528480"
# The RPC /config publishes belongs to the API operator and is shared by every
# caller — pass your own for anything real.
with FyuzClient(rpc_url="https://bsc-dataseed.bnbchain.org") as fyuz:
quote = fyuz.trade.quote_buy(TOKEN, parse_units("0.01")) # 0.01 BNB
print("tokens out ", format_units(quote.amount_out_wei))
print("msg.value ", format_units(quote.value_wei), "BNB") # amount + first-buy fee
print("impact ", quote.price_impact_bps, "bps")
# slippage_bps is required — there is no default, because the right
# tolerance depends on the trade and a wrong one costs you money.
built = fyuz.trade.build_buy(TOKEN, parse_units("0.01"), slippage_bps=100)
print("to ", built.transaction.to)
print("chainId ", built.transaction.chain_id)
print("data ", built.transaction.data[:74] + "...")
print("minOut ", format_units(built.limit_wei))
Real output, quoted against the live curve:
tokens out 1259164.617412410713942325
msg.value 0.01 BNB
impact 11 bps
to 0x33A98BeF6496684a8daC83734D9CEB0CEFC7019c
chainId 56
data 0x6bf05b0100000000000000000000000042322852a918f94186b7dfda2e0e3f4ad3528480...
minOut 1246572.971238286606802901
Then sign and send it yourself:
w3.eth.send_transaction(built.transaction.as_dict()) # your wallet, your key
Selling needs an ERC-20 approval first, because the contract pulls the tokens with transferFrom:
if fyuz.trade.allowance(TOKEN, owner) < amount_wei:
approve = fyuz.trade.build_approve(TOKEN, amount_wei=amount_wei)
w3.eth.send_transaction(approve.as_dict())
sell = fyuz.trade.build_sell(TOKEN, amount_wei, slippage_bps=150)
💸 Fees, and why msg.value is bigger than you asked for
transaction.value already includes getFirstBuyFee(token): the fee rides on top of the swap
amount, so msg.value = amount_in + first_buy_fee. Sending only amount_in reverts with
InsufficientEthValue(). Any excess is refunded by the contract.
The buy fee is PLATFORM_BUY_FEE_BPS (80) + TOKEN_OWNER_FEE_BPS (20) = 100 bps. Both are
owner-settable storage variables, so the SDK reads them from the chain rather than assuming them.
A token that has graduated raises FyuzTokenGraduatedError instead of building a transaction that
would revert.
client.trade reference — 13 methods
| Method | Does |
|---|---|
chain(network="bsc") |
Chain metadata from GET /config, falling back to the offline address book → ChainInfo |
quote_buy(token, amount_wei, ...) |
Price an exact-BNB buy via getSwapOutput → BuyQuote |
quote_sell(token, amount_wei, ...) |
Price a sell via getSwapOutput → SellQuote |
quote_buy_exact_tokens(token, amount_out_wei, ...) |
Price buying an exact number of tokens (mirrors the contract's getAmountIn) → BuyQuote |
build_buy(token, amount_wei, *, slippage_bps | limit_wei, ...) |
swapExactETHForTokens → BuiltTrade |
build_buy_exact_tokens(token, amount_out_wei, *, slippage_bps | limit_wei, ...) |
swapETHForExactTokens; the limit is a max_amount_in → BuiltTrade |
build_sell(token, amount_wei, *, slippage_bps | limit_wei, ...) |
swapExactTokensForETH → BuiltTrade |
build_approve(token, *, amount_wei | unlimited=True, ...) |
ERC-20 approve for the curve → UnsignedTransaction |
is_graduated(token, ...) |
tokenPools(token).launched — the contract's own flag, not the indexer's → bool |
first_buy_fee(token, ...) |
getFirstBuyFee(token) in wei → int |
max_sellable_wei(token, ...) |
getMaxSellableETH(token) → int |
allowance(token, owner, ...) |
ERC-20 allowance(owner, curve) → int |
balance_of(token, owner, ...) |
ERC-20 balanceOf(owner) → int |
Amount helpers, so no float ever touches a wei value:
| Helper | Purpose |
|---|---|
parse_units("0.5") |
Whole units → wei int (500000000000000000) |
format_units(wei) |
Wei → exact whole-unit string |
parse_amount(name, value) |
Validate a base-10 wei str/int; refuses decimal points |
normalize_address(name, value) |
Validate a 20-byte address, lower-cased |
UINT256_MAX |
2**256 - 1, the unlimited-approval amount |
Lower-level pieces, exported for callers who want them: RPCClient, CallResult,
DEFAULT_RPC_TIMEOUT, revert_error(), revert_selector(), UnsignedTransaction, BuyQuote,
SellQuote, BuiltTrade, DEFAULT_DEADLINE_SECONDS (120), DEFAULT_NETWORK ("bsc").
🚨 Errors
from fyuz import FyuzClient, FyuzRateLimitError, FyuzNotFoundError, FyuzAPIError, FyuzError
with FyuzClient() as fyuz:
try:
profile = fyuz.get_user_profile("0xdead...")
except FyuzNotFoundError:
profile = None
except FyuzRateLimitError as exc: # 429, after retries were exhausted
print("slow down", exc.retry_after)
except FyuzAPIError as exc: # any other non-2xx
print(exc.status, exc.message) # message from the {"error": ...} envelope
except FyuzError: # transport / decode / argument failures
raise
| Exception | Raised when |
|---|---|
FyuzError |
Base class for everything below |
FyuzInvalidArgumentError |
An argument cannot produce a valid request — bad address, decimal string where wei was expected, None for a path segment. Also a ValueError, so except ValueError still works |
FyuzAPIError |
Non-2xx response; carries .status, .message, .body, .retry_after |
FyuzRateLimitError |
429, after retries; subclass of FyuzAPIError |
FyuzNotFoundError |
404; subclass of FyuzAPIError |
FyuzConnectionError |
DNS/refused/reset, after retries |
FyuzTimeoutError |
The request was still in flight when timeout expired; subclass of FyuzConnectionError |
FyuzDecodeError |
Response body was not the JSON shape the endpoint promises |
FyuzRPCError |
A JSON-RPC node errored or answered with something that was not a JSON-RPC response; carries .method, .code, .data |
FyuzContractRevertError |
An eth_call reverted; carries .kind, .error_name, .selector, .retryable, .data |
FyuzTokenGraduatedError |
The bonding curve is closed; subclass of FyuzContractRevertError |
except FyuzError really does catch everything, including argument validation. Catch
FyuzRateLimitError before FyuzAPIError, and FyuzTimeoutError before FyuzConnectionError —
they are subclasses.
Contract reverts, classified — exc.kind and what to do about it
A reverted eth_call comes back as a bare 4-byte selector; the SDK maps it to an actionable error.
Reverts marked retryable are worth re-quoting and retrying.
| Selector | error_name |
kind |
Retryable |
|---|---|---|---|
0xcfa6d878 |
AlreadyLaunched() |
graduated |
no |
0x9c8787c0 |
PoolDoesNotExist() |
no_pool |
no |
0x8199f5f3 |
SlippageExceeded() |
slippage |
yes |
0x2b32713d |
SwapExpired() |
expired |
yes |
0xe96d2afe |
MaxPriceImpactExceeded() |
price_impact |
no |
0x9bca8aec |
SellAmountTooLarge() |
sell_too_large |
no |
0x1985c735 |
InsufficientEthValue() |
insufficient_value |
no |
0xe4455cae |
InsufficientTokenBalance() |
insufficient_balance |
no |
0xf8b3bb61 |
InsufficientInput() |
insufficient_input |
no |
0xbb55fd27 |
InsufficientLiquidity() |
insufficient_liquidity |
no |
0x1f2a2005 |
ZeroAmount() |
zero_amount |
no |
0x1087e109 |
StalePriceFeed() |
stale_feed |
yes |
0xd93c0665 |
EnforcedPause() |
paused |
yes |
0xde9d3c88 |
MaxInputExceeded() |
max_input |
yes |
0x98f73609 |
InvalidOutput() |
invalid_output |
no |
0xcd4e6167 |
FeeTooHigh() |
fee_too_high |
no |
Error(string) and Panic(uint256) are decoded too, and an unrecognised selector is reported
verbatim rather than swallowed — a later contract version will add errors this table does not know.
🔁 Rate limits and retries
The API rate-limits per client IP at 120 requests/minute and answers 429 with
{"error": "Too many requests"}.
The client retries 429, 5xx and transport failures automatically, with exponential backoff and
full jitter (sleep = uniform(0, min(cap, 0.25 * 2**n))). A Retry-After header, when present,
raises the computed backoff — it can lengthen the wait but never shorten it, so Retry-After: 0
cannot spin the retries away — and is capped at 60s. It is honoured on a 503 from a draining load
balancer just as much as on a 429. No other 4xx is ever retried.
FyuzClient(
"https://api.fyuz.fun",
timeout=30.0, # seconds, per request
max_retries=3, # 0 disables retrying entirely
backoff_initial=0.25,
backoff_max=8.0,
user_agent="my-indexer/1.0", # default: fyuz-sdk-python/0.1.1
headers={"X-Trace": "..."}, # extra headers on every API request
rpc_url="https://my-node.example", # for client.trade
)
timeout bounds one attempt, not the whole call: with retries the worst case is
timeout * (max_retries + 1) plus backoff. Lower both to bound a call.
🧭 Notes for indexers and data partners
GET /discoveris the highest-signal single call: market cap, 24h volume, buy/sell counts, holders, price change and graduation progress per token.get_recent_trades(latest_trade_id=...)polls the platform-wide feed incrementally — pass back the highestTrade.idyou have seen.rankon every leaderboard is a server-assigned 1-based ordinal in returned order. Do not re-sort client-side; the server's ordering is what the payout logic uses.- Response models ignore unknown fields, so a server-side addition will never break a deployed
client. Collection fields are tuples (the models are frozen); endpoints returning a bare JSON array
give you a
list. - The client does not pool connections:
urllib.requestopens a fresh TCP connection and TLS handshake per call, where the Go, Rust and TypeScript clients reuse one. That is the price of the zero-dependency guarantee, and on a tight poll loop it is the dominant cost.
🧑🍳 Examples
Runnable programs in examples/:
| Example | What it shows |
|---|---|
01_quickstart.py |
Health, chain config, the trending feed, king of the hill |
02_graduation_watch.py |
Tokens closest to the $30k graduation threshold |
03_token_deep_dive.py |
One token: detail, holders, trades, hourly candles |
04_export_tokens.py |
Auto-paginate every token to CSV, summing with Decimal |
05_resilient_polling.py |
Incremental trade polling, retry tuning, error classification |
06_trade.py |
Quote a buy and a sell, build the unsigned transactions, handle the approval |
PYTHONPATH=src python3 examples/01_quickstart.py
PYTHONPATH=src python3 examples/03_token_deep_dive.py 0x42322852a918f94186b7dfda2e0e3f4ad3528480
PYTHONPATH=src python3 examples/04_export_tokens.py dog > tokens.csv
BSC_RPC_URL=https://bsc-dataseed.bnbchain.org PYTHONPATH=src python3 examples/06_trade.py
(PYTHONPATH=src is only for running against a checkout; after pip install fyuz-sdk they run
as-is.) The same six exist in the TypeScript, Go and Rust clients — see ../README.md.
🛠️ Development
Tests are stdlib unittest. There is no pytest, and nothing to install to run them.
cd sdk/python
# 177 hermetic tests against a local stub HTTP server, never the network.
# tests/ joins src/ on the path: the suite imports its stub server and payload
# fixtures as top-level modules.
PYTHONPATH=src:tests python3 -m unittest discover -s tests -t tests
# Type check (strict) and lint
pip install -e ".[dev]"
mypy
ruff check src tests examples
ruff format --check src tests examples
# Build the distributions
pip install build
python3 -m build
tests/test_conformance.py additionally reads ../shared/test-vectors from disk — the
same fixtures drive the TypeScript, Go and Rust suites, so a change to the wire contract fails all
four at once.
../scripts/test-all.sh # every SDK, offline
../scripts/fork-test.sh # fork BSC, run everything against the live contract
fork-test.sh spins up an anvil fork of BNB Smart Chain and points all four suites at the real
deployed proxy. Each writes a conformance record, and the script flattens all four and compares them
leaf field by leaf field — it prints all 4 SDKs agree on every field, or the exact divergence.
Without FYUZ_FORK_RPC set, the fork tests skip and the suite stays offline and hermetic.
👨👩👧👦 The SDK family
Same API, same behaviour, four languages:
| Language | Install | Runtime dependencies |
|---|---|---|
| 🐍 Python | pip install fyuz-sdk |
none — stdlib urllib |
| 🟦 TypeScript | pnpm add fyuz-sdk |
none — native fetch |
| 🐹 Go | go get github.com/fyuz-launchpad/fyuz-sdk/go |
none — net/http |
| 🦀 Rust | cargo add fyuz-sdk |
reqwest, serde, serde_json, thiserror, tokio — deliberate |
🔗 Links
- 🌐 Homepage — https://fyuz.fun
- 🔌 API — https://api.fyuz.fun
- 📦 Repository — https://github.com/fyuz-launchpad/fyuz-sdk
📜 License
MIT — see LICENSE.
Metadata
Release files for fyuz-sdk 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| fyuz_sdk-0.1.1.tar.gz | 110.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fyuz_sdk-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 191.8 kB
Release files / fyuz_sdk-0.1.1.tar.gz
| Download URL | fyuz_sdk-0.1.1.tar.gz |
|---|---|
| Size | 110.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c1755bbce7536ff0912e6aafe78d9b53818da026770d440d0916420979f49d93
|
|
BLAKE2b-256 checksum How to use checksums |
98a3e1f689ee71999fc6fb02b8526677fd2cb1d44269e654003b8a743982055f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / fyuz_sdk-0.1.1-py3-none-any.whl
| Download URL | fyuz_sdk-0.1.1-py3-none-any.whl |
|---|---|
| Size | 81.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
340d7bdc972906eafc356a6122c3b569e7e60726e2508199931daaf9f9d7c92c
|
|
BLAKE2b-256 checksum How to use checksums |
0c06eb8cb4265b36085e890a6ad069411f6b14bded9bdc62220c90af08d21b9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for fyuz-sdk 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.