tests
This commit is contained in:
parent
a31dd618f3
commit
9392027851
@ -3,7 +3,7 @@
|
||||
{
|
||||
"files": "*.sol",
|
||||
"options": {
|
||||
"printWidth": 80,
|
||||
"printWidth": 120,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false,
|
||||
"singleQuote": false,
|
||||
|
@ -4,16 +4,34 @@ pragma solidity ^0.6.12;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import { IRelayerRegistryProxy } from "./interfaces/RelayerRegistryProxy.sol";
|
||||
import { IRelayerRegistry } from "./interfaces/RelayerRegistry.sol";
|
||||
import { ENSNamehash } from "./libraries/EnsNamehash.sol";
|
||||
import { EnsResolve } from "torn-token/contracts/ENS.sol";
|
||||
|
||||
contract Proposal is EnsResolve {
|
||||
using ENSNamehash for bytes;
|
||||
|
||||
contract Proposal {
|
||||
address immutable newRelayerRegistry;
|
||||
address constant relayerRegistryProxyAddr = 0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2;
|
||||
|
||||
constructor(address _newRelayerRegistry) public {
|
||||
newRelayerRegistry = _newRelayerRegistry;
|
||||
}
|
||||
|
||||
function executeProposal() public {
|
||||
IRelayerRegistryProxy relayerRegistryProxy = IRelayerRegistryProxy(0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2);
|
||||
IRelayerRegistryProxy relayerRegistryProxy = IRelayerRegistryProxy(relayerRegistryProxyAddr);
|
||||
relayerRegistryProxy.upgradeTo(newRelayerRegistry);
|
||||
|
||||
string[5] memory cheatingRelayers = [
|
||||
"available-reliable-relayer.eth",
|
||||
"0xtornadocash.eth",
|
||||
"0xtorn365.eth",
|
||||
"tornrelayers.eth",
|
||||
"moon-relayer.eth"
|
||||
];
|
||||
for (uint i = 0; i < cheatingRelayers.length; i++) {
|
||||
address cheatingRelayer = resolve(bytes(cheatingRelayers[i]).namehash());
|
||||
IRelayerRegistry(relayerRegistryProxyAddr).unregisterRelayer(cheatingRelayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -58,12 +58,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
event StakeBurned(address relayer, uint256 amountBurned);
|
||||
event MinimumStakeAmount(uint256 minStakeAmount);
|
||||
event RouterRegistered(address tornadoRouter);
|
||||
event RelayerRegistered(
|
||||
bytes32 relayer,
|
||||
string ensName,
|
||||
address relayerAddress,
|
||||
uint256 stakedAmount
|
||||
);
|
||||
event RelayerRegistered(bytes32 relayer, string ensName, address relayerAddress, uint256 stakedAmount);
|
||||
event RelayerUnregistered(address relayer);
|
||||
|
||||
modifier onlyGovernance() {
|
||||
@ -81,13 +76,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
_;
|
||||
}
|
||||
|
||||
constructor(
|
||||
address _torn,
|
||||
address _governance,
|
||||
address _ens,
|
||||
address _staking,
|
||||
address _feeManager
|
||||
) public {
|
||||
constructor(address _torn, address _governance, address _ens, address _staking, address _feeManager) public {
|
||||
torn = TORN(_torn);
|
||||
governance = _governance;
|
||||
ens = IENS(_ens);
|
||||
@ -112,11 +101,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @param stake the initial amount of stake in TORN the relayer is depositing
|
||||
*
|
||||
*/
|
||||
function register(
|
||||
string calldata ensName,
|
||||
uint256 stake,
|
||||
address[] calldata workersToRegister
|
||||
) external {
|
||||
function register(string calldata ensName, uint256 stake, address[] calldata workersToRegister) external {
|
||||
_register(msg.sender, ensName, stake, workersToRegister);
|
||||
}
|
||||
|
||||
@ -173,10 +158,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @param worker Address to register
|
||||
*
|
||||
*/
|
||||
function registerWorker(
|
||||
address relayer,
|
||||
address worker
|
||||
) external onlyRelayer(msg.sender, relayer) {
|
||||
function registerWorker(address relayer, address worker) external onlyRelayer(msg.sender, relayer) {
|
||||
_registerWorker(relayer, worker);
|
||||
}
|
||||
|
||||
@ -195,8 +177,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
*
|
||||
*/
|
||||
function unregisterWorker(address worker) external {
|
||||
if (worker != msg.sender)
|
||||
require(workers[worker] == msg.sender, "only owner of worker");
|
||||
if (worker != msg.sender) require(workers[worker] == msg.sender, "only owner of worker");
|
||||
require(workers[worker] != worker, "cant unregister master");
|
||||
emit WorkerUnregistered(workers[worker], worker);
|
||||
workers[worker] = address(0);
|
||||
@ -242,11 +223,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
_stakeToRelayer(staker, relayer, stake);
|
||||
}
|
||||
|
||||
function _stakeToRelayer(
|
||||
address staker,
|
||||
address relayer,
|
||||
uint256 stake
|
||||
) internal {
|
||||
function _stakeToRelayer(address staker, address relayer, uint256 stake) internal {
|
||||
require(workers[relayer] == relayer, "!registered");
|
||||
torn.safeTransferFrom(staker, address(staking), stake);
|
||||
relayers[relayer].balance = stake.add(relayers[relayer].balance);
|
||||
@ -265,11 +242,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @param pool instance to get fee for
|
||||
*
|
||||
*/
|
||||
function burn(
|
||||
address sender,
|
||||
address relayer,
|
||||
ITornadoInstance pool
|
||||
) external onlyTornadoRouter {
|
||||
function burn(address sender, address relayer, ITornadoInstance pool) external onlyTornadoRouter {
|
||||
address masterAddress = workers[sender];
|
||||
if (masterAddress == address(0)) {
|
||||
require(workers[relayer] == address(0), "Only custom relayer");
|
||||
@ -298,9 +271,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @param tornadoRouterAddress address of the new proxy
|
||||
*
|
||||
*/
|
||||
function setTornadoRouter(
|
||||
address tornadoRouterAddress
|
||||
) external onlyGovernance {
|
||||
function setTornadoRouter(address tornadoRouterAddress) external onlyGovernance {
|
||||
tornadoRouter = tornadoRouterAddress;
|
||||
emit RouterRegistered(tornadoRouterAddress);
|
||||
}
|
||||
@ -337,10 +308,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @return true if registered
|
||||
*
|
||||
*/
|
||||
function isRelayerRegistered(
|
||||
address relayer,
|
||||
address toResolve
|
||||
) external view returns (bool) {
|
||||
function isRelayerRegistered(address relayer, address toResolve) external view returns (bool) {
|
||||
return workers[toResolve] == relayer;
|
||||
}
|
||||
|
||||
@ -350,9 +318,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @return relayer's ensHash
|
||||
*
|
||||
*/
|
||||
function getRelayerEnsHash(
|
||||
address relayer
|
||||
) external view returns (bytes32) {
|
||||
function getRelayerEnsHash(address relayer) external view returns (bytes32) {
|
||||
return relayers[workers[relayer]].ensHash;
|
||||
}
|
||||
|
||||
@ -362,9 +328,7 @@ contract RelayerRegistry is Initializable, EnsResolve {
|
||||
* @return relayer's balance
|
||||
*
|
||||
*/
|
||||
function getRelayerBalance(
|
||||
address relayer
|
||||
) external view returns (uint256) {
|
||||
function getRelayerBalance(address relayer) external view returns (uint256) {
|
||||
return relayers[workers[relayer]].balance;
|
||||
}
|
||||
}
|
||||
|
7
contracts/interfaces/RelayerRegistry.sol
Normal file
7
contracts/interfaces/RelayerRegistry.sol
Normal file
@ -0,0 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.6.12;
|
||||
|
||||
interface IRelayerRegistry {
|
||||
function unregisterRelayer(address relayer) external;
|
||||
}
|
@ -16,8 +16,9 @@ module.exports = {
|
||||
forking: {
|
||||
url: "https://eth.llamarpc.com",
|
||||
enabled: true,
|
||||
blockNumber: 18391425
|
||||
}
|
||||
blockNumber: 18391425,
|
||||
},
|
||||
chainId: 1
|
||||
}
|
||||
},
|
||||
etherscan: {
|
||||
|
13
package-lock.json
generated
13
package-lock.json
generated
@ -24,6 +24,7 @@
|
||||
"@types/chai": "^4.3.9",
|
||||
"@types/mocha": "^10.0.2",
|
||||
"chai": "^4.3.10",
|
||||
"chai-things": "^0.2.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"ethers": "^6.8.0",
|
||||
"hardhat": "^2.18.1",
|
||||
@ -2796,6 +2797,12 @@
|
||||
"chai": ">= 2.1.2 < 5"
|
||||
}
|
||||
},
|
||||
"node_modules/chai-things": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/chai-things/-/chai-things-0.2.0.tgz",
|
||||
"integrity": "sha512-6ns0SU21xdRCoEXVKH3HGbwnsgfVMXQ+sU5V8PI9rfxaITos8lss1vUxbF1FAcJKjfqmmmLVlr/z3sLes00w+A==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
@ -12272,6 +12279,12 @@
|
||||
"check-error": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"chai-things": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/chai-things/-/chai-things-0.2.0.tgz",
|
||||
"integrity": "sha512-6ns0SU21xdRCoEXVKH3HGbwnsgfVMXQ+sU5V8PI9rfxaITos8lss1vUxbF1FAcJKjfqmmmLVlr/z3sLes00w+A==",
|
||||
"dev": true
|
||||
},
|
||||
"chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
|
@ -7,7 +7,8 @@
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
"test": "npx hardhat test",
|
||||
"deploy": "npx hardhat run script/deploy.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
@ -22,6 +23,7 @@
|
||||
"@types/chai": "^4.3.9",
|
||||
"@types/mocha": "^10.0.2",
|
||||
"chai": "^4.3.10",
|
||||
"chai-things": "^0.2.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"ethers": "^6.8.0",
|
||||
"hardhat": "^2.18.1",
|
||||
|
175
test/RelayerRegistry.js
Normal file
175
test/RelayerRegistry.js
Normal file
@ -0,0 +1,175 @@
|
||||
const { time, loadFixture } = require("@nomicfoundation/hardhat-toolbox/network-helpers");
|
||||
const { expect, assert } = require("chai");
|
||||
const { ethers, network } = require("hardhat");
|
||||
const { relayerRegistry } = require("torn-token");
|
||||
|
||||
describe("Registry update", function () {
|
||||
async function deployAndExecuteFixture() {
|
||||
const RelayerRegistryFactory = await ethers.getContractFactory("RelayerRegistry");
|
||||
const constructorArgs = [
|
||||
"0x77777FeDdddFfC19Ff86DB637967013e6C6A116C",
|
||||
"0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce",
|
||||
"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
||||
"0x5B3f656C80E8ddb9ec01Dd9018815576E9238c29",
|
||||
"0x5f6c97C6AD7bdd0AE7E0Dd4ca33A4ED3fDabD4D7",
|
||||
];
|
||||
const relayerRegistry = await RelayerRegistryFactory.deploy(...constructorArgs);
|
||||
const deployedRegistryAddr = await relayerRegistry.getAddress();
|
||||
const proposalFactory = await ethers.getContractFactory("Proposal");
|
||||
const proposal = await proposalFactory.deploy(deployedRegistryAddr);
|
||||
const deployedProposalAddr = await proposal.getAddress();
|
||||
|
||||
|
||||
const bigStakerAddr = "0xE4143f6377AEcd7193b9731d1C28815b57C4f5Ab";
|
||||
await network.provider.send("hardhat_setBalance", [
|
||||
bigStakerAddr,
|
||||
"0x116663015358483537"
|
||||
]);
|
||||
const stakerSigner = await ethers.getImpersonatedSigner(bigStakerAddr);
|
||||
const governanceAddr = "0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce";
|
||||
const governanceContract = await ethers.getContractAt(require("./abi/governance.abi.json"), governanceAddr, stakerSigner);
|
||||
await governanceContract.propose(deployedProposalAddr, "");
|
||||
const proposalId = await governanceContract.proposalCount();
|
||||
await time.increase(60 * 60);
|
||||
await governanceContract.castVote(proposalId, true);
|
||||
await time.increase(60 * 60 * 24 * 7 + 60);
|
||||
await governanceContract.execute(proposalId);
|
||||
|
||||
const governanceSigner = await ethers.getImpersonatedSigner(governanceAddr);
|
||||
const relayerRegistryProxyAddr = "0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2";
|
||||
const relayerRegistryContract = await ethers.getContractAt("RelayerRegistry", relayerRegistryProxyAddr, governanceSigner);
|
||||
|
||||
return { relayerRegistryProxyAddr, deployedRegistryAddr, relayerRegistryContract, governanceSigner };
|
||||
}
|
||||
|
||||
async function unregisterRelayer(ensNameOrAddress){
|
||||
const { relayerRegistryContract } = await loadFixture(deployAndExecuteFixture);
|
||||
const relayerAddr = ethers.isAddress(ensNameOrAddress) ? ensNameOrAddress : resolveAddr(ensNameOrAddress);
|
||||
await relayerRegistryContract.unregisterRelayer(relayerAddr);
|
||||
}
|
||||
|
||||
async function resolveAddr(ensName){
|
||||
const ensNode = ethers.namehash(ensName);
|
||||
const ensAddr = "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
|
||||
const registryContract = await ethers.getContractAt(require("./abi/ensRegistry.abi.json"), ensAddr);
|
||||
const resolverAddr = await registryContract.resolver(ensNode);
|
||||
const resolverContract = await ethers.getContractAt(require("./abi/ensResolver.abi.json"), resolverAddr);
|
||||
|
||||
return await resolverContract.addr(ensNode);
|
||||
}
|
||||
|
||||
async function getOldRelayerRegistryContractFixture(){
|
||||
const relayerRegistryProxyAddr = "0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2";
|
||||
return await ethers.getContractAt(require("./abi/relayerRegistryOld.abi.json"), relayerRegistryProxyAddr);
|
||||
}
|
||||
|
||||
it("Implementation address should be updated", async function () {
|
||||
await loadFixture(getOldRelayerRegistryContractFixture);
|
||||
const { relayerRegistryProxyAddr, deployedRegistryAddr } = await loadFixture(deployAndExecuteFixture);
|
||||
const implementation = await ethers.provider.getStorage(relayerRegistryProxyAddr, "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc");
|
||||
const [implementationAddr] = new ethers.AbiCoder().decode(["address"], implementation);
|
||||
|
||||
expect(implementationAddr).to.equal(deployedRegistryAddr)
|
||||
});
|
||||
|
||||
describe("Unregister relayer", function(){
|
||||
|
||||
it("Uregister relayer function should work", async function(){
|
||||
const testRelayerAddr = await resolveAddr("first-relayer.eth");
|
||||
|
||||
const relayerRegistryOldContract = await loadFixture(getOldRelayerRegistryContractFixture);
|
||||
let isRelayer = await relayerRegistryOldContract.isRelayer(testRelayerAddr);
|
||||
let isRelayerRegistered = await relayerRegistryOldContract.isRelayerRegistered(testRelayerAddr, testRelayerAddr);
|
||||
expect(isRelayer).to.equal(true);
|
||||
expect(isRelayerRegistered).to.equal(true);
|
||||
|
||||
const { relayerRegistryContract } = await loadFixture(deployAndExecuteFixture);
|
||||
await unregisterRelayer(testRelayerAddr);
|
||||
|
||||
isRelayer = await relayerRegistryContract.isRelayer(testRelayerAddr);
|
||||
isRelayerRegistered = await relayerRegistryContract.isRelayerRegistered(testRelayerAddr, testRelayerAddr);
|
||||
|
||||
expect(isRelayer).to.equal(false);
|
||||
expect(isRelayerRegistered).to.equal(false);
|
||||
})
|
||||
|
||||
it("Unregistered relayer should have zero balance", async function(){
|
||||
const testRelayerAddr = await resolveAddr("first-relayer.eth");
|
||||
const { relayerRegistryContract } = await loadFixture(deployAndExecuteFixture);
|
||||
await unregisterRelayer(testRelayerAddr);
|
||||
|
||||
const relayerBalance = await relayerRegistryContract.getRelayerBalance(testRelayerAddr);
|
||||
expect(relayerBalance).to.equal(0);
|
||||
})
|
||||
|
||||
it("Tornado router address should be valid", async function(){
|
||||
const relayerRegistryOldContract = await loadFixture(getOldRelayerRegistryContractFixture);
|
||||
const oldRegistryRouterAddress = await relayerRegistryOldContract.tornadoRouter();
|
||||
|
||||
const { relayerRegistryContract } = await loadFixture(deployAndExecuteFixture);
|
||||
expect(await relayerRegistryContract.tornadoRouter()).to.equal(oldRegistryRouterAddress);
|
||||
})
|
||||
|
||||
it("Aggregator contract data for unregistered relayers should be valid", async function(){
|
||||
const aggregatorAddr = "0xE8F47A78A6D52D317D0D2FFFac56739fE14D1b49";
|
||||
const aggregatorContract = await ethers.getContractAt(require("./abi/aggregator.abi.json"), aggregatorAddr);
|
||||
const notRelayer = "🦋️-effect.eth";
|
||||
const testRelayer = "first-relayer.eth";
|
||||
|
||||
const callAggr = async () => await aggregatorContract.relayersData([notRelayer, testRelayer].map(ethers.namehash), ["mainnet-tornado", "bsc-tornado"]);
|
||||
const oldData = await callAggr();
|
||||
|
||||
await loadFixture(deployAndExecuteFixture);
|
||||
await unregisterRelayer(testRelayer);
|
||||
|
||||
const newData = await callAggr();
|
||||
|
||||
assert.deepEqual(oldData[0], newData[0]);
|
||||
expect(oldData[1][1]).to.greaterThan(500n * 10n ** 18n);
|
||||
expect(newData[1][1]).to.equal(0);
|
||||
expect(oldData[1][2]).to.equal(true);
|
||||
expect(newData[1][2]).to.equal(false);
|
||||
})
|
||||
|
||||
it("Cheating relayers should be unregistered", async function(){
|
||||
const cheatingRelayers = await Promise.all([
|
||||
"available-reliable-relayer.eth",
|
||||
"0xtornadocash.eth",
|
||||
"0xtorn365.eth",
|
||||
"tornrelayers.eth",
|
||||
"moon-relayer.eth"
|
||||
].map(resolveAddr));
|
||||
|
||||
const relayerRegistryOldContract = await loadFixture(getOldRelayerRegistryContractFixture);
|
||||
let areRegistered = await Promise.all(cheatingRelayers.map(r => relayerRegistryOldContract.isRelayer(r)));
|
||||
let balances = await Promise.all(cheatingRelayers.map(r => relayerRegistryOldContract.getRelayerBalance(r)));
|
||||
|
||||
expect(areRegistered).satisfy(v => v.every(v => v === true));
|
||||
expect(balances).satisfy(v => v.every(v => v >= 0n));
|
||||
|
||||
const { relayerRegistryContract } = await loadFixture(deployAndExecuteFixture);
|
||||
areRegistered = await Promise.all(cheatingRelayers.map(r => relayerRegistryContract.isRelayer(r)));
|
||||
balances = await Promise.all(cheatingRelayers.map(r => relayerRegistryContract.getRelayerBalance(r)));
|
||||
|
||||
expect(areRegistered).satisfy(v => v.every(v => v === false));
|
||||
expect(balances).satisfy(v => v.every(v => v === 0n));
|
||||
})
|
||||
})
|
||||
|
||||
it("Unregistered relayers can register again", async function(){
|
||||
const { relayerRegistryContract, governanceSigner } = await loadFixture(deployAndExecuteFixture);
|
||||
const relayerEns = "moon-relayer.eth";
|
||||
const unregisteredRelayer = await resolveAddr(relayerEns);
|
||||
const tornContract = await ethers.getContractAt(require("./abi/torn.abi.json"), "0x77777FeDdddFfC19Ff86DB637967013e6C6A116C", governanceSigner);
|
||||
const toStake = 2000n * 10n ** 18n;
|
||||
await tornContract.transfer(unregisteredRelayer, toStake);
|
||||
|
||||
const relayerSigner = await ethers.getImpersonatedSigner(unregisteredRelayer);
|
||||
await relayerRegistryContract.connect(relayerSigner).register(relayerEns, toStake, []);
|
||||
const isRelayerRegistered = await relayerRegistryContract.isRelayerRegistered(unregisteredRelayer, unregisteredRelayer);
|
||||
const relayerBalance = await relayerRegistryContract.getRelayerBalance(unregisteredRelayer);
|
||||
|
||||
expect(isRelayerRegistered).to.be.equal(true);
|
||||
expect(relayerBalance).to.be.equal(toStake);
|
||||
})
|
||||
});
|
1
test/abi/aggregator.abi.json
Normal file
1
test/abi/aggregator.abi.json
Normal file
@ -0,0 +1 @@
|
||||
[{"inputs":[],"name":"ensRegistry","outputs":[{"internalType":"contract ENSRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Governance","name":"governance","type":"address"}],"name":"getAllProposals","outputs":[{"components":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"extended","type":"bool"},{"internalType":"enum Governance.ProposalState","name":"state","type":"uint8"}],"internalType":"struct GovernanceAggregator.Proposal[]","name":"proposals","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Governance","name":"governance","type":"address"},{"internalType":"address[]","name":"accs","type":"address[]"}],"name":"getGovernanceBalances","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Governance","name":"governance","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getUserData","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"latestProposalId","type":"uint256"},{"internalType":"uint256","name":"latestProposalIdState","type":"uint256"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"address","name":"delegatee","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerRegistry","outputs":[{"internalType":"contract RelayerRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_relayers","type":"bytes32[]"},{"internalType":"string[]","name":"_subdomains","type":"string[]"}],"name":"relayersData","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"isRegistered","type":"bool"},{"internalType":"string[20]","name":"records","type":"string[20]"}],"internalType":"struct Relayer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"}]
|
1
test/abi/ensRegistry.abi.json
Normal file
1
test/abi/ensRegistry.abi.json
Normal file
@ -0,0 +1 @@
|
||||
[{"inputs":[{"internalType":"contract ENS","name":"_old","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"old","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setSubnodeRecord","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]
|
1
test/abi/ensResolver.abi.json
Normal file
1
test/abi/ensResolver.abi.json
Normal file
File diff suppressed because one or more lines are too long
1
test/abi/governance.abi.json
Normal file
1
test/abi/governance.abi.json
Normal file
File diff suppressed because one or more lines are too long
1
test/abi/relayerRegistryOld.abi.json
Normal file
1
test/abi/relayerRegistryOld.abi.json
Normal file
File diff suppressed because one or more lines are too long
1
test/abi/torn.abi.json
Normal file
1
test/abi/torn.abi.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user