dsa-connectors/contracts/mainnet/mapping/curve_gauge_mapping.sol

110 lines
3.1 KiB
Solidity
Raw Normal View History

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
interface ConnectorsInterface {
function chief(address) external view returns (bool);
}
interface IndexInterface {
function master() external view returns (address);
}
contract BytesHelper {
/**
* @dev Convert String to bytes32.
*/
function stringToBytes32(string memory str) internal pure returns (bytes32 result) {
require(bytes(str).length != 0, "String-Empty");
// solium-disable-next-line security/no-inline-assembly
assembly {
result := mload(add(str, 32))
}
}
}
contract Helpers is BytesHelper {
address public constant connectors = 0xD6A602C01a023B98Ecfb29Df02FBA380d3B21E0c;
address public constant instaIndex = 0x2971AdFa57b20E5a416aE5a708A8655A9c74f723;
uint public version = 1;
mapping (bytes32 => GaugeData) public gaugeMapping;
struct GaugeData {
address gaugeAddress;
bool rewardToken;
}
event LogAddGaugeMapping(
string gaugeName,
address gaugeAddress,
bool rewardToken
);
event LogRemoveGaugeMapping(
string gaugeName,
address gaugeAddress
);
modifier isChief virtual {
require(
ConnectorsInterface(connectors).chief(msg.sender) ||
IndexInterface(instaIndex).master() == msg.sender, "not-Chief");
_;
}
function _addGaugeMapping(
string memory gaugeName,
address gaugeAddress,
bool rewardToken
) internal {
require(gaugeAddress != address(0), "gaugeAddress-not-vaild");
require(bytes(gaugeName).length <= 32, "Length-exceeds");
bytes32 gaugeType = stringToBytes32(gaugeName);
require(gaugeMapping[gaugeType].gaugeAddress == address(0), "gaugePool-already-added");
gaugeMapping[gaugeType].gaugeAddress = gaugeAddress;
gaugeMapping[gaugeType].rewardToken = rewardToken;
emit LogAddGaugeMapping(gaugeName, gaugeAddress, rewardToken);
}
function addGaugeMappings(
string[] memory gaugeNames,
address[] memory gaugeAddresses,
bool[] memory rewardTokens
) public isChief {
require(gaugeNames.length == gaugeAddresses.length && gaugeAddresses.length == rewardTokens.length, "length-not-match");
for (uint32 i; i < gaugeNames.length; i++) {
_addGaugeMapping(gaugeNames[i], gaugeAddresses[i], rewardTokens[i]);
}
}
function removeGaugeMapping(string memory gaugeName, address gaugeAddress) public isChief {
require(gaugeAddress != address(0), "gaugeAddress-not-vaild");
bytes32 gaugeType = stringToBytes32(gaugeName);
require(gaugeMapping[gaugeType].gaugeAddress == gaugeAddress, "different-gauge-pool");
delete gaugeMapping[gaugeType];
emit LogRemoveGaugeMapping(
gaugeName,
gaugeAddress
);
}
}
contract CurveGaugeMapping is Helpers {
string constant public name = "Curve-Gauge-Mapping-v1";
constructor (
string[] memory gaugeNames,
address[] memory gaugeAddresses,
bool[] memory rewardTokens
) public {
require(gaugeNames.length == gaugeAddresses.length && gaugeAddresses.length == rewardTokens.length, "length-not-match");
for (uint32 i; i < gaugeNames.length; i++) {
_addGaugeMapping(gaugeNames[i], gaugeAddresses[i], rewardTokens[i]);
}
}
}