mirror of
https://github.com/tornadocash/relayer-registry.git
synced 2024-11-21 17:26:51 +01:00
init
This commit is contained in:
parent
884c48899d
commit
0ec84a3c4a
@ -1,4 +1,4 @@
|
||||
# Peppersec solidity template [![Build Status](https://github.com/peppersec/solidity-template/workflows/build/badge.svg)](https://github.com/peppersec/solidity-template/actions)
|
||||
# Tornado Cash relayer registry contract [![Build Status](https://github.com/tornadocash/relayer-registry/workflows/build/badge.svg)](https://github.com/tornadocash/relayer-registry/actions)
|
||||
|
||||
## Dependencies
|
||||
|
||||
@ -9,7 +9,6 @@
|
||||
|
||||
```bash
|
||||
$ yarn
|
||||
$ cp .env.example .env
|
||||
$ yarn test
|
||||
```
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.6.12;
|
||||
|
||||
contract Echoer {
|
||||
event Echo(address indexed who, bytes data);
|
||||
|
||||
function echo(bytes calldata data) external {
|
||||
emit Echo(msg.sender, data);
|
||||
}
|
||||
}
|
32
contracts/RelayerRegistry.sol
Normal file
32
contracts/RelayerRegistry.sol
Normal file
@ -0,0 +1,32 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.6.12;
|
||||
|
||||
contract RelayerRegistry {
|
||||
address public immutable governance;
|
||||
mapping(bytes32 => bool) public isRelayer;
|
||||
|
||||
event RelayerAdded(bytes32 indexed relayer);
|
||||
event RelayerRemoved(bytes32 indexed relayer);
|
||||
|
||||
modifier onlyGovernance() {
|
||||
require(msg.sender == governance, "unauthorized");
|
||||
_;
|
||||
}
|
||||
|
||||
constructor(address _governance) public {
|
||||
governance = _governance;
|
||||
}
|
||||
|
||||
function add(bytes32 _relayer) public onlyGovernance {
|
||||
require(!isRelayer[_relayer], "The relayer already exists");
|
||||
isRelayer[_relayer] = true;
|
||||
emit RelayerAdded(_relayer);
|
||||
}
|
||||
|
||||
function remove(bytes32 _relayer) public onlyGovernance {
|
||||
require(isRelayer[_relayer], "The relayer does not exist");
|
||||
isRelayer[_relayer] = false;
|
||||
emit RelayerRemoved(_relayer);
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
/* global artifacts */
|
||||
const Echoer = artifacts.require('Echoer')
|
||||
|
||||
module.exports = function (deployer) {
|
||||
return deployer.then(async () => {
|
||||
const echoer = await deployer.deploy(Echoer)
|
||||
|
||||
console.log('Echoer :', echoer.address)
|
||||
})
|
||||
}
|
10
migrations/1_deploy_registry.js
Normal file
10
migrations/1_deploy_registry.js
Normal file
@ -0,0 +1,10 @@
|
||||
/* global artifacts */
|
||||
const RelayerRegistry = artifacts.require('RelayerRegistry')
|
||||
|
||||
module.exports = function (deployer, network, accounts) {
|
||||
return deployer.then(async () => {
|
||||
const registry = await deployer.deploy(RelayerRegistry, accounts[0])
|
||||
|
||||
console.log('Registry :', registry.address)
|
||||
})
|
||||
}
|
@ -43,5 +43,6 @@
|
||||
"truffle-hdwallet-provider": "^1.0.17",
|
||||
"truffle-plugin-verify": "^0.3.11",
|
||||
"web3": "^1.2.11"
|
||||
}
|
||||
},
|
||||
"dependencies": {}
|
||||
}
|
||||
|
@ -1,32 +0,0 @@
|
||||
/* global artifacts, web3, contract */
|
||||
require('chai').use(require('bn-chai')(web3.utils.BN)).use(require('chai-as-promised')).should()
|
||||
|
||||
const { takeSnapshot, revertSnapshot } = require('../scripts/ganacheHelper')
|
||||
const Echoer = artifacts.require('./Echoer.sol')
|
||||
|
||||
contract('Echoer', (accounts) => {
|
||||
let echoer
|
||||
let snapshotId
|
||||
|
||||
before(async () => {
|
||||
echoer = await Echoer.deployed()
|
||||
snapshotId = await takeSnapshot()
|
||||
})
|
||||
|
||||
describe('#echo', () => {
|
||||
it('should work', async () => {
|
||||
const data = '0xbeef'
|
||||
const { logs } = await echoer.echo(data)
|
||||
|
||||
logs[0].event.should.be.equal('Echo')
|
||||
logs[0].args.who.should.be.equal(accounts[0])
|
||||
logs[0].args.data.should.be.equal(data)
|
||||
})
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
await revertSnapshot(snapshotId.result)
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
snapshotId = await takeSnapshot()
|
||||
})
|
||||
})
|
65
test/relayerRegistry.js
Normal file
65
test/relayerRegistry.js
Normal file
@ -0,0 +1,65 @@
|
||||
/* global artifacts, web3, contract */
|
||||
require('chai').use(require('bn-chai')(web3.utils.BN)).use(require('chai-as-promised')).should()
|
||||
|
||||
const { takeSnapshot, revertSnapshot } = require('../scripts/ganacheHelper')
|
||||
const RelayerRegistry = artifacts.require('./RelayerRegistry.sol')
|
||||
|
||||
contract('RelayerRegistry', (accounts) => {
|
||||
let registry
|
||||
let snapshotId
|
||||
const relayer1 = '0x3b43172e77b9e7272c8045d818f7ce325205bed01fb56a3747b78ae9c0ce4334'
|
||||
|
||||
before(async () => {
|
||||
registry = await RelayerRegistry.new(accounts[0])
|
||||
snapshotId = await takeSnapshot()
|
||||
})
|
||||
|
||||
describe('#add', () => {
|
||||
it('should work', async () => {
|
||||
const { logs } = await registry.add(relayer1)
|
||||
|
||||
logs[0].event.should.be.equal('RelayerAdded')
|
||||
logs[0].args.relayer.should.be.equal(relayer1)
|
||||
})
|
||||
|
||||
it('should prevent double add', async () => {
|
||||
await registry.add(relayer1)
|
||||
await registry.add(relayer1).should.be.rejectedWith('The relayer already exists')
|
||||
})
|
||||
|
||||
it('should allow readd', async () => {
|
||||
await registry.add(relayer1)
|
||||
await registry.remove(relayer1)
|
||||
await registry.add(relayer1)
|
||||
})
|
||||
|
||||
it('should prevent unauthorized access', async () => {
|
||||
await registry.add(relayer1, { from: accounts[1] }).should.be.rejectedWith('unauthorized')
|
||||
})
|
||||
})
|
||||
|
||||
describe('#remove', () => {
|
||||
it('should work', async () => {
|
||||
await registry.add(relayer1)
|
||||
const { logs } = await registry.remove(relayer1)
|
||||
|
||||
logs[0].event.should.be.equal('RelayerRemoved')
|
||||
logs[0].args.relayer.should.be.equal(relayer1)
|
||||
})
|
||||
|
||||
it('should prevent remove not existing', async () => {
|
||||
await registry.remove(relayer1).should.be.rejectedWith('The relayer does not exist')
|
||||
})
|
||||
|
||||
it('should prevent unauthorized access', async () => {
|
||||
await registry.add(relayer1)
|
||||
await registry.remove(relayer1, { from: accounts[1] }).should.be.rejectedWith('unauthorized')
|
||||
})
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
await revertSnapshot(snapshotId.result)
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
snapshotId = await takeSnapshot()
|
||||
})
|
||||
})
|
Loading…
Reference in New Issue
Block a user