Carbon Backend, built with Nest.js, serves as a specialized backend solution for aggregating insights from Carbon smart contracts and delivering them through APIs. It provides a suite of APIs offering valuable insights, such as trading activity and history.
Before setting up Carbon Backend, ensure you have the following prerequisites:
To set up Carbon Backend, follow these steps:
Clone the repository:
git clone https://github.com/bancorprotocol/carbon-backend
Navigate to the project directory:
cd carbon-backend
Install dependencies:
npm install
Run database migrations:
After installing dependencies, run the following command to execute all migrations and prepare the database:
npm run migration:run
Configure environment variables:
Duplicate the .env.example
file as .env
:
cp .env.example .env
Provide the required values in the .env
file.
(Optional) If you wish to utilize the simulator feature, install the required Python packages:
pip install -r src/simulator/requirements.txt
To run Carbon Backend:
npm start
Access the API documentation by navigating to http://localhost:3000 in your browser.
Manually run the seed
function in src/historic-quote/historic-quote.service.ts
to populate the database with historic quotes for history-dependent functionalities such as the simulator.
To switch Carbon Backend's network for different deployments, follow these steps:
Replace Smart Contract Files:
src/contracts/mainnet
with those from the new deployment.Modify CoinMarketCap Service:
src/coinmarketcap/coinmarketcap.service.ts
to align with the new network.Modify CoinGecko Service:
src/quote/coingecko.service.ts
to match the requirements of the new network.Customizing Networks and Exchange IDs:
To configure which networks are supported by Carbon Backend, make the following changes in deployment.service.ts
and exchange-id-param.decorator.ts
.
If you want to support multiple networks, update the following:
In deployment.service.ts
:
BlockchainType
and ExchangeId
enums to reflect the networks you want to support:export enum BlockchainType {
Ethereum = 'ethereum',
Sei = 'sei-network',
Celo = 'celo',
Blast = 'blast',
// Add or remove entries as needed
}
export enum ExchangeId {
OGEthereum = 'ethereum',
OGSei = 'sei',
OGCelo = 'celo',
OGBlast = 'blast',
// Add or remove entries as needed
}
initializeDeployments
with configuration for each network, including exchangeId
, blockchainType
, rpcEndpoint
, and other network-specific values:private initializeDeployments(): Deployment[] {
return [
{
exchangeId: ExchangeId.OGEthereum,
blockchainType: BlockchainType.Ethereum,
rpcEndpoint: this.configService.get('ETHEREUM_RPC_ENDPOINT'),
harvestEventsBatchSize: 2000000,
harvestConcurrency: 10,
multicallAddress: '0x5Eb3fa2DFECdDe21C950813C665E9364fa609bD2',
startBlock: 17087000,
gasToken: {
name: 'Ethereum',
symbol: 'ETH',
address: NATIVE_TOKEN,
},
},
// Repeat this block for each network
];
}
In exchange-id-param.decorator.ts
:
extractExchangeId
to support dynamic handling for multiple networks:export function extractExchangeId(request: Request, exchangeIdParam?: string): ExchangeId {
let exchangeId: ExchangeId;
if (exchangeIdParam) {
exchangeId = exchangeIdParam as ExchangeId;
} else {
let subdomain = request.hostname.split('.')[0];
if (subdomain.endsWith('-api')) {
subdomain = subdomain.slice(0, -4); // Remove '-api' suffix
}
if (subdomain === 'api') {
subdomain = ExchangeId.OGEthereum; // Adjust to your preferred default network
}
exchangeId = subdomain ? (subdomain as ExchangeId) : (ExchangeId.OGEthereum as ExchangeId);
}
if (!Object.values(ExchangeId).includes(exchangeId)) {
throw new Error(`Invalid ExchangeId: ${exchangeId}`);
}
return exchangeId;
}
If supporting only one network, simplify the configuration:
In deployment.service.ts
:
BlockchainType
and ExchangeId
, and configure initializeDeployments
for only that network.In exchange-id-param.decorator.ts
:
extractExchangeId
function to return only the supported ExchangeId
:export function extractExchangeId(request: Request, exchangeIdParam?: string): ExchangeId {
const exchangeId = ExchangeId.OGEthereum; // Replace with the single supported ExchangeId
if (exchangeIdParam && exchangeIdParam !== exchangeId) {
throw new Error(`Unsupported ExchangeId: only ${exchangeId} is allowed`);
}
return exchangeId;
}
Carbon Backend is licensed under the MIT License.