The Minswap open-source providing a comprehensive suite of off-chain tools price feeds, historical data storage, and integration methods for: Stableswap
, AMM V1
, AMM V2
and LBE V2
.
- Pool price feed
- Historical data of pool
- Calculate trade price
- Calculate price impact
- Create orders and submit with Lucid
- Syncer to sync minswap's liquidity pool data
We provide multiple adapters to get the price and liquidity pool information.
BlockfrostAdapter
: use Blockfrost to query the data.MinswapAdapter
: use Syncer to query the data. If you want to useMinswapAdapter
you need to run syncer by yourself.MaestroAdapter
: use Maestro to query the data.
- NPM:
npm install @minswap/sdk
- Yarn:
yarn add @minswap/sdk
This package depends on lucid-cardano
, which is an ESM package, so it's also an ESM package. To import from ESM package, you need to specify "type": "module"
in package.json
and configure other build flags accordingly.
Create an adapter using either BlockfrostAdapter
or MinswapAdapter
:
import { BlockFrostAPI } from "@blockfrost/blockfrost-js";
import { BlockfrostAdapter, NetworkId } from "@minswap/sdk";
const blockFrostApi = new BlockFrostAPI({
projectId: "<your_project_id>",
network: "mainnet",
});
const blockfrostAdapter = new BlockfrostAdapter(
NetworkId.MAINNET,
blockFrostApi
);
- Install docker compose.
- Update the
.env
file to specify the exact network you want to sync. - Run the command:
docker compose -f docker-compose.yaml up --build -d
to build. - Run the command:
docker compose -f docker-compose.yaml logs -f
to view log.
import { BlockFrostAPI } from "@blockfrost/blockfrost-js";
import {
BlockfrostAdapter,
MinswapAdapter,
NetworkEnvironment,
NetworkId,
newPrismaClient,
PostgresRepositoryReader,
} from "@minswap/sdk";
const blockFrostApi = new BlockFrostAPI({
projectId: "<your_project_id>",
network: "mainnet",
});
const prismaClient = await newPrismaClient(
"postgresql://postgres:minswap@postgres:5432/syncer?schema=public&connection_limit=5"
);
const repositoryReader = new PostgresRepositoryReader(
NetworkEnvironment.MAINNET,
prismaClient
);
const minswapAdapter = new MinswapAdapter({
networkId: NetworkId.MAINNET,
networkEnv: NetworkEnvironment.MAINNET,
blockFrostApi: blockFrostApi,
repository: repositoryReader,
});
import { MaestroAdapter } from "@minswap/sdk";
import { MaestroClient, Configuration } from "@maestro-org/typescript-sdk";
const maestroClient = new MaestroClient(
new Configuration({
apiKey: maestroApiKey,
network: cardanoNetwork,
})
);
const maestroAdapter = new MaestroAdapter(NetworkId.TESTNET, maestroClient);
for (let i = 1; ; i++) {
const pools = await adapter.getV1Pools({
page: i,
});
if (pools.length === 0) {
// last page
break;
}
const minAdaPool = pools.find(
(p) =>
p.assetA === "lovelace" &&
p.assetB ===
"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e"
);
if (minAdaPool) {
const [price0, price1] = await adapter.getV1PoolPrice({ pool: minAdaPool });
console.log(
`ADA/MIN price: ${price0.toString()}; MIN/ADA price: ${price1.toString()}`
);
// we can later use this ID to call getPoolById
console.log(`ADA/MIN pool ID: ${minAdaPool.id}`);
break;
}
}
const minAdaPool = await adapter.getV2PoolByPair(
Asset.fromString("lovelace"),
Asset.fromString(
"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e"
)
);
if (minAdaPool) {
const [a, b] = await adapter.getV2PoolPrice({ pool: minAdaPool });
console.log(`ADA/MIN price: ${a.toString()}; MIN/ADA price: ${b.toString()}`);
}
const MIN_ADA_POOL_ID =
"6aa2153e1ae896a95539c9d62f76cedcdabdcdf144e564b8955f609d660cf6a2";
const history = await adapter.getV1PoolHistory({ id: MIN_ADA_POOL_ID });
for (const historyPoint of history) {
const pool = await adapter.getV1PoolInTx({ txHash: historyPoint.txHash });
if (!pool) {
throw new Error("pool not found");
}
const [price0, price1] = await adapter.getV1PoolPrice({ pool: pool });
console.log(`${historyPoint.time}: ${price0} ADA/MIN, ${price1} MIN/ADA`);
}
for (let i = 1; ; i++) {
const pools = await adapter.getV2PoolHistory({
assetA: Asset.fromString("lovelace"),
assetB: Asset.fromString(
"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e"
),
page: i,
});
if (pools.length === 0) {
// last page
break;
}
for (const pool of pools) {
const [price0, price1] = await adapter.getV2PoolPrice({ pool: pool });
console.log(
`ADA/MIN price: ${a.toString()}; MIN/ADA price: ${price1.toString()}`
);
}
}
See examples/
for more details. You can run a single file like npm run exec examples/example.ts
.