npm package: @setheum-labs/predeploy-contracts
Description: Predeploy `Setheum Ethereum Virtual Machine` (SEVM) Contracts Generate bytecode for predeployment of ERC20 smart contracts in Setheum.
Author: Setheum Labs
Latest version: 3.1.0

# Predeploy-Contracts

Predeploy `Setheum Ethereum Virtual Machine` (SEVM) Contracts
Generate bytecode for predeployment of ERC20 smart contracts in Setheum.

## 1. Build

Run `yarn` to install dependencies.

## 2. Generate bytecode

Generate bytecode for predeployment of ERC20 smart contracts in Setheum.

To generate bytecode, run `yarn run generate-bytecode`.

The generated bytecode JSON file would be `./resources/bytecodes.json`. The contracts are in `./contracts/` directory.

It can also be generated from the specified file, run `yarn run generate-bytecode [tokens.json path] [bytecodes.json output path]`

## 3. Development

The token list for ERC20 smart contracts is in `./resources/tokens.json`. Symbol and address are needed for each token, for instance:

```
{
  "symbol": "SETM",
  "address": "0x0000000000000000000000000000000001000000"
}
```

# Predeployed System Contracts

## ERC20 Contracts
These ERC20 contracts make native and cross-chain tokens available inside SetheumEVM (SEVM).

- SETM contract address:    `0x0000000000000000000000000000000001000000`.
- SERP contract address:    `0x0000000000000000000000000000000001000001`.
- DNAR contract address:    `0x0000000000000000000000000000000001000002`.
- HELP contract address:    `0x0000000000000000000000000000000001000003`.
- SETR contract address:    `0x0000000000000000000000000000000001000004`.
- SETUSD contract address:  `0x0000000000000000000000000000000001000005`.

- LP_SETM_SETUSD contract address: `0x0000000000000000000000010000000000000005`.
- LP_SERP_SETUSD contract address: `0x0000000000000000000000010000000100000005`.
- LP_DNAR_SETUSD contract address: `0x0000000000000000000000010000000200000005`.
- LP_HELP_SETUSD contract address: `0x0000000000000000000000010000000300000005`.
- LP_SETM_SETR contract address: `0x0000000000000000000000010000000000000004`.
- LP_SERP_SETR contract address: `0x0000000000000000000000010000000100000004`.
- LP_DNAR_SETR contract address: `0x0000000000000000000000010000000200000004`.
- LP_HELP_SETR contract address: `0x0000000000000000000000010000000300000004`.

```
// Returns the currencyId of the token.
function currencyId() public view returns (uint256);

// Returns the name of the token.
function name() public view returns (string memory);

// Returns the symbol of the token, usually a shorter version of the name.
function symbol() public view returns (string memory);

// Returns the number of decimals used to get its user representation.
function decimals() public view returns (uint8);

// Returns the amount of tokens in existence.
function totalSupply() public view returns (uint256);

// Returns the amount of tokens owned by `account`.
function balanceOf(address account) public view returns (uint256);

// Moves `amount` tokens from the caller's account to `recipient`.
// Returns a boolean value indicating whether the operation succeeded.
// Emits a {Transfer} event.
function transfer(address recipient, uint256 amount) public returns (bool);

// Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}.
// This is zero by default.
function allowance(address owner, address spender) public view returns (uint256);

// Sets `amount` as the allowance of `spender` over the caller's tokens.
// Returns a boolean value indicating whether the operation succeeded.
function approve(address spender, uint256 amount) public returns (bool);

// Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.
// Returns a boolean value indicating whether the operation succeeded.
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool);

// Atomically increases the allowance granted to `spender` by the caller.
// This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.
// Emits an {Approval} event indicating the updated allowance.
function increaseAllowance(address spender, uint256 addedValue) public returns (bool);

// Atomically decreases the allowance granted to `spender` by the caller.
// This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.
// Emits an {Approval} event indicating the updated allowance.
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool);
```

## Other System Contracts:
These contracts make other chain-native functionalities available in SetheumEVM (SEVM).

### State Rent
- StateRent contract address: `0x0000000000000000000000000000000000000801`
```
// Returns the const of NewContractExtraBytes.
function newContractExtraBytes() public view returns (uint256);

// Returns the const of StorageDepositPerByte.
function storageDepositPerByte() public view returns (uint256);

// Returns the maintainer of the contract.
function maintainerOf(address contract_address) public view returns (address);

// Returns the const of DeveloperDeposit.
function developerDeposit() public view returns (uint256);

// Returns the const of DeploymentFee.
function deploymentFee() public view returns (uint256);

// Transfer the maintainer of the contract.
// Returns a boolean value indicating whether the operation succeeded.
function transferMaintainer(address contract_address, address new_maintainer) public returns (bool);
```

### Oracle Price Feed
- Oracle contract address: `0x0000000000000000000000000000000000000802`
```
// Get the price of the currency_id.
// Returns the (price, timestamp)
function getPrice(address token) public view returns (uint256, uint256);
```
### On-chain Automatic Scheduler
- ScheduleCall contract address: `0x0000000000000000000000000000000000000803`
```
// Schedule call the contract.
// Returns a boolean value indicating whether the operation succeeded.
function scheduleCall(address contract_address, uint256 value, uint256 gas_limit, uint256 storage_limit, uint256 min_delay, bytes memory input_data) public returns (bool);

// Cancel schedule call the contract.
// Returns a boolean value indicating whether the operation succeeded.
function cancelCall(bytes memory task_id) public returns (bool);

// Reschedule call the contract.
// Returns a boolean value indicating whether the operation succeeded.
function rescheduleCall(uint256 min_delay, bytes memory task_id) public returns (bool);
```

### DEX
- DEX contract address: `0x0000000000000000000000000000000000000804`
```
// Get liquidity of the currency_id_a and currency_id_b.
// Returns (liquidity_a, liquidity_b)
function getLiquidity(address tokenA, address tokenB) public view returns (uint256, uint256)

// Get swap target amount.
// Returns (target_amount)
function getSwapTargetAmount(address[] calldata path, uint256 supplyAmount) external view returns (uint256);

// Get swap supply amount.
// Returns (supply_amount)
function getSwapSupplyAmount(address[] calldata path, uint256 targetAmount) external view returns (uint256);

// Swap with exact supply.
// Returns a boolean value indicating whether the operation succeeded.
function swapWithExactSupply(address[] calldata path, uint256 supplyAmount, uint256 minTargetAmount) external returns (bool);

// Swap with exact target.
// Returns a boolean value indicating whether the operation succeeded.
function swapWithExactTarget(address[] calldata path, uint256 targetAmount, uint256 maxSupplyAmount) external returns (bool);

// Add liquidity to the trading pair.
// Returns a boolean value indicating whether the operation succeeded.
function addLiquidity(address tokenA, address tokenB, uint256 maxAmountA, uint256 maxAmountB) external returns (bool);

// Remove liquidity from the trading pair.
// Returns a boolean value indicating whether the operation succeeded.
function removeLiquidity(address tokenA, address tokenB, uint256 removeShare) external returns (bool);
```

## DeFi Contracts (Coming Soon)
These contracts will make Setheum's DeFi primitives (SetMint, HighEnd LaunchPad, Al-Ethaar) available in SetheumEVM (SEVM).

## Bridge Contracts (Coming Soon)
These conracts will enable bridging between EVM Compatible Chains and Setheum (ie. Setheum-Ethereum Bridge) using [chainbridge-solidity](https://github.com/ChainSafe/chainbridge-solidity).