Get Started
Last modified:
In the current version of the CenturionDEX Protocol Fee system, searchers can permissionlessly capture value from the system by receiving assets valued greater than the CTN tokens provided to the system.
The simplest way to interact with the system is calling Firepit.release() from a wallet
[!IMPORTANT] Replace all placeholder values (
<FIREPIT_ADDRESS>,<CTN_TOKEN_ADDRESS>,<RPC_URL>) with deployment values from the Deployments page before running any command.
It is possible to interact with the Firepit contract via a custom smart contract to enable:
- slippage / balance checks
- CenturionDEX v3 Fee collection
- CenturionDEX v2 LP Token redemptions
- CTN token flash loans
Acquire a sufficient amount of CTN
The Firepit contract requires integrators to hold a minimum amount of CTN to call release().
Participants can view the threshold by calling Firepit.threshold()
solidity
address firepit = 0x0000000000000000000000000000000000000000; // replace with deployed Firepit
uint256 threshold = IFirepit(firepit).threshold();bash
cast call <FIREPIT_ADDRESS> "threshold()(uint256)" --rpc-url <RPC_URL>Approve the Firepit to spend CTN
Because the Firepit contract transfers CTN to address(0xdead), integrating addresses must first approve the contract to spend their CTN
Integrators should assess the risks of max approving the Firepit contract
solidity
address ctn = 0x0000000000000000000000000000000000000000; // replace with CTN token address
address firepit = 0x0000000000000000000000000000000000000000; // replace with deployed Firepit
ICRC20(ctn).approve(
firepit,
type(uint256).max
);bash
cast send <CTN_TOKEN_ADDRESS> \
"approve(address,uint256)(bool)" \
--rpc-url <RPC_URL> \
<FIREPIT_ADDRESS> \
115792089237316195423570985008687907853269984665640564039457584007913129639935Read the Nonce
The Firepit contract uses a nonce as a safety mechanism to avoid malicious front-running. The value is provided to release(...) must be equal
to the value in contract storage
solidity
address firepit = 0x0000000000000000000000000000000000000000; // replace with deployed Firepit
uint256 nonce = IFirepit(firepit).nonce();bash
cast call <FIREPIT_ADDRESS> "nonce()(uint256)" --rpc-url <RPC_URL>Call Firepit.release()
Once the value of the assets exceeds the value of the CTN tokens, integrators should call Firepit.release()
solidity
address firepit = 0x0000000000000000000000000000000000000000; // replace with deployed Firepit
uint256 _nonce = IFirepit(firepit).nonce();
Currency[] memory _assets = new Currency[](3);
_assets[0] = Currency.wrap(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)); // USDC
_assets[1] = Currency.wrap(address(0xdAC17F958D2ee523a2206206994597C13D831ec7)); // USDT
_assets[2] = Currency.wrap(address(0x0000000000000000000000000000000000000000)); // CTN
IFirepit(firepit).release(_nonce, _assets, 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045);bash
cast send <FIREPIT_ADDRESS> "release(uint256,address[],address)" --rpc-url <RPC_URL> \
<CURRENT_NONCE> <ASSET_ADDRESSES> <RECEIVER_ADDRESS>
# example: release USDC, USDT, and CTN to receiver
cast send <FIREPIT_ADDRESS> "release(uint256,address[],address)" --rpc-url <RPC_URL> \
0 \
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0x0000000000000000000000000000000000000000 \
0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045