# Methods

Gluwacoin provides every standard ERC20 token function and, additionally, eight custom functions for circulation control, Etherless transfer, and non-custodial exchange.

## Circulation Control Functions

The contract owner of Gluwacoin can control the supply creating or destroying Gluwacoins.

### mint

*Reserved for the contract owner.* Creates new Gluwacoins and transfers them to a designated address.

```javascript
function mint(address _to, uint256 _value) public onlyOwner returns (bool success)
```

### burn

*Reserved for the contract owner.* Removes Gluwacoins the owner holds from the circulation.

```javascript
function burn(uint256 _value) public onlyOwner returns (bool success)
```

## Etherless Transfer Functions

Gluwacoin standard supports Etherless transfer for Gluwacoin users. Instead of paying gas to transfer Gluwacoin, a user pays a transfer fee in Gluwacoin to the contract owner.

### transfer

A standard ERC20 function but with `_fee`,`_nonce`, and `_sig`as extra parameters. `_fee`is a transfer fee amount in Gluwacoin, which the sender will pay for the transaction. `_sig` is a signature created by signing the transfer information with the sender’s private key. Anyone can initiate the transfer for the sender by calling the Etherless Transfer function with the transfer information and the signature. The caller will have to pay the gas for calling the function.

```javascript
function transfer(address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce, bytes memory _sig) public returns (bool success)
```

## Non-custodial Exchange Functions

Gluwacoin supports functions for non-custodial exchange use cases. Instead of trusting a 3rd party to hold Gluwacoins for an exchange, a user can request the 3rd party to lock Gluwacoins at the user’s account instead. The locked Gluwacoins are called a reserve and can only be released to the pre-designated receiver or unlocked back to the sender.

Note that the exchange can happen not only between Gluwacoins but also with other cryptocurrencies. If a cryptocurrency supports features equivalent to the Gluwacoin non-custodial exchange functions, it is compatible. For instance, Bitcoin is compatible with Gluwacoin non-custodial exchange when utilizing a 2-to-3 multi-sig wallet.

### reserve

Creates a reserve in `_from` address. The amount of the reserve is `_amount` and each reserve has `_nonce`  which is unique together with `_from` . Assigns receiver's address `_to` and the validator's address `_executor`.`_expiryBlockNum` specifies when the `_from` address can reclaim the reserve in case the reserve is unused. `_sig` is a signature created by signing the transfer information with the `_from` address' private key.

```javascript
function reserve(address _from, address _to, address _executor, uint256 _amount, uint256 _fee, uint256 _nonce, uint256 _expiryBlockNum, bytes memory _sig) public returns (bool success)
```

### execute

Releases a fund reserved in `_sender` address. The reserve is specified by `_nonce`*.* The released fund is transferred to `_to` addres&#x73;*.* Reserved for the `_executor`. Note that `_to` and `_executor` are pre-determined when the reserve was created.

```javascript
function execute(address _sender, uint256 _nonce) public returns (bool success)
```

### reclaim

Returns a fund reserved in `_sender` address. The reserve is specified by `_nonce`*.* The fund is transferred to `_from` address. Reserved for the `_from`  and `_executor`. While `_executor` can call the function any time, `_from` can only call after `_expiryBlockNum`. Note that `_from`, `_executor`, and `_expiryBlockNum`  are pre-determined when the reserve was created.

```javascript
function reclaim(address _sender, uint256 _nonce) public returns (bool success)
```
