2023-03-30 06:51:48 +00:00
# Solidity API
2023-05-26 08:01:05 +00:00
## IVerifier
### verifyProof
```solidity
function verifyProof(uint256[2] a, uint256[2][2] b, uint256[2] c, uint256[2] input) external view returns (bool)
```
2023-03-30 06:51:48 +00:00
## IPoseidonHasher
### hash
```solidity
2023-11-30 11:32:00 +00:00
function hash(uint256[2] inputs) external pure returns (uint256 result)
2023-03-30 06:51:48 +00:00
```
2023-11-30 11:32:00 +00:00
Hashes the input using the Poseidon hash function, n = 2
2023-03-30 06:51:48 +00:00
#### Parameters
2023-11-30 11:32:00 +00:00
| Name | Type | Description |
| ------ | ---------- | ----------------- |
| inputs | uint256[2] | The input to hash |
2023-03-30 06:51:48 +00:00
## PoseidonHasher
### Q
```solidity
uint256 Q
```
### hash
```solidity
2023-11-30 11:32:00 +00:00
function hash(uint256[2] inputs) external pure returns (uint256 result)
2023-03-30 06:51:48 +00:00
```
2023-11-30 11:32:00 +00:00
Hashes the input using the Poseidon hash function, n = 2
2023-03-30 06:51:48 +00:00
#### Parameters
2023-11-30 11:32:00 +00:00
| Name | Type | Description |
| ------ | ---------- | ----------------- |
| inputs | uint256[2] | The input to hash |
2023-03-30 06:51:48 +00:00
2023-11-30 11:32:00 +00:00
## RLN
2023-07-26 10:42:37 +00:00
### constructor
```solidity
constructor(uint256 membershipDeposit, uint256 depth, address _poseidonHasher, address _verifier) public
```
2023-08-21 07:07:15 +00:00
### \_validateRegistration
2023-07-26 10:42:37 +00:00
```solidity
function _validateRegistration(uint256 idCommitment) internal pure
```
_Inheriting contracts MUST override this function_
2023-08-21 07:07:15 +00:00
### \_validateSlash
2023-07-26 10:42:37 +00:00
```solidity
function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] proof) internal pure
```
2023-05-23 06:54:58 +00:00
## FullTree
```solidity
error FullTree()
```
The tree is full
2023-03-30 12:00:54 +00:00
## InsufficientDeposit
```solidity
error InsufficientDeposit(uint256 required, uint256 provided)
```
Invalid deposit amount
### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| -------- | ------- | --------------------------- |
2023-03-30 12:00:54 +00:00
| required | uint256 | The required deposit amount |
| provided | uint256 | The provided deposit amount |
## DuplicateIdCommitment
```solidity
error DuplicateIdCommitment()
```
Member is already registered
2023-07-26 10:42:37 +00:00
## FailedValidation
```solidity
error FailedValidation()
```
Failed validation on registration/slashing
2023-08-16 13:20:49 +00:00
## InvalidIdCommitment
```solidity
error InvalidIdCommitment(uint256 idCommitment)
```
Invalid idCommitment
2023-03-30 14:53:08 +00:00
## InvalidReceiverAddress
2023-03-30 12:00:54 +00:00
```solidity
2023-03-30 14:53:08 +00:00
error InvalidReceiverAddress(address to)
2023-03-30 12:00:54 +00:00
```
2023-03-30 14:53:08 +00:00
Invalid receiver address, when the receiver is the contract itself or 0x0
2023-03-30 12:00:54 +00:00
## MemberNotRegistered
```solidity
error MemberNotRegistered(uint256 idCommitment)
```
Member is not registered
## MemberHasNoStake
```solidity
error MemberHasNoStake(uint256 idCommitment)
```
Member has no stake
2023-03-30 14:53:08 +00:00
## InsufficientWithdrawalBalance
```solidity
error InsufficientWithdrawalBalance()
```
User has insufficient balance to withdraw
## InsufficientContractBalance
```solidity
error InsufficientContractBalance()
```
Contract has insufficient balance to return
2023-05-26 08:01:05 +00:00
## InvalidProof
```solidity
error InvalidProof()
```
Invalid proof
2023-07-26 10:42:37 +00:00
## RlnBase
2023-03-30 06:51:48 +00:00
### MEMBERSHIP_DEPOSIT
```solidity
uint256 MEMBERSHIP_DEPOSIT
```
The deposit amount required to register as a member
### DEPTH
```solidity
uint256 DEPTH
```
The depth of the merkle tree
### SET_SIZE
```solidity
uint256 SET_SIZE
```
The size of the merkle tree, i.e 2^depth
### idCommitmentIndex
```solidity
uint256 idCommitmentIndex
```
The index of the next member to be registered
### stakedAmounts
```solidity
mapping(uint256 => uint256) stakedAmounts
```
The amount of eth staked by each member
2023-05-23 06:54:58 +00:00
maps from idCommitment to the amount staked
2023-03-30 06:51:48 +00:00
### members
```solidity
2023-05-23 06:54:58 +00:00
mapping(uint256 => uint256) members
2023-03-30 06:51:48 +00:00
```
The membership status of each member
2023-05-23 06:54:58 +00:00
maps from idCommitment to their index in the set
2023-03-30 06:51:48 +00:00
2023-11-30 11:32:00 +00:00
### memberExists
```solidity
mapping(uint256 => bool) memberExists
```
The membership status of each member
2023-03-30 14:53:08 +00:00
### withdrawalBalance
```solidity
mapping(address => uint256) withdrawalBalance
```
The balance of each user that can be withdrawn
2023-03-30 06:51:48 +00:00
### poseidonHasher
```solidity
2023-08-16 13:20:49 +00:00
contract PoseidonHasher poseidonHasher
2023-03-30 06:51:48 +00:00
```
The Poseidon hasher contract
2023-05-26 08:01:05 +00:00
### verifier
```solidity
contract IVerifier verifier
```
The groth16 verifier contract
2023-08-21 07:07:15 +00:00
### deployedBlockNumber
```solidity
uint32 deployedBlockNumber
```
the deployed block number
2023-11-30 11:32:00 +00:00
### imtData
```solidity
struct BinaryIMTData imtData
```
the Incremental Merkle Tree
2023-03-30 06:51:48 +00:00
### MemberRegistered
```solidity
event MemberRegistered(uint256 idCommitment, uint256 index)
```
Emitted when a new member is added to the set
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | ------- | ---------------------------------- |
| idCommitment | uint256 | The idCommitment of the member |
| index | uint256 | The index of the member in the set |
2023-03-30 06:51:48 +00:00
### MemberWithdrawn
```solidity
2023-05-23 06:54:58 +00:00
event MemberWithdrawn(uint256 idCommitment, uint256 index)
2023-03-30 06:51:48 +00:00
```
Emitted when a member is removed from the set
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | ------- | ---------------------------------- |
| idCommitment | uint256 | The idCommitment of the member |
| index | uint256 | The index of the member in the set |
2023-08-16 13:20:49 +00:00
### onlyValidIdCommitment
```solidity
modifier onlyValidIdCommitment(uint256 idCommitment)
```
2023-03-30 06:51:48 +00:00
### constructor
```solidity
2023-07-26 10:42:37 +00:00
constructor(uint256 membershipDeposit, uint256 depth, address _poseidonHasher, address _verifier) internal
2023-03-30 06:51:48 +00:00
```
### register
```solidity
2023-07-31 05:19:29 +00:00
function register(uint256 idCommitment) external payable virtual
2023-03-30 06:51:48 +00:00
```
Allows a user to register as a member
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | ------- | ------------------------------ |
2023-03-30 06:51:48 +00:00
| idCommitment | uint256 | The idCommitment of the member |
2023-08-21 07:07:15 +00:00
### \_register
2023-03-30 06:51:48 +00:00
```solidity
2023-07-31 05:19:29 +00:00
function _register(uint256 idCommitment, uint256 stake) internal virtual
2023-03-30 06:51:48 +00:00
```
Registers a member
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | ------- | -------------------------------------- |
| idCommitment | uint256 | The idCommitment of the member |
| stake | uint256 | The amount of eth staked by the member |
2023-03-30 06:51:48 +00:00
2023-08-21 07:07:15 +00:00
### \_validateRegistration
2023-07-26 10:42:37 +00:00
```solidity
function _validateRegistration(uint256 idCommitment) internal view virtual
```
_Inheriting contracts MUST override this function_
2023-03-30 14:53:08 +00:00
### slash
2023-03-30 06:51:48 +00:00
```solidity
2023-07-31 05:19:29 +00:00
function slash(uint256 idCommitment, address payable receiver, uint256[8] proof) external virtual
2023-03-30 06:51:48 +00:00
```
2023-05-26 08:01:05 +00:00
_Allows a user to slash a member_
2023-03-30 06:51:48 +00:00
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | --------------- | ------------------------------ |
| idCommitment | uint256 | The idCommitment of the member |
| receiver | address payable | |
| proof | uint256[8] | |
2023-03-30 06:51:48 +00:00
2023-08-21 07:07:15 +00:00
### \_slash
2023-03-30 06:51:48 +00:00
```solidity
2023-07-31 05:19:29 +00:00
function _slash(uint256 idCommitment, address payable receiver, uint256[8] proof) internal virtual
2023-03-30 06:51:48 +00:00
```
2023-05-26 08:01:05 +00:00
_Slashes a member by removing them from the set, and adding their
stake to the receiver's available withdrawal balance_
2023-03-30 06:51:48 +00:00
#### Parameters
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ------------ | --------------- | -------------------------------- |
| idCommitment | uint256 | The idCommitment of the member |
| receiver | address payable | The address to receive the funds |
| proof | uint256[8] | |
2023-03-30 06:51:48 +00:00
2023-08-21 07:07:15 +00:00
### \_validateSlash
2023-07-26 10:42:37 +00:00
```solidity
function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] proof) internal view virtual
```
2023-03-30 14:53:08 +00:00
### withdraw
```solidity
2023-07-31 05:19:29 +00:00
function withdraw() external virtual
2023-03-30 14:53:08 +00:00
```
Allows a user to withdraw funds allocated to them upon slashing a member
2023-03-30 06:51:48 +00:00
### hash
```solidity
2023-11-30 11:32:00 +00:00
function hash(uint256[2] inputs) internal view returns (uint256)
2023-03-30 06:51:48 +00:00
```
Hashes a value using the Poseidon hasher
2023-11-30 11:32:00 +00:00
NOTE: The variant of Poseidon we use accepts only 1 input, assume n=2
2023-03-30 06:51:48 +00:00
#### Parameters
2023-11-30 11:32:00 +00:00
| Name | Type | Description |
| ------ | ---------- | ------------------ |
| inputs | uint256[2] | The values to hash |
2023-05-26 08:01:05 +00:00
2023-08-16 13:20:49 +00:00
### isValidCommitment
```solidity
function isValidCommitment(uint256 idCommitment) public view returns (bool)
```
2023-08-21 07:07:15 +00:00
### \_verifyProof
2023-05-26 08:01:05 +00:00
```solidity
2023-07-31 05:19:29 +00:00
function _verifyProof(uint256 idCommitment, address receiver, uint256[8] proof) internal view virtual returns (bool)
2023-05-26 08:01:05 +00:00
```
_Groth16 proof verification_
2023-05-31 07:29:56 +00:00
2023-11-30 11:32:00 +00:00
### computeRoot
```solidity
function computeRoot() external view returns (uint256)
```
2023-05-31 07:29:56 +00:00
## Pairing
### G1Point
```solidity
struct G1Point {
uint256 X;
uint256 Y;
}
```
### G2Point
```solidity
struct G2Point {
uint256[2] X;
uint256[2] Y;
}
```
### P1
```solidity
function P1() internal pure returns (struct Pairing.G1Point)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---------------------- | ------------------- |
| [0] | struct Pairing.G1Point | the generator of G1 |
2023-05-31 07:29:56 +00:00
### P2
```solidity
function P2() internal pure returns (struct Pairing.G2Point)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---------------------- | ------------------- |
| [0] | struct Pairing.G2Point | the generator of G2 |
2023-05-31 07:29:56 +00:00
### negate
```solidity
function negate(struct Pairing.G1Point p) internal pure returns (struct Pairing.G1Point r)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---------------------- | -------------------------------------------------------------- |
| r | struct Pairing.G1Point | the negation of p, i.e. p.addition(p.negate()) should be zero. |
2023-05-31 07:29:56 +00:00
### addition
```solidity
function addition(struct Pairing.G1Point p1, struct Pairing.G1Point p2) internal view returns (struct Pairing.G1Point r)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---------------------- | --------------------------- |
| r | struct Pairing.G1Point | the sum of two points of G1 |
2023-05-31 07:29:56 +00:00
### scalar_mul
```solidity
function scalar_mul(struct Pairing.G1Point p, uint256 s) internal view returns (struct Pairing.G1Point r)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| r | struct Pairing.G1Point | the product of a point on G1 and a scalar, i.e. p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. |
2023-05-31 07:29:56 +00:00
### pairing
```solidity
function pairing(struct Pairing.G1Point[] p1, struct Pairing.G2Point[] p2) internal view returns (bool)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [0] | bool | the result of computing the pairing check e(p1[0], p2[0]) _ .... _ e(p1[n], p2[n]) == 1 For example pairing([P1(), P1().negate()], [P2(), P2()]) should return true. |
2023-05-31 07:29:56 +00:00
### pairingProd2
```solidity
function pairingProd2(struct Pairing.G1Point a1, struct Pairing.G2Point a2, struct Pairing.G1Point b1, struct Pairing.G2Point b2) internal view returns (bool)
```
Convenience method for a pairing check for two pairs.
### pairingProd3
```solidity
function pairingProd3(struct Pairing.G1Point a1, struct Pairing.G2Point a2, struct Pairing.G1Point b1, struct Pairing.G2Point b2, struct Pairing.G1Point c1, struct Pairing.G2Point c2) internal view returns (bool)
```
Convenience method for a pairing check for three pairs.
### pairingProd4
```solidity
function pairingProd4(struct Pairing.G1Point a1, struct Pairing.G2Point a2, struct Pairing.G1Point b1, struct Pairing.G2Point b2, struct Pairing.G1Point c1, struct Pairing.G2Point c2, struct Pairing.G1Point d1, struct Pairing.G2Point d2) internal view returns (bool)
```
Convenience method for a pairing check for four pairs.
## Verifier
### VerifyingKey
```solidity
struct VerifyingKey {
struct Pairing.G1Point alfa1;
struct Pairing.G2Point beta2;
struct Pairing.G2Point gamma2;
struct Pairing.G2Point delta2;
struct Pairing.G1Point[] IC;
}
```
### Proof
```solidity
struct Proof {
struct Pairing.G1Point A;
struct Pairing.G2Point B;
struct Pairing.G1Point C;
}
```
### verifyingKey
```solidity
function verifyingKey() internal pure returns (struct Verifier.VerifyingKey vk)
```
### verify
```solidity
function verify(uint256[] input, struct Verifier.Proof proof) internal view returns (uint256)
```
### verifyProof
```solidity
function verifyProof(uint256[2] a, uint256[2][2] b, uint256[2] c, uint256[2] input) public view returns (bool r)
```
#### Return Values
2023-08-21 07:07:15 +00:00
| Name | Type | Description |
| ---- | ---- | --------------------------- |
| r | bool | bool true if proof is valid |