2022-05-10 14:09:18 -07:00
|
|
|
# src: https://github.com/kilic/rlnapp/blob/master/packages/contracts/contracts/RLN.sol
|
|
|
|
# pragma solidity 0.7.4;
|
|
|
|
|
|
|
|
# import { IPoseidonHasher } from "./crypto/PoseidonHasher.sol";
|
|
|
|
|
|
|
|
# contract RLN {
|
|
|
|
# uint256 public immutable MEMBERSHIP_DEPOSIT;
|
|
|
|
# uint256 public immutable DEPTH;
|
|
|
|
# uint256 public immutable SET_SIZE;
|
|
|
|
|
|
|
|
# uint256 public pubkeyIndex = 0;
|
|
|
|
# mapping(uint256 => uint256) public members;
|
|
|
|
|
|
|
|
# IPoseidonHasher public poseidonHasher;
|
|
|
|
|
|
|
|
# event MemberRegistered(uint256 pubkey, uint256 index);
|
|
|
|
# event MemberWithdrawn(uint256 pubkey, uint256 index);
|
|
|
|
|
|
|
|
# constructor(
|
|
|
|
# uint256 membershipDeposit,
|
|
|
|
# uint256 depth,
|
|
|
|
# address _poseidonHasher
|
|
|
|
# ) public {
|
|
|
|
# MEMBERSHIP_DEPOSIT = membershipDeposit;
|
|
|
|
# DEPTH = depth;
|
|
|
|
# SET_SIZE = 1 << depth;
|
|
|
|
# poseidonHasher = IPoseidonHasher(_poseidonHasher);
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function register(uint256 pubkey) external payable {
|
|
|
|
# require(pubkeyIndex < SET_SIZE, "RLN, register: set is full");
|
|
|
|
# require(msg.value == MEMBERSHIP_DEPOSIT, "RLN, register: membership deposit is not satisfied");
|
|
|
|
# _register(pubkey);
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function registerBatch(uint256[] calldata pubkeys) external payable {
|
|
|
|
# require(pubkeyIndex + pubkeys.length <= SET_SIZE, "RLN, registerBatch: set is full");
|
|
|
|
# require(msg.value == MEMBERSHIP_DEPOSIT * pubkeys.length, "RLN, registerBatch: membership deposit is not satisfied");
|
|
|
|
# for (uint256 i = 0; i < pubkeys.length; i++) {
|
|
|
|
# _register(pubkeys[i]);
|
|
|
|
# }
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function _register(uint256 pubkey) internal {
|
|
|
|
# members[pubkeyIndex] = pubkey;
|
|
|
|
# emit MemberRegistered(pubkey, pubkeyIndex);
|
|
|
|
# pubkeyIndex += 1;
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function withdrawBatch(
|
|
|
|
# uint256[] calldata secrets,
|
|
|
|
# uint256[] calldata pubkeyIndexes,
|
|
|
|
# address payable[] calldata receivers
|
|
|
|
# ) external {
|
|
|
|
# uint256 batchSize = secrets.length;
|
|
|
|
# require(batchSize != 0, "RLN, withdrawBatch: batch size zero");
|
|
|
|
# require(batchSize == pubkeyIndexes.length, "RLN, withdrawBatch: batch size mismatch pubkey indexes");
|
|
|
|
# require(batchSize == receivers.length, "RLN, withdrawBatch: batch size mismatch receivers");
|
|
|
|
# for (uint256 i = 0; i < batchSize; i++) {
|
|
|
|
# _withdraw(secrets[i], pubkeyIndexes[i], receivers[i]);
|
|
|
|
# }
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function withdraw(
|
|
|
|
# uint256 secret,
|
|
|
|
# uint256 _pubkeyIndex,
|
|
|
|
# address payable receiver
|
|
|
|
# ) external {
|
|
|
|
# _withdraw(secret, _pubkeyIndex, receiver);
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function _withdraw(
|
|
|
|
# uint256 secret,
|
|
|
|
# uint256 _pubkeyIndex,
|
|
|
|
# address payable receiver
|
|
|
|
# ) internal {
|
|
|
|
# require(_pubkeyIndex < SET_SIZE, "RLN, _withdraw: invalid pubkey index");
|
|
|
|
# require(members[_pubkeyIndex] != 0, "RLN, _withdraw: member doesn't exist");
|
|
|
|
# require(receiver != address(0), "RLN, _withdraw: empty receiver address");
|
|
|
|
|
|
|
|
# // derive public key
|
|
|
|
# uint256 pubkey = hash([secret, 0]);
|
|
|
|
# require(members[_pubkeyIndex] == pubkey, "RLN, _withdraw: not verified");
|
|
|
|
|
|
|
|
# // delete member
|
|
|
|
# members[_pubkeyIndex] = 0;
|
|
|
|
|
|
|
|
# // refund deposit
|
|
|
|
# receiver.transfer(MEMBERSHIP_DEPOSIT);
|
|
|
|
|
|
|
|
# emit MemberWithdrawn(pubkey, _pubkeyIndex);
|
|
|
|
# }
|
|
|
|
|
|
|
|
# function hash(uint256[2] memory input) internal view returns (uint256) {
|
|
|
|
# return poseidonHasher.hash(input);
|
|
|
|
# }
|
|
|
|
# }
|
|
|
|
|
2022-09-30 18:13:42 +05:30
|
|
|
# PoseidonHasherCode holds the bytecode of Poseidon hasher solidity smart contract:
|
2022-05-10 14:09:18 -07:00
|
|
|
# https://github.com/kilic/rlnapp/blob/master/packages/contracts/contracts/crypto/PoseidonHasher.sol
|
|
|
|
# the solidity contract is compiled separately and the resultant bytecode is copied here
|
2022-09-30 18:13:42 +05:30
|
|
|
const PoseidonHasherCode* = "0x608060405234801561001057600080fd5b50612142806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632c159a1a1461003b578063561558fe14610055575b600080fd5b6100436100a0565b60408051918252519081900360200190f35b6100436004803603604081101561006b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506100af9350505050565b60006100aa6100c0565b905090565b60006100ba826100e4565b92915050565b7f2ff267fd23782a5625e6d804f0a7fa700b8dc6084e2e7a5aff7cd4b1c506d30b90565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040517f165d45ae851912f9a33800b04cc6617b184bf67db11ce904dc82601244551ae281527f10fc284d0af588165f4fc650fe7c53b1d80fbaac16d30518bf142117f42f820460208201527f06b687bd3c688aa9a03545d0835bca75ae82c434bf7d5fb065a2818b5c74814f60408201527f01057eb8e4bba26f12f4ea819251708d72e0605e6de827e990c3ba4ae13f5ecd60608201527e23779a38eb9ef4a9beaf4dc0a2ab5233a28ce6d10ad2512230a275b83017c360808201527f012e5dfdd4f34081753b70c897773f5d2987c8bbae32ad202a27cd61d7fba2fb7f0d1807f022a8d80d9304a1522087b8692dc0acf7b43fea28782d2ae672c0b11f7f17d468d0e6541de501481931453ed1e4a250e5e301f27dc91fe3b4bd522aa53c7f1ea09a4bd33f14eafd75e775d85e568fa668938fdd2f16fad1d4d2d2b9862b007f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8851017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b60208a0151017f061f2e832c23bee84c2f09d63d371cc5eda2f749cdbe9a6a6d20469e9fa36e8b8883840989848b83840909935089838409905089838b83840909925089828309905089828b8384090991507f0e4d154ca9b7f5111958289f43ed5bbc4d4f6118d45d9aefeb778179d921a59b9050808a60408b015184098b60208c015186098c8c518809010101818b8a85098c60808d015187098d60608e01518909010101828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f298d683000ab71c72fe4371cf6cd37bb584b6d816a653ee4bfea62518a337e079250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995508b85860992508b858d8586090994508b84850992508b848d8586090993507f2f860295bc93d694e74905913ddcae47290b9b5abb43a537fe40d9305bd1e1679250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991508b81820992508b818d8586090990508b84850992508b848d8586090993507f1dd8b95942d95c7896be7f3f455e595cbfee5e1023c5d45e6573c8513f1f3dfa9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f189aa3023aeaa7267dd3c74e2c8b9cba363546619bb9c54bcb02b22fe64c51619250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f0da6b697fd05fe54a523131d91e2a7f6ac18184e237c1b20ab1936616f08e5239250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f019df963bfafa7f0e34cf092f33ce93b38b9d130fb44f276196e59f16e63ac5a9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f295332d5ab168bc3c5eb671528c9896b7bd5034fb02472ff2af4fa1087ae658f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f015186090101019450828c8886098d8a84098e8c860901010193508b86870992508b868d8586090995507f0f423b84792458876c314228be9361a604c75010411b87add91b791df2f980fa9250828c60408d015186098d60208e015188098e8e518a090101019150828c8b86098d60808e015188098e60608f01518a090101019050828c8886098d8a88098e8c8a0901010193508b82830992508b828d8586090991507f1171744890a155b5ad9cde4f1f5c4eab878f3730a9fc71f546eb737c84abec5f9250828c60408d015186098d60208e015184098e8e5186090101019550828c8b86098d60808e015184098e60608f01518609010101945082
|
2022-05-10 14:09:18 -07:00
|
|
|
|
2022-09-30 18:13:42 +05:30
|
|
|
# MembershipContractCode contains the bytecode of the membership solidity smart contract:
|
2023-05-11 19:30:26 +05:30
|
|
|
# https://github.com/vacp2p/rln-contract/blob/2c4ddb03120b61b0eea1129b6cfdcd23ab7ad8cb/deployments/sepolia/RLN.json
|
2022-05-10 14:09:18 -07:00
|
|
|
# the solidity contract is compiled separately and the resultant bytecode is copied here
|
2023-05-11 19:30:26 +05:30
|
|
|
const MembershipContractCode* = "0x60e06040523480156200001157600080fd5b50604051620012c0380380620012c0833981810160405281019062000037919062000142565b82608081815250508160a08181525050816001901b60c0818152505080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200019e565b600080fd5b6000819050919050565b620000b781620000a2565b8114620000c357600080fd5b50565b600081519050620000d781620000ac565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200010a82620000dd565b9050919050565b6200011c81620000fd565b81146200012857600080fd5b50565b6000815190506200013c8162000111565b92915050565b6000806000606084860312156200015e576200015d6200009d565b5b60006200016e86828701620000c6565b93505060206200018186828701620000c6565b925050604062000194868287016200012b565b9150509250925092565b60805160a05160c0516110cf620001f1600039600081816104140152818161058501526109070152600061054301526000818161047d015281816105a9015281816105d0015261063c01526110cf6000f3fe60806040526004361061009b5760003560e01c806398366e351161006457806398366e3514610176578063ae74552a146101a1578063bc499128146101cc578063d0383d6814610209578063f207564e14610234578063f220b9ec146102505761009b565b8062f714ce146100a0578063331b6ab3146100c957806340070712146100f45780635daf08ca1461011d57806369e4863f1461015a575b600080fd5b3480156100ac57600080fd5b506100c760048036038101906100c29190610b3f565b61027b565b005b3480156100d557600080fd5b506100de610289565b6040516100eb9190610bde565b60405180910390f35b34801561010057600080fd5b5061011b60048036038101906101169190610cb4565b6102af565b005b34801561012957600080fd5b50610144600480360381019061013f9190610d35565b6103b0565b6040516101519190610d7d565b60405180910390f35b610174600480360381019061016f9190610d98565b6103d0565b005b34801561018257600080fd5b5061018b610541565b6040516101989190610df4565b60405180910390f35b3480156101ad57600080fd5b506101b6610565565b6040516101c39190610df4565b60405180910390f35b3480156101d857600080fd5b506101f360048036038101906101ee9190610d35565b61056b565b6040516102009190610df4565b60405180910390f35b34801561021557600080fd5b5061021e610583565b60405161022b9190610df4565b60405180910390f35b61024e60048036038101906102499190610d35565b6105a7565b005b34801561025c57600080fd5b5061026561063a565b6040516102729190610df4565b60405180910390f35b610285828261065e565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000848490509050600081036102f1576040517fc2e5347d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282905081146103405784849050838390506040517f727c6a75000000000000000000000000000000000000000000000000000000008152600401610337929190610e0f565b60405180910390fd5b60005b818110156103a85761039586868381811061036157610360610e38565b5b9050602002013585858481811061037b5761037a610e38565b5b90506020020160208101906103909190610e67565b61065e565b80806103a090610ec3565b915050610343565b505050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b600082829050905060008103610412576040517fc2e5347d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816000546104419190610f0b565b10610478576040517f75eb4dbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000817f00000000000000000000000000000000000000000000000000000000000000006104a69190610f61565b90508034146104ee5780346040517f25c3f46e0000000000000000000000000000000000000000000000000000000081526004016104e5929190610e0f565b60405180910390fd5b60005b8281101561053a5761052785858381811061050f5761050e610e38565b5b9050602002013584346105229190610fea565b6108ae565b808061053290610ec3565b9150506104f1565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005481565b60016020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000341461062d577f0000000000000000000000000000000000000000000000000000000000000000346040517f25c3f46e00000000
|