# Vault

`IBVMVault` is a secure IBVM Bitcoin vault contract that allows users to deposit BTC and enables authorized roles to perform withdrawals. It incorporates safety mechanisms like pausing and reentrancy protection, and utilizes a role-based access system.

### Inheritance

* **Pausable**: Allows the contract to be paused and unpaused by the owner.
* **ReentrancyGuard**: Protects against reentrancy attacks.

### Events

* **Deposited(address sender, uint256 amount)**: Emitted when BTC is deposited.
* **Withdrawn(address recipient, uint256 amount)**: Emitted when BTC is withdrawn.
* **OwnershipTransferred(address previousOwner, address newOwner)**: Emitted when the owner changes.
* **AdminRoleTransferred(address previousAdmin, address newAdmin)**: Emitted when the admin changes.
* **WithdrawerRoleGranted(address account)**: Emitted when an address is given the withdrawer role.
* **WithdrawerRoleRevoked(address account)**: Emitted when an address has the withdrawer role revoked.

### State Variables

* `owner (address)`: Current contract owner.
* `admin (address)`: Address with administrative capabilities.
* `hasWithdrawerRole (mapping)`: Tracks which addresses are authorized to withdraw BTC.

### Constructor

* Assigns the deployer as `owner`, `admin`, and a withdrawer.

### Modifiers

* `onlyOwner`: Restricts access to the owner.
* `onlyAdmin`: Restricts access to the admin.
* `onlyWithdrawer`: Restricts access to addresses with the withdrawer role.

### Functions

#### deposit()

```
function deposit() external payable whenNotPaused
```

* Public payable function to deposit BTC into the contract.
* Emits `Deposited` event.

#### withdraw(address recipient, uint256 amount)

```
function withdraw(address recipient, uint256 amount) external nonReentrant onlyWithdrawer whenNotPaused
```

* Transfers specified amount of BTC to a recipient.
* Restricted to addresses with withdrawer role.
* Emits `Withdrawn` event.

#### pause()

```
function pause() external onlyOwner
```

* Pauses the contract.

#### unpause()

```
function unpause() external onlyOwner
```

* Unpauses the contract.

#### transferOwnership(address newOwner)

```
function transferOwnership(address newOwner) external onlyOwner
```

* Transfers ownership to `newOwner`.
* Emits `OwnershipTransferred` event.

#### transferAdminRole(address newAdmin)

```
function transferAdminRole(address newAdmin) external onlyOwner
```

* Assigns new admin.
* Emits `AdminRoleTransferred` event.

#### grantWithdrawerRole(address account)

```
function grantWithdrawerRole(address account) external onlyAdmin
```

* Grants withdraw permission to `account`.
* Emits `WithdrawerRoleGranted` event.

#### revokeWithdrawerRole(address account)

```
function revokeWithdrawerRole(address account) external onlyAdmin
```

* Revokes withdraw permission from `account`.
* Emits `WithdrawerRoleRevoked` event.

### Security Features

* **Role-based access control**: Owner and admin can delegate or revoke access.
* **Pausable operations**: Emergency pause/unpause.
* **Reentrancy guard**: Ensures secure withdrawals.

### Usage Example

```
vault.deposit{value: 1 ether}();
vault.withdraw(0xRecipient, 1 ether);
```

### Notes

* This contract only handles BTC (native currency).
* Ensure that only trusted addresses are granted withdrawer roles.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ibvm.gitbook.io/ibvm-doc/system-contracts/vault.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
