# What are the purposes of these functions?

I have a contract here and public functions. Just wanted to know what their purposes of these functions are:

1.setFree
2.setSwapBackSettings

``````//
//

pragma solidity ^0.8.7;

/**

* SAFEMATH LIBRARY
*/
library SafeMath {
function tryAdd(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}

function trySub(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}

function tryMul(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}

function tryDiv(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}

function tryMod(uint256 a, uint256 b)
internal
pure
returns (bool, uint256)
{
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}

function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}

function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}

function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}

function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}

function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}

function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}

function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}

function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}

interface IBEP20 {
function totalSupply() external view returns (uint256);

function decimals() external view returns (uint8);

function symbol() external view returns (string memory);

function name() external view returns (string memory);

function getOwner() external view returns (address);

function balanceOf(address account) external view returns (uint256);

function transfer(address recipient, uint256 amount)
external
returns (bool);

external
view
returns (uint256);

function approve(address spender, uint256 amount) external returns (bool);

function transferFrom(
uint256 amount
) external returns (bool);

event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
uint256 value
);

}

abstract contract Auth {
mapping(address => bool) internal authorizations;

owner = _owner;
authorizations[_owner] = true;
}

/**
* Function modifier to require caller to be contract owner
*/
modifier onlyOwner() {
require(isOwner(msg.sender), "!OWNER");
_;
}

/**
* Function modifier to require caller to be authorized
*/
modifier authorized() {
require(isAuthorized(msg.sender), "!AUTHORIZED");
_;
}

/**
* Authorize address. Owner only
*/
}

/**
* Remove address' authorization. Owner only
*/
}

/**
* Check if address is owner
*/
function isOwner(address account) public view returns (bool) {
return account == owner;
}

/**
* Return address' authorization status
*/
function isAuthorized(address adr) public view returns (bool) {
}

/**
* Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
*/
function transferOwnership(address payable adr) public onlyOwner {
}

}

interface IUniswapV2Factory {
external
}

interface IUniswapV2Router {
function factory() external pure returns (address);

function WETH() external pure returns (address);

uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);

uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);

function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
) external;

function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
) external payable;

function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
) external;

}

interface IDividendDistributor {
function setDistributionCriteria(
uint256 _minPeriod,
uint256 _minDistribution
) external;

function setShare(address shareholder, uint256 amount) external;

function deposit() external payable;

function process(uint256 gas) external;

}

contract DividendDistributor is IDividendDistributor {
using SafeMath for uint256;

struct Share {
uint256 amount;
uint256 totalExcluded; // excluded dividend
uint256 totalRealised;
}

IBEP20 WMEMO = IBEP20(0xDDc0385169797937066bBd8EF409b5B3c0dFEB52); // WMEMO
address WFTM = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83;
IUniswapV2Router router;

mapping(address => uint256) shareholderIndexes;
mapping(address => uint256) shareholderClaims;

mapping(address => Share) public shares;

uint256 public totalShares;
uint256 public totalDividends;
uint256 public totalDistributed; // to be shown in UI
uint256 public dividendsPerShare;
uint256 public dividendsPerShareAccuracyFactor = 10**36;

uint256 public minPeriod = 1 hours;
uint256 public minDistribution = 10 * (10**18);

uint256 currentIndex;

bool initialized;
modifier initialization() {
require(!initialized);
_;
initialized = true;
}

modifier onlyToken() {
require(msg.sender == _token);
_;
}

router = _router != address(0)
? IUniswapV2Router(_router)
: IUniswapV2Router(0x16327E3FbDaCA3bcF7E38F5Af2599D2DDc33aE52); // Spirit Router
_token = msg.sender;
}

function setDistributionCriteria(
uint256 _minPeriod,
uint256 _minDistribution
) external override onlyToken {
minPeriod = _minPeriod;
minDistribution = _minDistribution;
}

function setShare(address shareholder, uint256 amount)
external
override
onlyToken
{
if (shares[shareholder].amount > 0) {
distributeDividend(shareholder);
}

if (amount > 0 && shares[shareholder].amount == 0) {
} else if (amount == 0 && shares[shareholder].amount > 0) {
removeShareholder(shareholder);
}

shares[shareholder].amount = amount;
shares[shareholder].totalExcluded = getCumulativeDividends(
shares[shareholder].amount
);
}

function deposit() external payable override onlyToken {
uint256 balanceBefore = WMEMO.balanceOf(address(this));

path[0] = WFTM;

router.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: msg.value
}(0, path, address(this), block.timestamp);

uint256 amount = WMEMO.balanceOf(address(this)).sub(balanceBefore);

dividendsPerShareAccuracyFactor.mul(amount).div(totalShares)
);
}

function process(uint256 gas) external override onlyToken {
uint256 shareholderCount = shareholders.length;

if (shareholderCount == 0) {
return;
}

uint256 gasUsed = 0;
uint256 gasLeft = gasleft();

uint256 iterations = 0;

while (gasUsed < gas && iterations < shareholderCount) {
if (currentIndex >= shareholderCount) {
currentIndex = 0;
}

if (shouldDistribute(shareholders[currentIndex])) {
distributeDividend(shareholders[currentIndex]);
}

gasLeft = gasleft();
currentIndex++;
iterations++;
}
}

internal
view
returns (bool)
{
return
shareholderClaims[shareholder] + minPeriod < block.timestamp &&
getUnpaidEarnings(shareholder) > minDistribution;
}

function distributeDividend(address shareholder) internal {
if (shares[shareholder].amount == 0) {
return;
}

uint256 amount = getUnpaidEarnings(shareholder);
if (amount > 0) {
WMEMO.transfer(shareholder, amount);
shareholderClaims[shareholder] = block.timestamp;
shares[shareholder].totalRealised = shares[shareholder]
.totalRealised
shares[shareholder].totalExcluded = getCumulativeDividends(
shares[shareholder].amount
);
}
}

function claimDividend() external {
distributeDividend(msg.sender);
}

/*

returns the  unpaid earnings
*/
public
view
returns (uint256)
{
if (shares[shareholder].amount == 0) {
return 0;
}

uint256 shareholderTotalDividends = getCumulativeDividends(
shares[shareholder].amount
);
uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

if (shareholderTotalDividends <= shareholderTotalExcluded) {
return 0;
}

return shareholderTotalDividends.sub(shareholderTotalExcluded);
}

function getCumulativeDividends(uint256 share)
internal
view
returns (uint256)
{
return
share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
}

shareholderIndexes[shareholder] = shareholders.length;
shareholders.push(shareholder);
}

function removeShareholder(address shareholder) internal {
shareholders[shareholderIndexes[shareholder]] = shareholders[
shareholders.length - 1
];
shareholderIndexes[
shareholders[shareholders.length - 1]
] = shareholderIndexes[shareholder];
shareholders.pop();
}

}

contract FROGE is IBEP20, Auth {
using SafeMath for uint256;

uint256 public constant MASK = type(uint128).max;
address WMEMO = 0xDDc0385169797937066bBd8EF409b5B3c0dFEB52; // WMEMO
address public WFTM = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83;
address ZERO = 0x0000000000000000000000000000000000000000;

string constant _name = "frogecoin";
string constant _symbol = "FROGE";
uint8 constant _decimals = 6;

uint256 _totalSupply = 1_000_000_000_000 * (10**_decimals);
uint256 public _maxTxAmount = _totalSupply.div(100); // 1%
uint256 public _maxWallet = _totalSupply.div(40); // 2.5%

mapping(address => uint256) _balances;

mapping(address => bool) isFeeExempt;
mapping(address => bool) isTxLimitExempt;
mapping(address => bool) isDividendExempt;
mapping(address => bool) public _isFree;

uint256 liquidityFee = 600;
uint256 buybackFee = 100;
uint256 reflectionFee = 100;
uint256 marketingFee = 0;
uint256 totalFee = 800;
uint256 feeDenominator = 10000;

0x884FF2A87d0E4349445bC91dEF1ebdF2B6cbefd4; // marketing address

uint256 targetLiquidity = 25;
uint256 targetLiquidityDenominator = 100;

IUniswapV2Router public router;

uint256 public launchedAt;
uint256 public launchedAtTimestamp;

uint256 buybackMultiplierNumerator = 200;
uint256 buybackMultiplierDenominator = 100;
uint256 buybackMultiplierLength = 30 minutes;

bool public autoBuybackEnabled = false;

DividendDistributor distributor;

uint256 distributorGas = 500000;

bool public swapEnabled = true;
uint256 public swapThreshold = _totalSupply / 1000; // 0.1%
bool inSwap;
modifier swapping() {
inSwap = true;
_;
inSwap = false;
}

constructor() Auth(msg.sender) {
address _router = 0x16327E3FbDaCA3bcF7E38F5Af2599D2DDc33aE52; // SpiritSwap Router
router = IUniswapV2Router(_router);
pair = IUniswapV2Factory(router.factory()).createPair(
WFTM,
);
WFTM = router.WETH();
distributor = new DividendDistributor(_router);

isFeeExempt[msg.sender] = true;
isTxLimitExempt[msg.sender] = true;
isDividendExempt[pair] = true;

approve(_router, _totalSupply);
_balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
}

receive() external payable {}

function totalSupply() external view override returns (uint256) {
return _totalSupply;
}

function decimals() external pure override returns (uint8) {
return _decimals;
}

function symbol() external pure override returns (string memory) {
return _symbol;
}

function name() external pure override returns (string memory) {
return _name;
}

function getOwner() external view override returns (address) {
return owner;
}

require(buyBacker[msg.sender] == true, "");
_;
}

function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}

external
view
override
returns (uint256)
{
return _allowances[holder][spender];
}

function approve(address spender, uint256 amount)
public
override
returns (bool)
{
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}

function approveMax(address spender) external returns (bool) {
return approve(spender, _totalSupply);
}

function transfer(address recipient, uint256 amount)
external
override
returns (bool)
{
return _transferFrom(msg.sender, recipient, amount);
}

function transferFrom(
uint256 amount
) external override returns (bool) {
if (_allowances[sender][msg.sender] != _totalSupply) {
_allowances[sender][msg.sender] = _allowances[sender][msg.sender]
.sub(amount, "Insufficient Allowance");
}

return _transferFrom(sender, recipient, amount);
}

function _transferFrom(
uint256 amount
) internal returns (bool) {
if (inSwap) {
return _basicTransfer(sender, recipient, amount);
}

// Max  tx check
address routerAddress = 0x16327E3FbDaCA3bcF7E38F5Af2599D2DDc33aE52; // SpiritSwap Router
// bool isBuy=sender== pair|| sender == routerAddress;
bool isSell = recipient == pair || recipient == routerAddress;

checkTxLimit(sender, amount);

// Max wallet check excluding pair and router
if (!isSell && !_isFree[recipient]) {
require(
(_balances[recipient] + amount) < _maxWallet,
"Max wallet has been triggered"
);
}

// No swapping on buy and tx
if (isSell) {
if (shouldSwapBack()) {
swapBack();
}
}
}
//        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }

_balances[sender] = _balances[sender].sub(
amount,
"Insufficient Balance"
);

uint256 amountReceived = shouldTakeFee(sender)
? takeFee(sender, recipient, amount)
: amount;

if (!isDividendExempt[sender]) {
try distributor.setShare(sender, _balances[sender]) {} catch {}
}
if (!isDividendExempt[recipient]) {
try
distributor.setShare(recipient, _balances[recipient])
{} catch {}
}

try distributor.process(distributorGas) {} catch {}

emit Transfer(sender, recipient, amountReceived);
return true;
}

function _basicTransfer(
uint256 amount
) internal returns (bool) {
_balances[sender] = _balances[sender].sub(
amount,
"Insufficient Balance"
);
//        emit Transfer(sender, recipient, amount);
return true;
}

function checkTxLimit(address sender, uint256 amount) internal view {
require(
amount <= _maxTxAmount || isTxLimitExempt[sender],
"TX Limit Exceeded"
);
}

function shouldTakeFee(address sender) internal view returns (bool) {
return !isFeeExempt[sender];
}

function getTotalFee(bool selling) public view returns (uint256) {
if (launchedAt + 1 >= block.number) {
}
if (selling) {
}
}

function getMultipliedFee() public view returns (uint256) {
/**
* if (launchedAtTimestamp + 1 days > block.timestamp) {
}
*/
}

function takeFee(
uint256 amount
) internal returns (uint256) {
uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(
feeDenominator
);

emit Transfer(sender, address(this), feeAmount);

return amount.sub(feeAmount);
}

function shouldSwapBack() internal view returns (bool) {
return
msg.sender != pair &&
!inSwap &&
swapEnabled &&
}

function swapBack() internal swapping {
uint256 dynamicLiquidityFee = isOverLiquified(
targetLiquidity,
targetLiquidityDenominator
)
? 0
: liquidityFee;
uint256 amountToLiquify = swapThreshold
.mul(dynamicLiquidityFee)
.div(totalFee)
.div(2);
uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

path[1] = WFTM;
uint256 balanceBefore = address(this).balance;

router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSwap,
0,
path,
block.timestamp
);

uint256 amountFTM = address(this).balance.sub(balanceBefore);

uint256 totalFTMFee = totalFee.sub(dynamicLiquidityFee.div(2));

uint256 amountFTMLiquidity = amountFTM
.mul(dynamicLiquidityFee)
.div(totalFTMFee)
.div(2);
uint256 amountFTMReflection = amountFTM.mul(reflectionFee).div(
totalFTMFee
);
uint256 amountFTMMarketing = amountFTM.mul(marketingFee).div(
totalFTMFee
);

try distributor.deposit{value: amountFTMReflection}() {} catch {}

if (amountToLiquify > 0) {
amountToLiquify,
0,
0,
block.timestamp
);
emit AutoLiquify(amountFTMLiquidity, amountToLiquify);
}
}

function shouldAutoBuyback() internal view returns (bool) {
return
msg.sender != pair &&
!inSwap &&
autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number && // After N blocks from last buyback
}

function clearBuybackMultiplier() external authorized {
}

function triggerAutoBuyback() internal {
}
}

function buyTokens(uint256 amount, address to) internal swapping {
path[0] = WFTM;

router.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: amount
}(0, path, to, block.timestamp);
}

function Sweep() external onlyOwner {
uint256 balance = address(this).balance;
payable(msg.sender).transfer(balance);
}

bool _enabled,
uint256 _cap,
uint256 _amount,
uint256 _period
) external authorized {
}

uint256 numerator,
uint256 denominator,
uint256 length
) external authorized {
require(numerator / denominator <= 2 && numerator > denominator);
}

function launched() internal view returns (bool) {
return launchedAt != 0;
}

function launch() public authorized {
require(launchedAt == 0, "Already launched boi");
launchedAt = block.number;
launchedAtTimestamp = block.timestamp;
}

function setMaxWallet(uint256 amount) external authorized {
require(amount >= _totalSupply / 1000);
_maxWallet = amount;
}

function setTxLimit(uint256 amount) external authorized {
require(amount >= _totalSupply / 1000);
_maxTxAmount = amount;
}

function setIsDividendExempt(address holder, bool exempt)
external
authorized
{
require(holder != address(this) && holder != pair);
isDividendExempt[holder] = exempt;
if (exempt) {
distributor.setShare(holder, 0);
} else {
distributor.setShare(holder, _balances[holder]);
}
}

function setIsFeeExempt(address holder, bool exempt) external authorized {
isFeeExempt[holder] = exempt;
}

function setIsTxLimitExempt(address holder, bool exempt)
external
authorized
{
isTxLimitExempt[holder] = exempt;
}

function setFree(address holder) public onlyOwner {
_isFree[holder] = true;
}

function unSetFree(address holder) public onlyOwner {
_isFree[holder] = false;
}

function checkFree(address holder) public view onlyOwner returns (bool) {
return _isFree[holder];
}

function setFees(
uint256 _liquidityFee,
uint256 _reflectionFee,
uint256 _marketingFee,
uint256 _feeDenominator
) external authorized {
liquidityFee = _liquidityFee;
reflectionFee = _reflectionFee;
marketingFee = _marketingFee;
_marketingFee
);
feeDenominator = _feeDenominator;
require(totalFee < feeDenominator / 4);
}

) external authorized {
}

function setSwapBackSettings(bool _enabled, uint256 _amount)
external
authorized
{
swapEnabled = _enabled;
swapThreshold = _amount;
}

function setTargetLiquidity(uint256 _target, uint256 _denominator)
external
authorized
{
targetLiquidity = _target;
targetLiquidityDenominator = _denominator;
}

function setDistributionCriteria(
uint256 _minPeriod,
uint256 _minDistribution
) external authorized {
distributor.setDistributionCriteria(_minPeriod, _minDistribution);
}

function setDistributorSettings(uint256 gas) external authorized {
require(gas < 750000);
distributorGas = gas;
}

function getCirculatingSupply() public view returns (uint256) {
}

function getLiquidityBacking(uint256 accuracy)
public
view
returns (uint256)
{
return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
}

function isOverLiquified(uint256 target, uint256 accuracy)
public
view
returns (bool)
{
return getLiquidityBacking(accuracy) > target;
}

event AutoLiquify(uint256 amountFTM, uint256 amountBOG);
`_isFree` is mapping and represents all the addresses excluded from maxWallet limit
`setSwapBackSettings` is needed to enable/disable internal swaps and set the swap threshold