Skip to content

Commit

Permalink
update list of validators in Bank
Browse files Browse the repository at this point in the history
  • Loading branch information
DZariusz committed Nov 6, 2024
1 parent a3d876e commit 7df74ed
Show file tree
Hide file tree
Showing 34 changed files with 1,501 additions and 788 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## Unreleased

## [4.15.0] - 2024-10-30
### Changed
- update list of validators in Bank

## [4.14.0] - 2024-07-16
### Added
- `UniswapV3FetcherHelper`
Expand Down
46 changes: 23 additions & 23 deletions deployments/arbitrum_production/ForeignChain.json

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/arbitrum_production/StakingBankStatic.json

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions deployments/arbitrum_production/UmbrellaFeeds.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

46 changes: 23 additions & 23 deletions deployments/avalanche_production/ForeignChain.json

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/avalanche_production/StakingBankStatic.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/base_production/StakingBankStatic.json

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions deployments/base_production/UmbrellaFeeds.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

46 changes: 23 additions & 23 deletions deployments/bnb_production/Chain.json

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/bnb_production/StakingBankStatic.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/bob_production/StakingBankStatic.json

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions deployments/bob_production/UmbrellaFeeds.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

44 changes: 22 additions & 22 deletions deployments/eth_production/ForeignChain.json

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/eth_production/StakingBankStatic.json

Large diffs are not rendered by default.

33 changes: 19 additions & 14 deletions deployments/eth_production/UniswapV3FetcherHelper.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

58 changes: 29 additions & 29 deletions deployments/polygon_production/ForeignChain.json

Large diffs are not rendered by default.

98 changes: 23 additions & 75 deletions deployments/polygon_production/StakingBankStatic.json

Large diffs are not rendered by default.

54 changes: 27 additions & 27 deletions deployments/polygon_production/UmbrellaFeeds.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

82 changes: 15 additions & 67 deletions deployments/rootstock_production/StakingBankStatic.json

Large diffs are not rendered by default.

36 changes: 18 additions & 18 deletions deployments/rootstock_production/UmbrellaFeeds.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"language":"Solidity","sources":{"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n"},"contracts/interfaces/IStakingBank.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.13;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IStakingBank is IERC20 {\n /// @param id address of validator wallet\n /// @param location URL of the validator API\n struct Validator {\n address id;\n string location;\n }\n\n event LogValidatorRegistered(address indexed id);\n event LogValidatorUpdated(address indexed id);\n event LogValidatorRemoved(address indexed id);\n event LogMinAmountForStake(uint256 minAmountForStake);\n\n /// @dev setter for `minAmountForStake`\n function setMinAmountForStake(uint256 _minAmountForStake) external;\n\n /// @dev allows to stake `token` by validators\n /// Validator needs to approve StakingBank beforehand\n /// @param _value amount of tokens to stake\n function stake(uint256 _value) external;\n\n /// @dev notification about approval from `_from` address on UMB token\n /// Staking bank will stake max approved amount from `_from` address\n /// @param _from address which approved token spend for IStakingBank\n function receiveApproval(address _from) external returns (bool success);\n\n /// @dev withdraws stake tokens\n /// it throws, when balance will be less than required minimum for stake\n /// to withdraw all use `exit`\n function withdraw(uint256 _value) external returns (bool success);\n\n /// @dev unstake and withdraw all tokens\n function exit() external returns (bool success);\n\n /// @dev creates (register) new validator\n /// @param _id validator address\n /// @param _location location URL of the validator API\n function create(address _id, string calldata _location) external;\n\n /// @dev removes validator\n /// @param _id validator wallet\n function remove(address _id) external;\n\n /// @dev updates validator location\n /// @param _id validator wallet\n /// @param _location new validator URL\n function update(address _id, string calldata _location) external;\n\n /// @return total number of registered validators (with and without balance)\n function getNumberOfValidators() external view returns (uint256);\n\n /// @dev gets validator address for provided index\n /// @param _ix index in array of list of all validators wallets\n function addresses(uint256 _ix) external view returns (address);\n\n /// @param _id address of validator\n /// @return id address of validator\n /// @return location URL of validator\n function validators(address _id) external view returns (address id, string memory location);\n}\n"},"contracts/interfaces/StakingBankStaticNotSupported.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.13;\n\nimport \"./IStakingBank.sol\";\n\nabstract contract StakingBankStaticNotSupported is IStakingBank {\n error NotSupported();\n\n function create(address, string calldata) external pure {\n revert NotSupported();\n }\n\n function update(address, string calldata) external pure {\n revert NotSupported();\n }\n\n function remove(address) external pure {\n revert NotSupported();\n }\n\n function transfer(address, uint256) external pure returns (bool) {\n revert NotSupported();\n }\n\n function transferFrom(address, address, uint256) external pure returns (bool) {\n revert NotSupported();\n }\n\n function receiveApproval(address) external pure returns (bool) {\n revert NotSupported();\n }\n\n function allowance(address, address) external pure returns (uint256) {\n revert NotSupported();\n }\n\n function approve(address, uint256) external pure returns (bool) {\n revert NotSupported();\n }\n\n function stake(uint256) external pure {\n revert NotSupported();\n }\n\n function withdraw(uint256) external pure returns (bool) {\n revert NotSupported();\n }\n\n function exit() external pure returns (bool) {\n revert NotSupported();\n }\n\n function setMinAmountForStake(uint256) external pure {\n revert NotSupported();\n }\n}\n"},"contracts/stakingBankStatic/StakingBankStatic.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.13;\n\nimport \"../interfaces/StakingBankStaticNotSupported.sol\";\n\n/// @dev Because we are using PoA in UMB oracle, staked balance does not matter. What's matter is, if signer is\n/// validator or not. In this case we can optimise `StakingBank` and make it static for better gas performance.\nabstract contract StakingBankStatic is StakingBankStaticNotSupported {\n uint256 public constant ONE = 1e18;\n\n uint256 public immutable NUMBER_OF_VALIDATORS; // solhint-disable-line var-name-mixedcase\n uint256 public immutable TOTAL_SUPPLY; // solhint-disable-line var-name-mixedcase\n\n constructor(uint256 _validatorsCount) {\n NUMBER_OF_VALIDATORS = _validatorsCount;\n TOTAL_SUPPLY = _validatorsCount * ONE;\n\n _assertValidSetup(_validatorsCount);\n }\n\n function balances(address _validator) external view returns (uint256) {\n return _isValidator(_validator) ? ONE : 0;\n }\n\n function verifyValidators(address[] calldata _validators) external view returns (bool) {\n for (uint256 i; i < _validators.length;) {\n if (!_isValidator(_validators[i])) return false;\n unchecked { i++; }\n }\n\n return true;\n }\n\n function getNumberOfValidators() external view returns (uint256) {\n return NUMBER_OF_VALIDATORS;\n }\n\n function getAddresses() external view returns (address[] memory) {\n return _addresses();\n }\n\n function getBalances() external view returns (uint256[] memory allBalances) {\n allBalances = new uint256[](NUMBER_OF_VALIDATORS);\n\n for (uint256 i; i < NUMBER_OF_VALIDATORS;) {\n allBalances[i] = ONE;\n\n unchecked {\n // we will not have enough data to overflow\n i++;\n }\n }\n }\n\n function addresses(uint256 _ix) external view returns (address) {\n return _addresses()[_ix];\n }\n\n function validators(address _id) external view virtual returns (address id, string memory location);\n\n /// @dev to follow ERC20 interface\n function balanceOf(address _account) external view returns (uint256) {\n return _isValidator(_account) ? ONE : 0;\n }\n\n /// @dev to follow ERC20 interface\n function totalSupply() external view returns (uint256) {\n return TOTAL_SUPPLY;\n }\n\n /// @dev to follow Registrable interface\n function getName() external pure returns (bytes32) {\n return \"StakingBank\";\n }\n\n /// @dev to follow Registrable interface\n function register() external pure {\n // there are no requirements atm\n }\n\n /// @dev to follow Registrable interface\n function unregister() external pure {\n // there are no requirements atm\n }\n\n function _addresses() internal view virtual returns (address[] memory);\n\n function _isValidator(address _validator) internal view virtual returns (bool);\n\n function _assertValidSetup(uint256 _validatorsCount) internal view virtual{\n address[] memory list = _addresses();\n require(list.length == _validatorsCount);\n\n for (uint256 i; i < _validatorsCount;) {\n require(_isValidator(list[i]));\n\n unchecked { i ++; }\n }\n }\n}\n"},"contracts/stakingBankStatic/StakingBankStaticProd.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.13;\n\nimport \"./StakingBankStatic.sol\";\n\ncontract StakingBankStaticProd is StakingBankStatic {\n address public constant VALIDATOR_0 = 0x977Ba523420110e230643B772Fe9cF955e11dA7B;\n address public constant VALIDATOR_1 = 0xe2422b23e52bc13ebA04d7FbB9F332Deb43360fB;\n\n // external order is based on validators submits on AVAX for Apr 2023\n address public constant VALIDATOR_2 = 0x57F404aD75e371c1A539589C1eFCA12e0C6980AD;\n address public constant VALIDATOR_3 = 0xD56C6A4f64E0bD70260472d1DB6Cf5825858CB0d;\n address public constant VALIDATOR_4 = 0x93FdcAB283b0BcAc48157590af482E1CFd6af6aC;\n address public constant VALIDATOR_5 = 0xCd733E06B06083d52fC5867E8E3432aA5c103A38;\n address public constant VALIDATOR_6 = 0x42e210b110c6aa49CdfA7ceF1444Aa4719653111;\n address public constant VALIDATOR_7 = 0x501731c6a69803a53Ec6c3e12f293c247cE1092B;\n address public constant VALIDATOR_8 = 0x8bF9661F1b247522C75DD0FE84355aD2EfF27144;\n address public constant VALIDATOR_9 = 0x281754Ab58391A478B7aA4E7f39991CfB41118c4;\n address public constant VALIDATOR_10 = 0x57A51D5BDcE188c2295fCA3b4687475a54E65A02;\n address public constant VALIDATOR_11 = 0x2F85824B2B38F179E451988670935d315b5b9692;\n address public constant VALIDATOR_12 = 0xA7241994267682de4dE7Ef62f52dc2C783d1784B;\n address public constant VALIDATOR_13 = 0x6eEd457C20603EDAE50C3A112CAA1a9425321bD0;\n address public constant VALIDATOR_14 = 0xC5a7650c2725a7B6A39f15cb9FbffC7af357AFeb;\n\n constructor(uint256 _validatorsCount) StakingBankStatic(_validatorsCount) {}\n\n // solhint-disable-next-line code-complexity\n function validators(address _id) external pure override returns (address id, string memory location) {\n if (_id == VALIDATOR_0) return (_id, \"https://validator.umb.network\");\n if (_id == VALIDATOR_1) return (_id, \"https://validator2.umb.network\");\n if (_id == VALIDATOR_2) return (_id, \"https://umbrella.artemahr.tech\");\n if (_id == VALIDATOR_3) return (_id, \"https://umb.vtabsolutions.com:3030\");\n if (_id == VALIDATOR_4) return (_id, \"https://umbrella.crazywhale.es\");\n if (_id == VALIDATOR_5) return (_id, \"https://umbrella-node.gateomega.com\");\n if (_id == VALIDATOR_6) return (_id, \"https://umb.anorak.technology\");\n if (_id == VALIDATOR_7) return (_id, \"https://umbrella.validator.infstones.io\");\n if (_id == VALIDATOR_8) return (_id, \"https://umb.hashkey.cloud\");\n if (_id == VALIDATOR_9) return (_id, \"http://umbrella.staking4all.org:3000\");\n if (_id == VALIDATOR_10) return (_id, \"http://5.161.78.230:3000\");\n if (_id == VALIDATOR_11) return (_id, \"https://umb-api.staking.rocks\");\n if (_id == VALIDATOR_12) return (_id, \"https://rpc.urbanhq.net\");\n if (_id == VALIDATOR_13) return (_id, \"https://umbrella-node.ankastake.com\");\n if (_id == VALIDATOR_14) return (_id, \"https://umbrella.tchambrella.com\");\n\n return (address(0), \"\");\n }\n\n function _addresses() internal view override returns (address[] memory) {\n address[] memory list = new address[](NUMBER_OF_VALIDATORS);\n\n list[0] = VALIDATOR_0;\n list[1] = VALIDATOR_1;\n list[2] = VALIDATOR_2;\n list[3] = VALIDATOR_3;\n list[4] = VALIDATOR_4;\n list[5] = VALIDATOR_5;\n list[6] = VALIDATOR_6;\n list[7] = VALIDATOR_7;\n list[8] = VALIDATOR_8;\n list[9] = VALIDATOR_9;\n list[10] = VALIDATOR_10;\n list[11] = VALIDATOR_11;\n list[12] = VALIDATOR_12;\n list[13] = VALIDATOR_13;\n list[14] = VALIDATOR_14;\n\n return list;\n }\n\n function _isValidator(address _validator) internal pure override returns (bool) {\n return (\n _validator == VALIDATOR_0\n || _validator == VALIDATOR_1\n || _validator == VALIDATOR_2\n || _validator == VALIDATOR_3\n || _validator == VALIDATOR_4\n || _validator == VALIDATOR_5\n || _validator == VALIDATOR_6\n || _validator == VALIDATOR_7\n || _validator == VALIDATOR_8\n || _validator == VALIDATOR_9\n || _validator == VALIDATOR_10\n || _validator == VALIDATOR_11\n || _validator == VALIDATOR_12\n || _validator == VALIDATOR_13\n || _validator == VALIDATOR_14\n );\n }\n}\n"}},"settings":{"optimizer":{"enabled":false,"runs":0},"outputSelection":{"contracts/stakingBankStatic/StakingBankStaticProd.sol":{"StakingBankStaticProd":["*"]},"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"metadata":{"useLiteralContent":true},"libraries":{}}}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "phoenix",
"version": "4.14.0",
"version": "4.15.0",
"description": "A proof-of-stake contract for minting sidechain blocks.",
"engines": {
"node": "^14.17.0 || >=16.0.0"
Expand Down
8 changes: 5 additions & 3 deletions tasks/_helpers/registerChain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { CHAIN, FOREIGN_CHAIN, REGISTRY } from '../../constants';
import { BaseChain, Registry__factory } from '../../typechain';
import { resolveChainName } from './resolveChainName';
import { Contract, ethers } from 'ethers';
import { isMasterChain } from '../../constants/networks';
import { BNB_PRODUCTION, isMasterChain } from '../../constants/networks';
import { ChainStatus } from '../../test/types/ChainStatus';
import { confirmations } from './confirmations';

Expand Down Expand Up @@ -120,11 +120,13 @@ export const registerChain = async (hre: HardhatRuntimeEnvironment) => {
throw e;
}

if ((e as Error).message.includes('transaction underpriced')) {
const hasAtomicUpdate = ![BNB_PRODUCTION].includes(hre.network.name);

if (hasAtomicUpdate && (e as Error).message.includes('transaction underpriced')) {
throw e;
}

if ((e as Error).message.includes('cannot estimate gas')) {
if (hasAtomicUpdate && (e as Error).message.includes('cannot estimate gas')) {
throw e;
}

Expand Down
15 changes: 14 additions & 1 deletion tasks/lineaVerifyCode.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import { task } from 'hardhat/config';
import fs from 'fs';
import axios from 'axios';
import { AVALANCHE_SANDBOX, AVALANCHE_STAGING, LINEA_SANDBOX, POLYGON_SANDBOX } from '../constants/networks';
import {
AVALANCHE_PRODUCTION,
AVALANCHE_SANDBOX,
AVALANCHE_STAGING,
LINEA_SANDBOX,
POLYGON_SANDBOX,
} from '../constants/networks';

task('linea-verify', 'task for debugging')
.addOptionalParam('name')
Expand All @@ -24,6 +30,13 @@ task('linea-verify', 'task for debugging')
);
break;

case AVALANCHE_PRODUCTION:
response = await axios.get(
'https://api.snowtrace.io/api?' +
`module=contract&action=getsourcecode&address=${address}&apikey=${AVASCAN_API}`,
);
break;

case LINEA_SANDBOX:
response = await axios.get(
'https://api-testnet.lineascan.build/api?' +
Expand Down
18 changes: 4 additions & 14 deletions tasks/registerUmbrellaFeeds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,31 +45,21 @@ task('registerUmbrellaFeeds', 'UmbrellaFeeds registration')
const nonce = await deployer.getTransactionCount('latest');
console.log({ nonce, from: deployer.address });

if (oldExists) {
const oldUmbrellaFeeds = UmbrellaFeeds__factory.connect(inRegistry, deployer);

const price = await oldUmbrellaFeeds.getPriceDataByName(taskArgs.destroy);

if (oldExists && price.timestamp == 0) {
if (taskArgs.destroy != 'any') throw new Error(`provided key ${taskArgs.destroy} is empty in ${inRegistry}`);
} else {
console.log(`key ${taskArgs.destroy} exists so old contract ${inRegistry} will be destroyed`);
}
}

const tx = await registry.importContracts([newUmbrellaFeeds.address], {
nonce,
gasPrice: hre.network.config.gasPrice == 'auto' ? undefined : hre.network.config.gasPrice,
});

console.log(`importContracts tx #${tx.nonce} ${tx.hash}`);
await tx.wait(1);

if (oldExists) {
if (oldExists && taskArgs.destroy != undefined) {
console.log(`old contract ${inRegistry} will be destroyed`);
const oldUmbrellaFeeds = UmbrellaFeeds__factory.connect(inRegistry, deployer);

const tx2 = await oldUmbrellaFeeds.destroy(taskArgs.destroy, {
nonce: nonce + 1,
gasPrice: hre.network.config.gasPrice == 'auto' ? undefined : hre.network.config.gasPrice,
gasLPrice: hre.network.config.gasPrice == 'auto' ? undefined : hre.network.config.gasPrice,
});

console.log(`destroy tx #${tx2.nonce} ${tx2.hash}`);
Expand Down

0 comments on commit 7df74ed

Please sign in to comment.