Developers
Networks and deployments
Contract addresses, assets, markets and service URLs of every AXIS deployment.
Testnet#
Network#
| Item | Value |
|---|---|
| Network passphrase | Test SDF Network ; September 2015 (Networks.TESTNET in @stellar/stellar-sdk) |
| Stellar RPC | https://soroban-testnet.stellar.org |
| Friendbot | https://friendbot.stellar.org |
Contracts and accounts#
| Item | Address |
|---|---|
| AXIS contract | CA6P26K4QNNIMTYP22ILTSCXQQDEKNWJIZJPC34YEZYOLBNT7YUPX7XS |
| Safety admin | GBDCULE53LUPK4XHUCXBI35MAZFQHENMZ3JRKAJS2PPYBV646M6XKVHG |
| Price oracle (Reflector Beam) | CDEIQLTE3Y3XQMYPSZFJC2OXIS67F4MURGP73NCE2C2NZZ22RNSPV7ZI |
The safety admin can freeze trading and change a few settings, and cannot touch orders or funds. See Safety admin and invariants.
Configuration#
| Setting | Raw value | Meaning |
|---|---|---|
min_trade_size |
10000 |
0.001 USD. A Limit order or an updated order must be worth at least this much at the cached oracle price. USD with 7 decimals. |
listing_min_days |
90 |
Days of price feeds the listing fee of a new market buys. 0 would open markets without a fee. |
market_listing_fee |
180000000000 |
18,000 XRF burned to open a market. XRF with 7 decimals. |
ledger_time |
5 |
Expected ledger close time in seconds, used to convert entry lifetimes into ledgers. |
| Frozen | false |
Trading is enabled |
The safety admin can change every value here, so read the live values, as shown below, instead of hard-coding them. See Minimum order value and Markets and oracle.
Services#
| Service | URL |
|---|---|
| AXIS API, REST | https://demo-api.axis.markets |
| AXIS API, WebSocket | wss://demo-api.axis.markets/ws |
| AXIS app | https://dex-demo.axis.markets/ |
The AXIS API is documented in REST API and WebSocket API. The AXIS app is a Testnet trading interface, see Trading with the AXIS app.
Assets#
All four assets are Classic assets used through their Stellar Asset Contract. AXIS identifies them by the SAC address.
| Code | Issuer | SAC contract | Decimals |
|---|---|---|---|
| XLM | native | CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC |
7 |
| USDC | GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 |
CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA |
7 |
| EURC | GB3Q6QDZYTHWT7E5PVS3W7FUT5GVAFC5KSZFFLPU25GO7VTC3NM2ZTVO |
CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ |
7 |
| CETES | GC3CW7EDYRTWQ635VDIGY6S4ZUF5L6TQ7AA4MWS7LEQDBLUSZXV7UPS4 |
CC72F57YTPX76HAA64JQOEGHQAPSADQWSY5DWVBR66JINPFDLNCQYHIC |
7 |
new Asset(code, issuer).contractId(Networks.TESTNET) computes the SAC address of a Classic asset, and
Asset.native().contractId(Networks.TESTNET) the one of XLM.
Markets#
Six markets are open, one for every pair of the four assets, all opened on 2026-10-05. The contract orders the two assets of a market canonically by the XDR bytes of their addresses, not alphabetically: on Testnet the order is USDC, EURC, CETES, XLM.
Market base/quote |
base |
quote |
|---|---|---|
| USDC/EURC | CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA |
CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ |
| USDC/CETES | CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA |
CC72F57YTPX76HAA64JQOEGHQAPSADQWSY5DWVBR66JINPFDLNCQYHIC |
| USDC/XLM | CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA |
CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC |
| EURC/CETES | CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ |
CC72F57YTPX76HAA64JQOEGHQAPSADQWSY5DWVBR66JINPFDLNCQYHIC |
| EURC/XLM | CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ |
CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC |
| CETES/XLM | CC72F57YTPX76HAA64JQOEGHQAPSADQWSY5DWVBR66JINPFDLNCQYHIC |
CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC |
Market data keyed by base/quote, such as the 24h ticker, quotes prices in quote per
base: the USDC/XLM ticker shows XLM per USDC. Use canonicalPair from the JS client rather than sorting address strings.
Opening another market is permissionless, see Opening a market.
Reading the live configuration#
The AXIS API serves the configuration, the freeze flag and the market registry, rebuilt from contract events:
curl "https://demo-api.axis.markets/contract?pretty_print"
The response listed the six markets. The first one is shown:
{
"address": "CA6P26K4QNNIMTYP22ILTSCXQQDEKNWJIZJPC34YEZYOLBNT7YUPX7XS",
"frozen": false,
"config": {
"safetyAdmin": "GBDCULE53LUPK4XHUCXBI35MAZFQHENMZ3JRKAJS2PPYBV646M6XKVHG",
"oracle": "CDEIQLTE3Y3XQMYPSZFJC2OXIS67F4MURGP73NCE2C2NZZ22RNSPV7ZI",
"listingMinDays": 90,
"marketListingFee": "180000000000",
"minTradeSize": "10000",
"ledgerTime": 5
},
"markets": [
{
"base": "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA",
"quote": "CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ",
"created": "2026-10-05 21:12:47",
"refreshed": "2026-10-05 21:12:47"
}
]
}
The WebSocket contract channel pushes the same body whenever it changes, see
WebSocket API.
To read the contract itself without the AXIS API, call its views through any Stellar RPC server: config() returns
Config {safety_admin, oracle, listing_min_days, market_listing_fee, min_trade_size, ledger_time}, frozen() the
freeze flag and
market(selling, buying) the market record of a pair. The contract client wraps them as loadConfig(), isFrozen()
and getMarket(), see Contract client. The views are listed in
Functions.
Getting Testnet funds#
-
Create an account in a wallet such as Freighter, Albedo or xBull, or generate a keypair with
@stellar/stellar-sdk. -
Fund it with Friendbot, which creates the account on Testnet:
curl "https://friendbot.stellar.org/?addr=<your G... address>" -
Add a trustline for each of USDC, EURC and CETES that the account should receive, with a Classic
changeTrustoperation. Each trustline locks a 0.5 XLM base reserve. XLM needs no trustline. -
Get USDC, EURC or CETES by selling XLM on AXIS, for example in the Swap view of the AXIS app.
Without the trustline, an account cannot receive the asset: a trade that would pay it fails with CannotReceive
(708), and a maker without it is skipped. A code example that funds an account and adds a trustline is in
Getting started, and the checks a wallet should run are in
Wallet integration.
Explorer links#
StellarExpert shows the contracts, their storage and their events:
- AXIS contract: https://stellar.expert/explorer/testnet/contract/CA6P26K4QNNIMTYP22ILTSCXQQDEKNWJIZJPC34YEZYOLBNT7YUPX7XS
- Reflector oracle: https://stellar.expert/explorer/testnet/contract/CDEIQLTE3Y3XQMYPSZFJC2OXIS67F4MURGP73NCE2C2NZZ22RNSPV7ZI
- Safety admin: https://stellar.expert/explorer/testnet/account/GBDCULE53LUPK4XHUCXBI35MAZFQHENMZ3JRKAJS2PPYBV646M6XKVHG
- XLM: https://stellar.expert/explorer/testnet/contract/CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC
- USDC: https://stellar.expert/explorer/testnet/contract/CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA
- EURC: https://stellar.expert/explorer/testnet/contract/CCUUDM434BMZMYWYDITHFXHDMIVTGGD6T2I5UKNX5BSLXLW7HVR4MCGZ
- CETES: https://stellar.expert/explorer/testnet/contract/CC72F57YTPX76HAA64JQOEGHQAPSADQWSY5DWVBR66JINPFDLNCQYHIC
Mainnet#
AXIS is not deployed on mainnet yet. At launch, this page will list the mainnet contract, safety admin, oracle, configuration, markets and AXIS API URLs.
Important
The JS client defaults to the mainnet passphrase. Until mainnet is live, always pass the Testnet passphrase
(Networks.TESTNET) to Axis and AxisContractClient, otherwise every transaction is signed for the wrong network.
Source code#
| Repository | Contents |
|---|---|
| https://github.com/axis-markets/orderbook | The AXIS Soroban smart contract |
| https://github.com/axis-markets/js-client | The JS client, @axis-markets/client on npm (MIT) |
| https://github.com/axis-markets/indexer | The indexer, @axis-markets/indexer on npm (MIT), see Indexer |
| https://github.com/axis-markets/demo-dex-bot | A tool for testing and a reference bot implementation |