Source Code
Overview
BTT Balance
More Info
ContractCreator
Multichain Info
N/A
Latest 7 from a total of 7 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Delisting | 63739583 | 69 days ago | IN | 0 BTT | 357.12 | ||||
| Listing | 63739555 | 69 days ago | IN | 0 BTT | 1,209.255 | ||||
| Delisting | 63739456 | 69 days ago | IN | 0 BTT | 357.12 | ||||
| Listing | 63739427 | 69 days ago | IN | 0 BTT | 1,209.255 | ||||
| Activate | 63623250 | 72 days ago | IN | 0 BTT | 2,486.715 | ||||
| Grant Tunnel Act... | 63623244 | 72 days ago | IN | 0 BTT | 364.92 | ||||
| Listing | 63623220 | 72 days ago | IN | 0 BTT | 10,680.54 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | Amount | ||
|---|---|---|---|---|---|---|
| 66645497 | 44 mins ago | 0 BTT | ||||
| 66644192 | 1 hr ago | 0 BTT | ||||
| 66643751 | 1 hr ago | 0 BTT | ||||
| 66643173 | 2 hrs ago | 0 BTT | ||||
| 66642005 | 2 hrs ago | 0 BTT | ||||
| 66640880 | 3 hrs ago | 0 BTT | ||||
| 66640259 | 3 hrs ago | 0 BTT | ||||
| 66639471 | 4 hrs ago | 0 BTT | ||||
| 66639182 | 4 hrs ago | 0 BTT | ||||
| 66638746 | 4 hrs ago | 0 BTT | ||||
| 66638515 | 4 hrs ago | 0 BTT | ||||
| 66637703 | 5 hrs ago | 0 BTT | ||||
| 66637248 | 5 hrs ago | 0 BTT | ||||
| 66636769 | 5 hrs ago | 0 BTT | ||||
| 66635843 | 6 hrs ago | 0 BTT | ||||
| 66635023 | 6 hrs ago | 0 BTT | ||||
| 66634240 | 7 hrs ago | 0 BTT | ||||
| 66633279 | 7 hrs ago | 0 BTT | ||||
| 66631533 | 8 hrs ago | 0 BTT | ||||
| 66630982 | 9 hrs ago | 0 BTT | ||||
| 66630784 | 9 hrs ago | 0 BTT | ||||
| 66629787 | 9 hrs ago | 0 BTT | ||||
| 66629221 | 10 hrs ago | 0 BTT | ||||
| 66628041 | 10 hrs ago | 0 BTT | ||||
| 66627812 | 10 hrs ago | 0 BTT |
Loading...
Loading
Contract Name:
PacketConsumerTick
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import "./PacketConsumerBase.sol";
import "./interfaces/IPacketConsumer.sol";
import "./libraries/PacketDecoder.sol";
contract PacketConsumerTick is PacketConsumerBase {
mapping(uint256 => uint256) public refs;
mapping(bytes32 => uint256) public symbolsToIDs;
mapping(uint256 => bytes32) public idsToSymbols;
uint256 public constant MID_TICK = 262144;
uint256 public totalSymbolsCount = 0;
constructor(address tunnelRouter_) PacketConsumerBase(tunnelRouter_) {}
/**
* @dev Converts a right-aligned bytes32 value back to string
*/
function rightAlignedBytes32ToString(bytes32 b) public pure returns (string memory) {
// Find the index of the first non-zero byte (strip leading zero padding)
uint8 start = 0;
while (start < 32 && b[start] == 0) {
start++;
}
// If all bytes are zero, return empty string
if (start == 32) {
return "";
}
uint8 len = 32 - start;
bytes memory out = new bytes(len);
for (uint8 i = 0; i < len; i++) {
out[i] = b[start + i];
}
return string(out);
}
/**
* @dev See {IPacketConsumer-getPrice}.
*/
function getPrice(string calldata _signalId) external view returns (Price memory) {
(uint256 tick, uint256 timestamp) = getTickAndTime(stringToRightAlignedBytes32(_signalId));
uint256 rate = _getPriceFromTick(tick);
Price memory price = Price({
price: uint64(rate),
timestamp: int64(uint64(timestamp))
});
if (price.price == 0) {
revert SignalIdNotAvailable(_signalId);
}
return price;
}
/**
* @dev See {IPacketConsumer-getPriceBatch}.
*/
function getPriceBatch(string[] calldata _signalIds) external view returns (Price[] memory) {
Price[] memory priceList = new Price[](_signalIds.length);
for (uint i = 0; i < _signalIds.length; i++) {
(uint256 tick, uint256 timestamp) = getTickAndTime(stringToRightAlignedBytes32(_signalIds[i]));
uint256 rate = _getPriceFromTick(tick);
Price memory price = Price({
price: uint64(rate),
timestamp: int64(uint64(timestamp))
});
if (price.price == 0) {
revert SignalIdNotAvailable(_signalIds[i]);
}
priceList[i] = price;
}
return priceList;
}
/**
* @dev See {IPacketConsumer-process}.
*/
function process(
PacketDecoder.TssMessage memory data
) external onlyTunnelRouter {
unchecked {
PacketDecoder.Packet memory packet = data.packet;
if (packet.timestamp < int64((1 << 18) - 1)) revert InvalidPacketTimestamp();
if (data.encoderType != PacketDecoder.EncoderType.Tick) revert InvalidEncoderType();
uint256 time = uint256(int256(packet.timestamp));
uint256 id;
uint256 sid = type(uint256).max;
uint256 nextSID;
uint256 sTime;
uint256 sVal;
uint256 shiftLen;
uint256 newTimeSlot = time - (1 << 18) + 1;
uint256 idMinusOne;
uint256 signalsLength = packet.signals.length;
for (uint256 i = 0; i < signalsLength; ++i) {
id = symbolsToIDs[packet.signals[i].signal];
if (id == 0) revert SignalIdNotAvailable(rightAlignedBytes32ToString(packet.signals[i].signal));
idMinusOne = id - 1;
nextSID = idMinusOne / 6;
if (sid != nextSID) {
if (sVal != 0) refs[sid] = sVal;
sVal = refs[nextSID];
sid = nextSID;
sTime = _extractSlotTime(sVal);
if (newTimeSlot > sTime) {
sTime = newTimeSlot;
sVal = _rebaseTime(sVal, sTime);
}
}
shiftLen = 204 - (37 * (idMinusOne % 6));
sVal = (sTime + _extractTimeOffset(sVal, shiftLen) < time)
? _setTicksAndTimeOffset(sVal, time - sTime, packet.signals[i].price, shiftLen - 19)
: sVal;
}
if (sVal != 0) refs[sid] = sVal;
}
}
function _extractSlotTime(uint256 val) private pure returns (uint256 t) {
unchecked {
t = (val >> 225) & ((1 << 31) - 1);
}
}
function _extractSize(uint256 val) private pure returns (uint256 s) {
unchecked {
s = (val >> 222) & ((1 << 3) - 1);
}
}
function _extractTick(uint256 val, uint256 shiftLen) private pure returns (uint256 tick) {
unchecked {
tick = (val >> shiftLen) & ((1 << 19) - 1);
}
}
function _extractTimeOffset(uint256 val, uint256 shiftLen) private pure returns (uint256 offset) {
unchecked {
offset = (val >> shiftLen) & ((1 << 18) - 1);
}
}
function _setTime(uint256 val, uint256 time) private pure returns (uint256 newVal) {
unchecked {
newVal = (val & (type(uint256).max >> 31)) | (time << 225);
}
}
function _setSize(uint256 val, uint256 size) private pure returns (uint256 newVal) {
unchecked {
newVal = (val & ((type(uint256).max << (37 * (6 - size))) - ((((1 << 3) - 1)) << 222))) | (size << 222);
}
}
function _setTimeOffset(uint256 val, uint256 timeOffset, uint256 shiftLen) private pure returns (uint256 newVal) {
unchecked {
newVal = ((val & ~(uint256((1 << 18) - 1) << (shiftLen + 19))) | (timeOffset << (shiftLen + 19)));
}
}
function _setTicksAndTimeOffset(uint256 val, uint256 timeOffset, uint256 tick, uint256 shiftLen)
private
pure
returns (uint256 newVal)
{
unchecked {
newVal = (val & (~(uint256((1 << 37) - 1) << shiftLen)))
| (((timeOffset << 19) | (tick & ((1 << 19) - 1))) << shiftLen);
}
}
function _rebaseTime(uint256 val, uint256 time) private pure returns (uint256 newVal) {
unchecked {
uint256 sTime = _extractSlotTime(val);
uint256 sSize = _extractSize(val);
uint256 shiftLen;
for (uint256 i = 0; i < sSize; i++) {
shiftLen = 204 - (37 * i);
uint256 timeOffset = _extractTimeOffset(val, shiftLen);
val = (sTime + timeOffset < time)
? _setTicksAndTimeOffset(val, 0, 0, shiftLen - 19)
: _setTimeOffset(val, sTime + timeOffset - time, shiftLen - 19);
}
newVal = _setTime(val, time);
}
}
function _getTickAndTime(uint256 slot, uint8 idx) private view returns (uint256 tick, uint256 lastUpdated) {
unchecked {
uint256 sVal = refs[slot];
uint256 idx_x_37 = idx * 37;
return
(_extractTick(sVal, 185 - idx_x_37), _extractTimeOffset(sVal, 204 - idx_x_37) + _extractSlotTime(sVal));
}
}
function getSlotAndIndex(bytes32 symbol) public view returns (uint256 slot, uint8 idx) {
unchecked {
uint256 id = symbolsToIDs[symbol];
if (id == 0) revert SignalIdNotAvailable(rightAlignedBytes32ToString(symbol));
return ((id - 1) / 6, uint8((id - 1) % 6));
}
}
function getTickAndTime(bytes32 symbol) public view returns (uint256 tick, uint256 lastUpdated) {
unchecked {
(uint256 slot, uint8 idx) = getSlotAndIndex(symbol);
(tick, lastUpdated) = _getTickAndTime(slot, idx);
}
}
function _getPriceFromTick(uint256 x) private pure returns (uint256 y) {
unchecked {
if (x == 0) return 0;
y = 649037107316853453566312041152512;
if (x < MID_TICK) {
x = MID_TICK - x;
if (x & 0x01 != 0) y = (y * 649102011027585138911668672356627) >> 109;
if (x & 0x02 != 0) y = (y * 649166921228687897425559839223862) >> 109;
if (x & 0x04 != 0) y = (y * 649296761104602847291923925447306) >> 109;
if (x & 0x08 != 0) y = (y * 649556518769447606681106054382372) >> 109;
if (x & 0x10 != 0) y = (y * 650076345896668132522271100656030) >> 109;
if (x & 0x20 != 0) y = (y * 651117248505878973533694452870408) >> 109;
if (x & 0x40 != 0) y = (y * 653204056474534657407624669811404) >> 109;
if (x & 0x80 != 0) y = (y * 657397758286396885483233885325217) >> 109;
if (x & 0x0100 != 0) y = (y * 665866108005128170549362417755489) >> 109;
if (x & 0x0200 != 0) y = (y * 683131470899774684431604377857106) >> 109;
if (x & 0x0400 != 0) y = (y * 719016834742958293196733842540130) >> 109;
if (x & 0x0800 != 0) y = (y * 796541835305874991615834691778664) >> 109;
if (x & 0x1000 != 0) y = (y * 977569522974447437629335387266319) >> 109;
if (x & 0x2000 != 0) y = (y * 1472399900522103311842374358851872) >> 109;
if (x & 0x4000 != 0) y = (y * 3340273526146976564083509455290620) >> 109;
if (x & 0x8000 != 0) y = (y * 17190738562859105750521122099339319) >> 109;
if (x & 0x010000 != 0) y = (y * 455322953040804340936374685561109626) >> 109;
if (x & 0x020000 != 0) y = (y * 319425483117388922324853186559947171877) >> 109;
y = 649037107316853453566312041152512000000000 / y;
} else {
x = x - MID_TICK;
if (x & 0x01 != 0) y = (y * 649102011027585138911668672356627) >> 109;
if (x & 0x02 != 0) y = (y * 649166921228687897425559839223862) >> 109;
if (x & 0x04 != 0) y = (y * 649296761104602847291923925447306) >> 109;
if (x & 0x08 != 0) y = (y * 649556518769447606681106054382372) >> 109;
if (x & 0x10 != 0) y = (y * 650076345896668132522271100656030) >> 109;
if (x & 0x20 != 0) y = (y * 651117248505878973533694452870408) >> 109;
if (x & 0x40 != 0) y = (y * 653204056474534657407624669811404) >> 109;
if (x & 0x80 != 0) y = (y * 657397758286396885483233885325217) >> 109;
if (x & 0x0100 != 0) y = (y * 665866108005128170549362417755489) >> 109;
if (x & 0x0200 != 0) y = (y * 683131470899774684431604377857106) >> 109;
if (x & 0x0400 != 0) y = (y * 719016834742958293196733842540130) >> 109;
if (x & 0x0800 != 0) y = (y * 796541835305874991615834691778664) >> 109;
if (x & 0x1000 != 0) y = (y * 977569522974447437629335387266319) >> 109;
if (x & 0x2000 != 0) y = (y * 1472399900522103311842374358851872) >> 109;
if (x & 0x4000 != 0) y = (y * 3340273526146976564083509455290620) >> 109;
if (x & 0x8000 != 0) y = (y * 17190738562859105750521122099339319) >> 109;
if (x & 0x010000 != 0) y = (y * 455322953040804340936374685561109626) >> 109;
if (x & 0x020000 != 0) y = (y * 319425483117388922324853186559947171877) >> 109;
y = (y * 1e9) / 649037107316853453566312041152512;
}
}
}
function getPriceFromTick(uint256 x) public pure returns (uint256 y) {
y = _getPriceFromTick(x);
}
function listing(string[] calldata symbols) public onlyRole(DEFAULT_ADMIN_ROLE) {
if (symbols.length == 0) return;
uint256 _totalSymbolsCount = totalSymbolsCount;
uint256 sid = _totalSymbolsCount / 6;
uint256 sVal = refs[sid];
uint256 sSize = _extractSize(sVal);
for (uint256 i = 0; i < symbols.length; i++) {
bytes32 symbolBytes32 = stringToRightAlignedBytes32(symbols[i]);
require(symbolsToIDs[symbolBytes32] == 0, "listing: FAIL_SYMBOL_IS_ALREADY_SET");
uint256 slotID = _totalSymbolsCount / 6;
_totalSymbolsCount++;
symbolsToIDs[symbolBytes32] = _totalSymbolsCount;
idsToSymbols[_totalSymbolsCount] = symbolBytes32;
if (sid != slotID) {
refs[sid] = sVal;
sid = slotID;
sVal = refs[sid];
sSize = _extractSize(sVal);
}
sSize++;
sVal = _setSize(sVal, sSize);
}
refs[sid] = sVal;
totalSymbolsCount = _totalSymbolsCount;
}
function delisting(string[] calldata symbols) public onlyRole(DEFAULT_ADMIN_ROLE) {
uint256 _totalSymbolsCount = totalSymbolsCount;
uint256 slotID1;
uint256 slotID2;
uint256 sVal1;
uint256 sVal2;
uint256 sSize;
uint256 shiftLen;
uint256 lastSegment;
uint256 time;
bytes32 lastSymbol;
for (uint256 i = 0; i < symbols.length; i++) {
bytes32 symbolBytes32 = stringToRightAlignedBytes32(symbols[i]);
uint256 id = symbolsToIDs[symbolBytes32];
require(id != 0, "delisting: FAIL_SYMBOL_NOT_AVAILABLE");
lastSymbol = idsToSymbols[_totalSymbolsCount];
symbolsToIDs[lastSymbol] = id;
idsToSymbols[id] = lastSymbol;
slotID1 = (_totalSymbolsCount - 1) / 6;
slotID2 = (id - 1) / 6;
sVal1 = refs[slotID1];
sSize = _extractSize(sVal1);
lastSegment = (sVal1 >> (37 * (6 - sSize))) & ((1 << 37) - 1);
shiftLen = 37 * (5 - ((id - 1) % 6));
if (slotID1 == slotID2) {
sVal1 = (sVal1 & (type(uint256).max - (((1 << 37) - 1) << shiftLen))) | (lastSegment << shiftLen);
} else {
sVal2 = refs[slotID2];
time = _extractSlotTime(sVal1) + (lastSegment >> 19);
require(time >= _extractSlotTime(sVal2), "delisting: FAIL_LAST_TIMESTAMP_IS_LESS_THAN_TARGET_TIMESTAMP");
time -= _extractSlotTime(sVal2);
require(time < 1 << 18, "delisting: FAIL_DELTA_TIME_EXCEED_3_DAYS");
lastSegment = (time << 19) | (lastSegment & ((1 << 19) - 1));
refs[slotID2] =
(sVal2 & (type(uint256).max - (((1 << 37) - 1) << shiftLen))) | (lastSegment << shiftLen);
}
refs[slotID1] = _setSize(sVal1, sSize - 1);
delete symbolsToIDs[symbolBytes32];
delete idsToSymbols[_totalSymbolsCount];
_totalSymbolsCount--;
}
totalSymbolsCount = _totalSymbolsCount;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "./interfaces/IPacketConsumer.sol";
import "./interfaces/ITunnelRouter.sol";
import "./interfaces/IVault.sol";
abstract contract PacketConsumerBase is IPacketConsumer, AccessControl {
// The tunnel router contract.
address public immutable tunnelRouter;
// Role identifier for accounts allowed to activate/deactivate tunnel.
bytes32 public constant TUNNEL_ACTIVATOR_ROLE = keccak256("TUNNEL_ACTIVATOR_ROLE");
modifier onlyTunnelRouter() {
if (msg.sender != tunnelRouter) {
revert UnauthorizedTunnelRouter();
}
_;
}
constructor(
address tunnelRouter_
) {
tunnelRouter = tunnelRouter_;
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(TUNNEL_ACTIVATOR_ROLE, msg.sender);
}
/**
* @dev Converts a string to a right-aligned bytes32 value
*/
function stringToRightAlignedBytes32(
string memory _s
) public pure returns (bytes32 s) {
if (bytes(_s).length > 32) {
revert StringInputExceedsBytes32(_s);
}
assembly {
s := mload(add(_s, 32))
}
s >>= (32 - bytes(_s).length) * 8;
}
/**
* @dev See {IPacketConsumer-activate}.
*/
function activate(
uint64 tunnelId,
uint64 latestSeq
) external payable onlyRole(TUNNEL_ACTIVATOR_ROLE) {
ITunnelRouter(tunnelRouter).activate{value: msg.value}(
tunnelId,
latestSeq
);
}
/**
* @dev See {IPacketConsumer-deactivate}.
*/
function deactivate(uint64 tunnelId) external onlyRole(TUNNEL_ACTIVATOR_ROLE) {
ITunnelRouter(tunnelRouter).deactivate(tunnelId);
}
/**
* @dev See {IPacketConsumer-deposit}.
*/
function deposit(uint64 tunnelId) external payable {
IVault vault = ITunnelRouter(tunnelRouter).vault();
vault.deposit{value: msg.value}(tunnelId, address(this));
}
/**
* @dev See {IPacketConsumer-withdraw}.
*/
function withdraw(uint64 tunnelId, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) {
IVault vault = ITunnelRouter(tunnelRouter).vault();
vault.withdraw(tunnelId, msg.sender, amount);
}
/**
* @dev See {IPacketConsumer-withdrawAll}.
*/
function withdrawAll(uint64 tunnelId) external onlyRole(DEFAULT_ADMIN_ROLE) {
IVault vault = ITunnelRouter(tunnelRouter).vault();
vault.withdrawAll(tunnelId, msg.sender);
}
/// @dev Grants `TUNNEL_ACTIVATOR_ROLE` to `accounts`
function grantTunnelActivatorRole(address[] calldata accounts) external onlyRole(DEFAULT_ADMIN_ROLE) {
for (uint256 i = 0; i < accounts.length; i++) {
_grantRole(TUNNEL_ACTIVATOR_ROLE, accounts[i]);
}
}
/// @dev Revokes `TUNNEL_ACTIVATOR_ROLE` from `accounts`
function revokeTunnelActivatorRole(address[] calldata accounts) external onlyRole(DEFAULT_ADMIN_ROLE) {
for (uint256 i = 0; i < accounts.length; i++) {
_revokeRole(TUNNEL_ACTIVATOR_ROLE, accounts[i]);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import "../libraries/PacketDecoder.sol";
interface IPacketConsumer {
// ========================================
// Structs
// ========================================
// An object that contains the price of a signal ID.
struct Price {
uint64 price;
int64 timestamp;
}
// ========================================
// Custom Errors
// ========================================
/**
* @notice Reverts if the caller is not the tunnelRouter contract.
*/
error UnauthorizedTunnelRouter();
// Custom error for string length exceeding 32 bytes
error StringInputExceedsBytes32(string input);
// Custom error for signal Id input that is not available.
error SignalIdNotAvailable(string signalId);
/// Custom error for invalid encoder type.
error InvalidEncoderType();
/// Custom error for invalid packet.
error InvalidPacketTimestamp();
// ========================================
// Functions
// ========================================
/**
* @dev Processes the relayed message.
*
* The relayed message must be evaluated from the tunnelRouter contract and
* verified by the tssVerifier contract before forwarding to the target contract.
*
* @param data The decoded tss message that is relayed from the tunnelRouter contract.
*/
function process(PacketDecoder.TssMessage memory data) external;
/**
* @dev Activates the tunnel and set the sequence on tunnelRouter contract.
*
* This function deposits tokens into the vault and sets the latest sequence on the
* tunnelRouter contract if the current deposit in the vault contract exceeds a threshold.
* The transaction is reverted if the threshold is not met.
*
* This function should be called by the contract activator.
*
* @param tunnelId The tunnel ID that the sender contract is activating.
* @param latestSeq The new sequence of the tunnel.
*/
function activate(uint64 tunnelId, uint64 latestSeq) external payable;
/**
* @dev Deactivates the tunnel on tunnelRouter contract.
*
* This function should be called by the contract activator.
*
* @param tunnelId The tunnel ID that the sender contract is deactivating.
*/
function deactivate(uint64 tunnelId) external;
/**
* @dev Deposits the native tokens into the vault on behalf of the contract address and tunnelId.
* The amount of tokens to be deposited is provided as msg.value in the transaction.
*
* The contract calls the vault to deposit the tokens.
*
* @param tunnelId The tunnel ID that the sender contract is depositing.
*/
function deposit(uint64 tunnelId) external payable;
/**
* @dev Withdraws the native tokens from the vault contract with specific amount.
*
* This function should be called by the contract admin.
*
* @param tunnelId The tunnel ID that the sender contract is withdrawing.
* @param amount The amount of tokens to be withdrawn.
*/
function withdraw(uint64 tunnelId, uint256 amount) external;
/**
* @dev Withdraws all native tokens from the vault contract.
*
* This function should be called by the contract admin.
*
* @param tunnelId The tunnel ID that the sender contract is withdrawing.
*/
function withdrawAll(uint64 tunnelId) external;
/**
* @dev Returns The tunnelRouter contract address.
*/
function tunnelRouter() external view returns (address);
/**
* @dev Returns the price for the given string of signal, reverting if it does not exist.
*
* @param _signalId The signal ID to retrieve the price for.
*/
function getPrice(string calldata _signalId) external view returns (Price memory);
/**
* @dev Returns the prices for the given array of string of signal, reverting if any do not exist.
*
* @param _signalIds The list of signal IDs to retrieve prices for.
*/
function getPriceBatch(string[] calldata _signalIds) external view returns (Price[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
library PacketDecoder {
bytes8 private constant _FIXED_POINT_ENCODER_SELECTOR = 0xd3813e0ccba0ad5a; // keccak256("tunnel")[:4] + keccak256("FixedPointABI")[:4];
bytes8 private constant _TICK_ENCODER_SELECTOR = 0xd3813e0cdb99b2b3; // keccak256("tunnel")[:4] + keccak256("TickABI")[:4];
enum EncoderType {
Undefined,
FixedPoint,
Tick
}
// info of signals being published in the packet.
struct SignalPrice {
bytes32 signal;
uint64 price;
}
// the packet information generated from the tunnel.
struct Packet {
uint64 sequence;
SignalPrice[] signals;
int64 timestamp;
}
// the TSS message structure that is generated by the tunnel and is signed by the tss module.
struct TssMessage {
bytes32 originatorHash;
uint64 sourceTimestamp;
uint64 signingId;
EncoderType encoderType;
Packet packet;
}
/**
* @dev Decode the TSS message from the encoded message.
* @param message The encoded message.
* @return TssMessage The decoded TSS message object.
*/
function decodeTssMessage(bytes calldata message) internal pure returns (TssMessage memory) {
EncoderType encoder = _toEncoderType(bytes8(message[48:56]));
Packet memory packet = _decodePacket(message[56:]);
TssMessage memory tssMessage = TssMessage(
bytes32(message[0:32]), uint64(bytes8(message[32:40])), uint64(bytes8(message[40:48])), encoder, packet
);
return tssMessage;
}
/**
* @dev Decode the packet information from the encoded message.
* @param message The encoded message.
* @return TssMessage The decoded packet object.
*/
function _decodePacket(bytes calldata message) internal pure returns (Packet memory) {
Packet memory packet = abi.decode(message, (Packet));
return packet;
}
/**
* @dev Convert the selector to the encoder type.
* @param selector The selector to be converted.
* @return EncoderType The encoder type.
*/
function _toEncoderType(bytes8 selector) internal pure returns (EncoderType) {
if (selector == _FIXED_POINT_ENCODER_SELECTOR) {
return EncoderType.FixedPoint;
} else if (selector == _TICK_ENCODER_SELECTOR) {
return EncoderType.Tick;
} else {
return EncoderType.Undefined;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import "./IVault.sol";
import "../interfaces/ITssVerifier.sol";
interface ITunnelRouter {
// ========================================
// Structs
// ========================================
/**
* @dev Stores the core details of a tunnel, mapped by its originator hash.
* @param isActive A flag indicating if the tunnel is currently active
* @param sequence The current message sequence number for the tunnel
* @param tunnelId The unique identifier for the tunnel
* @param targetAddr The address of the target consumer contract for this tunnel.
*/
struct TunnelDetail {
bool isActive;
uint64 sequence;
uint64 tunnelId;
address targetAddr;
}
// ========================================
// Events
// ========================================
/**
* @notice Emitted when the callback gas limit is set.
*
* @param callbackGasLimit The maximum gas limit can be used when calling the target contract.
*/
event CallbackGasLimitSet(uint256 callbackGasLimit);
/**
* @notice Emitted when the tssVerifier is set.
*
* @param tssVerifier The address of TssVerifier contract.
*/
event TssVerifierSet(ITssVerifier tssVerifier);
/**
* @notice Emitted when the refundable is set.
*
* @param refundable The boolean indicating whether the router is refundable.
*/
event RefundableSet(bool refundable);
/**
* @notice Emitted after the message is relayed to the target contract
* to indicate the result of the process.
*
* @param originatorHash The originatorHash of the target that the sender is deactivating.
* @param sequence The sequence of the message.
* @param isSuccess The flag indicating whether the message is successful execute.
*/
event MessageProcessed(
bytes32 indexed originatorHash,
uint64 indexed sequence,
bool isSuccess
);
/**
* @notice Emitted when the target is activated.
*
* @param originatorHash The originatorHash of the target that the sender is activating.
* @param latestSequence The latest sequence of the tunnel.
*/
event Activated(bytes32 indexed originatorHash, uint64 latestSequence);
/**
* @notice Emitted when the target is deactivated.
*
* @param originatorHash The originatorHash of the target that the sender is deactivating.
* @param latestSequence The latest sequence of the tunnel.
*/
event Deactivated(bytes32 indexed originatorHash, uint64 latestSequence);
// ========================================
// Custom Errors
// ========================================
/**
* @notice Reverts if the target contract is inactive.
*
* @param originatorHash The originatorHash of the target contract and tunnelID.
*/
error TunnelNotActive(bytes32 originatorHash);
/**
* @notice Reverts if the target contract is already active.
*
* @param originatorHash The originatorHash of the target contract and tunnelID.
*/
error TunnelAlreadyActive(bytes32 originatorHash);
/**
* @notice Reverts if the encoder type is undefined.
*/
error UndefinedEncoderType();
/**
* @notice Reverts if the sequence is incorrect.
*
* @param expected The expected sequence of the tunnel.
* @param input The input sequence of the tunnel.
*/
error InvalidSequence(uint64 expected, uint64 input);
/**
* @notice Reverts if the message and its signature doesn't match.
*/
error InvalidSignature();
/**
* @notice Reverts if the remaining balance is insufficient to withdraw.
*
* @param tunnelId The tunnel ID that the sender is withdrawing tokens.
* @param addr The account from which the sender is withdrawing tokens.
*/
error InsufficientRemainingBalance(uint64 tunnelId, address addr);
/**
* @notice Reverts if the sender is not whitelisted.
*/
error SenderNotWhitelisted(address addr);
// ========================================
// Functions
// ========================================
///@dev Tunnel information
struct TunnelInfo {
bool isActive; // whether the tunnel is active or not
uint64 latestSequence; // the latest sequence of the tunnel
uint256 balance; // the remaining balance of the tunnel
bytes32 originatorHash; // the originator hash of the tunnel
}
/**
* @dev Relays the message to the target contract.
*
* Verifies the message's sequence and signature before forwarding it to
* the packet consumer contract. The sender is entitled to a reward from the
* vault contract, even if the packet consumer contract fails to process the
* message. The reward is based on the gas consumed during processing plus
* a predefined additional gas estimate.
*
* @param message The message to be relayed.
* @param randomAddr The random address used in signature.
* @param signature The signature of the message.
*/
function relay(
bytes calldata message,
address randomAddr,
uint256 signature
) external;
/**
* @dev Activates the sender and associated tunnel ID.
*
* This function should be called by the consumer contract as we use msg.sender in constructing
* the originatorHash.
*
* @param tunnelId The tunnel ID that the sender contract is activating.
* @param latestSeq The new sequence of the tunnelID.
*/
function activate(uint64 tunnelId, uint64 latestSeq) external payable;
/**
* @dev Deactivates the sender and associated tunnel ID.
*
* @param tunnelId The tunnel ID being deactivated.
*/
function deactivate(uint64 tunnelId) external;
/**
* @dev Returns the minimum balance required to keep the tunnel active.
*
* @return uint256 The minimum balance threshold.
*/
function minimumBalanceThreshold() external view returns (uint256);
/**
* @dev Returns the tunnel information.
*
* @param tunnelId The ID of the tunnel.
* @param addr The target contract address.
*
* @return TunnelInfo The tunnel information.
*/
function tunnelInfo(
uint64 tunnelId,
address addr
) external view returns (TunnelInfo memory);
/**
* @dev Returns the originator hash of the given tunnel ID and address.
*
* @param tunnelId The ID of the tunnel.
* @param addr The target contract address.
*
* @return bytes32 The originator hash of the tunnel.
*/
function originatorHash(
uint64 tunnelId,
address addr
) external view returns (bytes32);
/**
* @dev Returns the active status of the target contract.
*
* @param originatorHash The originatorHash of the target contract.
*
* @return bool True if the target contract is active, false otherwise.
*/
function isActive(bytes32 originatorHash) external view returns (bool);
/**
* @dev Returns the sequence of the target contract.
*
* @param originatorHash The originatorHash of the target contract.
*
* @return uint64 The sequence of the target contract.
*/
function sequence(bytes32 originatorHash) external view returns (uint64);
/**
* @dev Returns the vault contract address.
*/
function vault() external view returns (IVault);
/**
* @dev Returns the source chain ID hash.
*/
function sourceChainIdHash() external view returns (bytes32);
/**
* @dev Returns the target chain ID hash.
*/
function targetChainIdHash() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface IVault {
// ========================================
// Events
// ========================================
/**
* @notice Emitted when the tunnel router contract address is set.
*
* @param tunnelRouter The new tunnel router contract address.
*/
event TunnelRouterSet(address tunnelRouter);
/**
* @notice Emitted when the caller deposit native token into the contract.
*
* @param originatorHash The originator hash of the account to which the token is deposited.
* @param from The account from which the token is deposited.
* @param amount The amount of tokens deposited.
*/
event Deposited(bytes32 indexed originatorHash, address indexed from, uint256 amount);
/**
* @notice Emitted when the caller withdraw native token from the contract.
*
* @param originatorHash The originator hash of the account to which the token is deposited.
* @param to The account to which the token is withdrawn.
* @param amount The amount of tokens withdrawn.
*/
event Withdrawn(bytes32 indexed originatorHash, address indexed to, uint256 amount);
// ========================================
// Custom Errors
// ========================================
/**
* @notice The caller is not the tunnelRouter contract.
*/
error UnauthorizedTunnelRouter();
/**
* @notice Reverts if the balance is insufficient to allow the withdrawal without exceeding the threshold.
*/
error WithdrawnAmountExceedsThreshold();
/**
* @notice Reverts if the tunnel is active.
*/
error TunnelIsActive();
/**
* @notice Reverts if contract cannot send fee to the specific address.
*
* @param addr The address to which the token transfer failed.
*/
error TokenTransferFailed(address addr);
// ========================================
// Functions
// ========================================
/**
* @dev Deposits the native tokens into the vault on behalf of the given account and tunnelID.
* The deposit amount is provided via `msg.value`.
*
* @param tunnelId The ID of the tunnel into which the sender is depositing tokens.
* @param to The account into which the sender is depositing tokens
*/
function deposit(uint64 tunnelId, address to) external payable;
/**
* @dev Withdraws native tokens from the sender's account associated with the given tunnelID.
*
* @param tunnelId the ID of the tunnel from which the sender is withdrawing tokens.
* @param to The account to which the sender is withdrawing tokens to.
* @param amount the amount of tokens to withdraw.
*/
function withdraw(uint64 tunnelId, address to, uint256 amount) external;
/**
* @dev Withdraws the entire deposit from the sender's account for the specified tunnel ID.
* @param to The account to which the sender is withdrawing tokens to.
* @param tunnelId the ID of the tunnel from which the sender is withdrawing tokens.
*/
function withdrawAll(uint64 tunnelId, address to) external;
/**
* @dev Collects the fee from the given originator hash.
*
* This function should be called by the tunnelRouter contract only.
*
* @param originatorHash The originator hash of the account to which the token is withdrawn.
* @param to The account to which the sender is withdrawing tokens to.
* @param amount the amount of tokens to withdraw.
*/
function collectFee(bytes32 originatorHash, address to, uint256 amount) external;
/**
* @dev Returns the balance of the account.
*
* @param tunnelId The ID of the tunnel to check the balance.
* @param account The account to check the balance.
*/
function balance(uint64 tunnelId, address account) external view returns (uint256);
/**
* @dev Returns the balance of the account by the given originator hash.
*
* @param originatorHash The originator hash of the account to which the token is deposited.
*/
function getBalanceByOriginatorHash(bytes32 originatorHash) external view returns (uint256);
/**
* @dev Returns the tunnel router contract address.
*/
function tunnelRouter() external view returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface ITssVerifier {
// ========================================
// Structs
// ========================================
/**
* @notice Represents a group public key used for signature verification.
* @param activeTime The Unix timestamp from which this public key is considered active.
* @param parity The parity of the y-coordinate, used for public key recovery.
* @param px The x-coordinate of the public key.
*/
struct PublicKey {
uint64 activeTime;
uint8 parity;
uint256 px;
}
// ========================================
// Events
// ========================================
/**
* @dev Emitted when the group public key is updated.
* @param index The index of the public key in the group.
* @param timestamp The timestamp of the update.
* @param parity The parity value of the public key.
* @param px The x-coordinate value of the public key.
* @param isByAdmin True if the public key is updated by the admin, false otherwise.
*/
event GroupPubKeyUpdated(uint256 index, uint256 timestamp, uint8 parity, uint256 px, bool isByAdmin);
/**
* @dev Emitted when the transition period is updated.
* @param transitionPeriod The new duration of the transition period.
*/
event TransitionPeriodUpdated(uint64 transitionPeriod);
/**
* @dev Emitted when the transition originator hash is updated.
* @param transitionOriginatorHash The new transition originator hash.
*/
event TransitionOriginatorHashUpdated(bytes32 transitionOriginatorHash);
// ========================================
// Custom Errors
// ========================================
/**
* @notice Reverts if the message and its signature doesn't match.
*/
error InvalidSignature();
/**
* @notice Reverts if the transition originator hash doesn't match with the one in the message.
*/
error InvalidTransitionOriginatorHash();
/**
* @notice Reverts if the contract fails to processes the signature.
*/
error ProcessingSignatureFailed();
/**
* @notice Reverts if there is no valid public key.
*
* @param timestamp The given timestamp of the message.
*/
error PublicKeyNotFound(uint256 timestamp);
// ========================================
// Functions
// ========================================
/**
* @dev Verifies the signature of the message against the given signature.
*
* The contract is not allowed to verify the message with obsolete public key.
*
* @param hashedMessage The hashed message to be verified.
* @param randomAddr The random address that is generated during the processing tss signature.
* @param signature The tss signature.
* @return true If the signature is valid, false otherwise.
*/
function verify(bytes32 hashedMessage, address randomAddr, uint256 signature) external view returns (bool);
/**
* @dev Adds a new public key with proof from the current group.
*
* @param message The message being used for updating public key.
* @param randomAddr The address form of the commitment R.
* @param signature The tss signature.
*/
function addPubKeyWithProof(bytes calldata message, address randomAddr, uint256 signature) external;
/**
* @dev Adds the new public key by the owner.
*
* @param timestamp The timestamp of the new public key.
* @param parity The parity value of the new public key.
* @param px The x-coordinate value of the new public key.
*/
function addPubKeyByOwner(uint64 timestamp, uint8 parity, uint256 px) external;
/**
* @dev Sets the transition period of the tss signature.
* The transition period is the period in which the previous public key is still valid even
* though the new public key is already added.
*
* @param transitionPeriod_ The new duration of the transition period.
*/
function setTransitionPeriod(uint64 transitionPeriod_) external;
/**
* @dev Sets the transition originator hash.
* The transition originator hash is the hash of the originator of the transition message.
*
* @param transitionOriginatorHash_ The new transition originator hash.
*/
function setTransitionOriginatorHash(bytes32 transitionOriginatorHash_) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"tunnelRouter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidEncoderType","type":"error"},{"inputs":[],"name":"InvalidPacketTimestamp","type":"error"},{"inputs":[{"internalType":"string","name":"signalId","type":"string"}],"name":"SignalIdNotAvailable","type":"error"},{"inputs":[{"internalType":"string","name":"input","type":"string"}],"name":"StringInputExceedsBytes32","type":"error"},{"inputs":[],"name":"UnauthorizedTunnelRouter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MID_TICK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TUNNEL_ACTIVATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"},{"internalType":"uint64","name":"latestSeq","type":"uint64"}],"name":"activate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"deactivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"delisting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_signalId","type":"string"}],"name":"getPrice","outputs":[{"components":[{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct IPacketConsumer.Price","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_signalIds","type":"string[]"}],"name":"getPriceBatch","outputs":[{"components":[{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct IPacketConsumer.Price[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"getPriceFromTick","outputs":[{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbol","type":"bytes32"}],"name":"getSlotAndIndex","outputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint8","name":"idx","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbol","type":"bytes32"}],"name":"getTickAndTime","outputs":[{"internalType":"uint256","name":"tick","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"grantTunnelActivatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idsToSymbols","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"listing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"originatorHash","type":"bytes32"},{"internalType":"uint64","name":"sourceTimestamp","type":"uint64"},{"internalType":"uint64","name":"signingId","type":"uint64"},{"internalType":"enum PacketDecoder.EncoderType","name":"encoderType","type":"uint8"},{"components":[{"internalType":"uint64","name":"sequence","type":"uint64"},{"components":[{"internalType":"bytes32","name":"signal","type":"bytes32"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct PacketDecoder.SignalPrice[]","name":"signals","type":"tuple[]"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct PacketDecoder.Packet","name":"packet","type":"tuple"}],"internalType":"struct PacketDecoder.TssMessage","name":"data","type":"tuple"}],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"revokeTunnelActivatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"b","type":"bytes32"}],"name":"rightAlignedBytes32ToString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_s","type":"string"}],"name":"stringToRightAlignedBytes32","outputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"symbolsToIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSymbolsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tunnelRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a0604052600060045534801561001557600080fd5b506040516128483803806128488339810160408190526100349161012c565b6001600160a01b0381166080528061004d600033610080565b506100787f01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee4133610080565b50505061015c565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16610122576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556100da3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610126565b5060005b92915050565b60006020828403121561013e57600080fd5b81516001600160a01b038116811461015557600080fd5b9392505050565b6080516126a76101a160003960008181610420015281816107d601528181610dcd01528181611146015281816112150152818161126d015261167301526126a76000f3fe6080604052600436106101d85760003560e01c80637a8003ac11610102578063bb5114f911610095578063df12c00d11610064578063df12c00d146105e0578063e390735814610600578063f4465fd514610622578063f79f6de41461064257600080fd5b8063bb5114f914610569578063c3022e7314610589578063d547741f146105a0578063dee6d283146105c057600080fd5b806391d14854116100d157806391d14854146104f4578063a217fddf14610514578063ac7c0a3c14610529578063ba1b5f231461055657600080fd5b80637a8003ac1461045a5780637ef0bd4614610491578063845af085146104a75780638774462e146104d457600080fd5b806336568abe1161017a5780634dcd9922116101495780634dcd992214610387578063524f3889146103b4578063633f8574146103e15780636a5d9b591461040e57600080fd5b806336568abe146102f257806338f98444146103125780633cf7900514610332578063433879831461036757600080fd5b8063171ec9fd116101b6578063171ec9fd14610254578063248a9ca314610274578063270ba9ea146102b25780632f2ff15d146102d257600080fd5b806301ffc9a7146101dd5780630ac356a814610212578063137658381461023f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e7e565b610662565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611eaf565b610699565b6040516102099190611ec8565b61025261024d366004611f2d565b6107d2565b005b34801561026057600080fd5b5061025261026f366004611f8c565b6108c7565b34801561028057600080fd5b506102a461028f366004611eaf565b60009081526020819052604090206001015490565b604051908152602001610209565b3480156102be57600080fd5b506102a46102cd366004612073565b61092a565b3480156102de57600080fd5b506102526102ed366004612120565b610980565b3480156102fe57600080fd5b5061025261030d366004612120565b6109a5565b34801561031e57600080fd5b5061025261032d366004611f8c565b6109dd565b34801561033e57600080fd5b5061035261034d366004611eaf565b610d95565b60408051928352602083019190915201610209565b34801561037357600080fd5b50610252610382366004612150565b610dbe565b34801561039357600080fd5b506102a46103a2366004611eaf565b60036020526000908152604090205481565b3480156103c057600080fd5b506103d46103cf36600461217a565b610ec5565b60405161020991906121ec565b3480156103ed57600080fd5b506104016103fc366004611f8c565b610f80565b604051610209919061220f565b34801561041a57600080fd5b506104427f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610209565b34801561046657600080fd5b5061047a610475366004611eaf565b6110bb565b6040805192835260ff909116602083015201610209565b34801561049d57600080fd5b506102a460045481565b3480156104b357600080fd5b506102a46104c2366004611eaf565b60016020526000908152604090205481565b3480156104e057600080fd5b506102526104ef366004611f2d565b611110565b34801561050057600080fd5b506101fd61050f366004612120565b6111ae565b34801561052057600080fd5b506102a4600081565b34801561053557600080fd5b506102a4610544366004611eaf565b60026020526000908152604090205481565b610252610564366004612273565b6111d7565b34801561057557600080fd5b506102526105843660046122b8565b611262565b34801561059557600080fd5b506102a46204000081565b3480156105ac57600080fd5b506102526105bb366004612120565b6114c3565b3480156105cc57600080fd5b506102526105db366004611f8c565b6114e8565b3480156105ec57600080fd5b506102a46105fb366004611eaf565b611659565b34801561060c57600080fd5b506102a460008051602061265283398151915281565b34801561062e57600080fd5b5061025261063d366004611f2d565b611664565b34801561064e57600080fd5b5061025261065d366004611f8c565b611746565b60006001600160e01b03198216637965db0b60e01b148061069357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060005b60208160ff161080156106d15750828160ff16602081106106c1576106c1612464565b1a60f81b6001600160f81b031916155b156106e857806106e081612490565b91505061069e565b8060ff16602003610709575050604080516020810190915260008152919050565b60006107168260206124af565b905060008160ff166001600160401b0381111561073557610735611fc1565b6040519080825280601f01601f19166020018201604052801561075f576020820181803683370190505b50905060005b8260ff168160ff1610156107c9578561077e82866124c8565b60ff166020811061079157610791612464565b1a60f81b828260ff16815181106107aa576107aa612464565b60200101906001600160f81b031916908160001a905350600101610765565b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085691906124e1565b60405163576bcd2f60e01b81526001600160401b03841660048201523060248201529091506001600160a01b0382169063576bcd2f9034906044016000604051808303818588803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b50505050505050565b60006108d2816117a3565b60005b828110156109245761091b60008051602061265283398151915285858481811061090157610901612464565b905060200201602081019061091691906124fe565b6117b0565b506001016108d5565b50505050565b600060208251111561095a578160405163ea46556360e01b81526004016109519190611ec8565b60405180910390fd5b602082015190508151602061096f919061251b565b61097a90600861252e565b1c919050565b60008281526020819052604090206001015461099b816117a3565b6109248383611823565b6001600160a01b03811633146109ce5760405163334bd91960e11b815260040160405180910390fd5b6109d882826117b0565b505050565b60006109e8816117a3565b60045460008080808080808080805b8c811015610d80576000610a628f8f84818110610a1657610a16612464565b9050602002810190610a289190612545565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061092a92505050565b600081815260026020526040812054919250819003610acf5760405162461bcd60e51b8152602060048201526024808201527f64656c697374696e673a204641494c5f53594d424f4c5f4e4f545f415641494c60448201526341424c4560e01b6064820152608401610951565b60008d815260036020818152604080842054808552600283528185208690558585529290915290912081905593506006610b0a60018f61251b565b610b1491906125a1565b9b506006610b2360018361251b565b610b2d91906125a1565b60008d815260016020526040902054909b50995060de8a901c6007169750610b5688600661251b565b610b6190602561252e565b8a901c641fffffffff1695506006610b7a60018361251b565b610b8491906125b5565b610b8f90600561251b565b610b9a90602561252e565b96508a8c03610bc35785871b610bb9641fffffffff891b60001961251b565b8b16179950610d24565b60008b8152600160205260409020549850601386901c610be38b60e11c90565b610bed91906125c9565b9450610bf98960e11c90565b851015610c6e5760405162461bcd60e51b815260206004820152603c60248201527f64656c697374696e673a204641494c5f4c4153545f54494d455354414d505f4960448201527f535f4c4553535f5448414e5f5441524745545f54494d455354414d50000000006064820152608401610951565b610c788960e11c90565b610c82908661251b565b9450620400008510610ce75760405162461bcd60e51b815260206004820152602860248201527f64656c697374696e673a204641494c5f44454c54415f54494d455f4558434545604482015267445f335f4441595360c01b6064820152608401610951565b6207ffff95909516601385901b179485871b610d0c641fffffffff891b60001961251b565b60008d8152600160205260409020908b169190911790555b610d388a610d3360018b61251b565b6118ad565b60008d815260016020908152604080832093909355848252600281528282208290558f825260039052908120558c610d6f816125dc565b9d5050600190920191506109f79050565b50505060049790975550505050505050505050565b600080600080610da4856110bb565b91509150610db282826118d1565b90969095509350505050565b6000610dc9816117a3565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d91906124e1565b60405163349b2b8f60e21b81526001600160401b0386166004820152336024820152604481018590529091506001600160a01b0382169063d26cae3c90606401600060405180830381600087803b158015610ea757600080fd5b505af1158015610ebb573d6000803e3d6000fd5b5050505050505050565b6040805180820190915260008082526020820152600080610f1e61034d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061092a92505050565b915091506000610f2d8361191c565b604080518082019091526001600160401b038216808252600785900b602083015291925090600003610f765786866040516308e197c160e41b81526004016109519291906125f3565b9695505050505050565b60606000826001600160401b03811115610f9c57610f9c611fc1565b604051908082528060200260200182016040528015610fe157816020015b6040805180820190915260008082526020820152815260200190600190039081610fba5790505b50905060005b838110156110b35760008061100a61034d888886818110610a1657610a16612464565b9150915060006110198361191c565b604080518082019091526001600160401b038216808252600785900b6020830152919250906000036110845788888681811061105757611057612464565b90506020028101906110699190612545565b6040516308e197c160e41b81526004016109519291906125f3565b8086868151811061109757611097612464565b6020026020010181905250505050508080600101915050610fe7565b509392505050565b60008181526002602052604081205481908082036110f6576110dc84610699565b6040516308e197c160e41b81526004016109519190611ec8565b600660001982010460066000198301069250925050915091565b600080516020612652833981519152611128816117a3565b6040516343ba231760e11b81526001600160401b03831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638774462e90602401600060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000805160206126528339815191526111ef816117a3565b60405163ba1b5f2360e01b81526001600160401b038085166004830152831660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ba1b5f239034906044016000604051808303818588803b158015610ea757600080fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112ab57604051636e96d7e160e11b815260040160405180910390fd5b608081015160408101516203ffff60079190910b12156112de5760405163b10d81c560e01b815260040160405180910390fd5b6002826060015160028111156112f6576112f6612622565b146113145760405163e27c149d60e01b815260040160405180910390fd5b604081015160208201515160079190910b906000906000199082908190819081906203fffe198801908290815b8181101561149c57600260008d60200151838151811061136357611363612464565b6020026020010151600001518152602001908152602001600020549950896000036113b2576110dc8c6020015182815181106113a1576113a1612464565b602002602001015160000151610699565b6000198a0192506006830497508789146114185785156113de5760008981526001602052604090208690555b600088815260016020526040902054979850889795506113fe8660e11c90565b965086841115611418578396506114158688611db7565b95505b6006830660250260cc0394508a6203ffff87871c1688011061143a5785611492565b61149286888d038e60200151848151811061145757611457612464565b6020026020010151602001516001600160401b031660138903641fffffffff811b199390931660139290921b6207ffff9091161790911b1790565b9550600101611341565b5084156114b55760008881526001602052604090208590555b505050505050505050505050565b6000828152602081905260409020600101546114de816117a3565b61092483836117b0565b60006114f3816117a3565b81156109d85760045460006115096006836125a1565b600081815260016020526040812054919250600760de83901c16905b8681101561163f576000611544898984818110610a1657610a16612464565b600081815260026020526040902054909150156115af5760405162461bcd60e51b815260206004820152602360248201527f6c697374696e673a204641494c5f53594d424f4c5f49535f414c52454144595f60448201526214d15560ea1b6064820152608401610951565b60006115bc6006886125a1565b9050866115c881612638565b60008481526002602090815260408083208490558383526003909152902084905597505085811461161c5760009586526001602052604080872095909555808652939094205492938460de85901c60071693505b8361162681612638565b94505061163385856118ad565b94505050600101611525565b505060009182526001602052604090912055600455505050565b60006106938261191c565b600061166f816117a3565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f391906124e1565b60405163fc7a1c2960e01b81526001600160401b03851660048201523360248201529091506001600160a01b0382169063fc7a1c2990604401600060405180830381600087803b1580156108aa57600080fd5b6000611751816117a3565b60005b828110156109245761179a60008051602061265283398151915285858481811061178057611780612464565b905060200201602081019061179591906124fe565b611823565b50600101611754565b6117ad8133611e41565b50565b60006117bc83836111ae565b1561181b576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610693565b506000610693565b600061182f83836111ae565b61181b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556118653390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610693565b6001600760de1b031960001960256006849003021b019190911660de9190911b1790565b60008281526001602052604081205481906025840260ff1660b981900382901c6207ffff166119008360e11c90565b60cc83900384901c6203ffff16019350935050505b9250929050565b60008160000361192e57506000919050565b506001606d1b62040000821015611b7f57816204000003915081600116600014611966576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611983576d2001a3738d157cbeed661f6eb03602606d1c5b60048216156119a0576d200346fc94469961060a2dca328a02606d1c5b60088216156119bd576d20068e4f1561d255b44b568c032402606d1c5b60108216156119da576d200d1df6014a4a9014baffb8599e02606d1c5b60208216156119f7576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611a14576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611a31576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611a4f576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611a6d576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611a8b576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611aa9576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611ac7576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611ae5576d48984caba30b40521004a50ee12002606d1c5b614000821615611b03576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611b22576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611b42576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611b63576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b80621dcd6560761b81611b7857611b7861258b565b0492915050565b6203ffff19909101906001821615611ba5576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611bc2576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611bdf576d200346fc94469961060a2dca328a02606d1c5b6008821615611bfc576d20068e4f1561d255b44b568c032402606d1c5b6010821615611c19576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611c36576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611c53576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611c70576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611c8e576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611cac576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611cca576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611ce8576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611d06576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611d24576d48984caba30b40521004a50ee12002606d1c5b614000821615611d42576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611d61576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611d81576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611da2576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b6001606d1b633b9aca0082020490505b919050565b600080611dc48460e11c90565b9050600760de85901c166000805b82811015611e26576025810260cc0391506203ffff87831c168481018711611e0b57848101879003831b6203ffff841b19891617611e1b565b641fffffffff60121984011b1988165b975050600101611dd2565b5060e185901b6001600160e11b038716179695505050505050565b611e4b82826111ae565b611e7a5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610951565b5050565b600060208284031215611e9057600080fd5b81356001600160e01b031981168114611ea857600080fd5b9392505050565b600060208284031215611ec157600080fd5b5035919050565b602081526000825180602084015260005b81811015611ef65760208186018101516040868401015201611ed9565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160401b0381168114611db257600080fd5b600060208284031215611f3f57600080fd5b611ea882611f16565b60008083601f840112611f5a57600080fd5b5081356001600160401b03811115611f7157600080fd5b6020830191508360208260051b850101111561191557600080fd5b60008060208385031215611f9f57600080fd5b82356001600160401b03811115611fb557600080fd5b610db285828601611f48565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715611ff957611ff9611fc1565b60405290565b604051606081016001600160401b0381118282101715611ff957611ff9611fc1565b604080519081016001600160401b0381118282101715611ff957611ff9611fc1565b604051601f8201601f191681016001600160401b038111828210171561206b5761206b611fc1565b604052919050565b60006020828403121561208557600080fd5b81356001600160401b0381111561209b57600080fd5b8201601f810184136120ac57600080fd5b80356001600160401b038111156120c5576120c5611fc1565b6120d8601f8201601f1916602001612043565b8181528560208385010111156120ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6001600160a01b03811681146117ad57600080fd5b6000806040838503121561213357600080fd5b8235915060208301356121458161210b565b809150509250929050565b6000806040838503121561216357600080fd5b61216c83611f16565b946020939093013593505050565b6000806020838503121561218d57600080fd5b82356001600160401b038111156121a357600080fd5b8301601f810185136121b457600080fd5b80356001600160401b038111156121ca57600080fd5b8560208284010111156121dc57600080fd5b6020919091019590945092505050565b81516001600160401b0316815260208083015160070b9082015260408101610693565b602080825282518282018190526000918401906040840190835b818110156122685761225283855180516001600160401b0316825260209081015160070b910152565b6020939093019260409290920191600101612229565b509095945050505050565b6000806040838503121561228657600080fd5b61228f83611f16565b915061229d60208401611f16565b90509250929050565b8035600781900b8114611db257600080fd5b6000602082840312156122ca57600080fd5b81356001600160401b038111156122e057600080fd5b820160a081850312156122f257600080fd5b6122fa611fd7565b8135815261230a60208301611f16565b602082015261231b60408301611f16565b604082015260608201356003811061233257600080fd5b606082015260808201356001600160401b0381111561235057600080fd5b91909101906060828603121561236557600080fd5b61236d611fff565b61237683611f16565b815260208301356001600160401b0381111561239157600080fd5b8301601f810187136123a257600080fd5b80356001600160401b038111156123bb576123bb611fc1565b6123ca60208260051b01612043565b8082825260208201915060208360061b8501019250898311156123ec57600080fd5b6020840193505b8284101561243d576040848b03121561240b57600080fd5b612413612021565b8435815261242360208601611f16565b6020820152808352506020820191506040840193506123f3565b602085015250612452915050604084016122a6565b60408201526080820152949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81036124a6576124a661247a565b60010192915050565b60ff82811682821603908111156106935761069361247a565b60ff81811683821601908111156106935761069361247a565b6000602082840312156124f357600080fd5b8151611ea88161210b565b60006020828403121561251057600080fd5b8135611ea88161210b565b818103818111156106935761069361247a565b80820281158282048414176106935761069361247a565b6000808335601e1984360301811261255c57600080fd5b8301803591506001600160401b0382111561257657600080fd5b60200191503681900382131561191557600080fd5b634e487b7160e01b600052601260045260246000fd5b6000826125b0576125b061258b565b500490565b6000826125c4576125c461258b565b500690565b808201808211156106935761069361247a565b6000816125eb576125eb61247a565b506000190190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052602160045260246000fd5b60006001820161264a5761264a61247a565b506001019056fe01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee41a2646970667358221220ff86173ff68e03c5ce4d2cc9b519d1cf9af268980bfe8fa4f9ccc3ca009b8d2f64736f6c634300081c00330000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff20
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80637a8003ac11610102578063bb5114f911610095578063df12c00d11610064578063df12c00d146105e0578063e390735814610600578063f4465fd514610622578063f79f6de41461064257600080fd5b8063bb5114f914610569578063c3022e7314610589578063d547741f146105a0578063dee6d283146105c057600080fd5b806391d14854116100d157806391d14854146104f4578063a217fddf14610514578063ac7c0a3c14610529578063ba1b5f231461055657600080fd5b80637a8003ac1461045a5780637ef0bd4614610491578063845af085146104a75780638774462e146104d457600080fd5b806336568abe1161017a5780634dcd9922116101495780634dcd992214610387578063524f3889146103b4578063633f8574146103e15780636a5d9b591461040e57600080fd5b806336568abe146102f257806338f98444146103125780633cf7900514610332578063433879831461036757600080fd5b8063171ec9fd116101b6578063171ec9fd14610254578063248a9ca314610274578063270ba9ea146102b25780632f2ff15d146102d257600080fd5b806301ffc9a7146101dd5780630ac356a814610212578063137658381461023f575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611e7e565b610662565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b5061023261022d366004611eaf565b610699565b6040516102099190611ec8565b61025261024d366004611f2d565b6107d2565b005b34801561026057600080fd5b5061025261026f366004611f8c565b6108c7565b34801561028057600080fd5b506102a461028f366004611eaf565b60009081526020819052604090206001015490565b604051908152602001610209565b3480156102be57600080fd5b506102a46102cd366004612073565b61092a565b3480156102de57600080fd5b506102526102ed366004612120565b610980565b3480156102fe57600080fd5b5061025261030d366004612120565b6109a5565b34801561031e57600080fd5b5061025261032d366004611f8c565b6109dd565b34801561033e57600080fd5b5061035261034d366004611eaf565b610d95565b60408051928352602083019190915201610209565b34801561037357600080fd5b50610252610382366004612150565b610dbe565b34801561039357600080fd5b506102a46103a2366004611eaf565b60036020526000908152604090205481565b3480156103c057600080fd5b506103d46103cf36600461217a565b610ec5565b60405161020991906121ec565b3480156103ed57600080fd5b506104016103fc366004611f8c565b610f80565b604051610209919061220f565b34801561041a57600080fd5b506104427f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff2081565b6040516001600160a01b039091168152602001610209565b34801561046657600080fd5b5061047a610475366004611eaf565b6110bb565b6040805192835260ff909116602083015201610209565b34801561049d57600080fd5b506102a460045481565b3480156104b357600080fd5b506102a46104c2366004611eaf565b60016020526000908152604090205481565b3480156104e057600080fd5b506102526104ef366004611f2d565b611110565b34801561050057600080fd5b506101fd61050f366004612120565b6111ae565b34801561052057600080fd5b506102a4600081565b34801561053557600080fd5b506102a4610544366004611eaf565b60026020526000908152604090205481565b610252610564366004612273565b6111d7565b34801561057557600080fd5b506102526105843660046122b8565b611262565b34801561059557600080fd5b506102a46204000081565b3480156105ac57600080fd5b506102526105bb366004612120565b6114c3565b3480156105cc57600080fd5b506102526105db366004611f8c565b6114e8565b3480156105ec57600080fd5b506102a46105fb366004611eaf565b611659565b34801561060c57600080fd5b506102a460008051602061265283398151915281565b34801561062e57600080fd5b5061025261063d366004611f2d565b611664565b34801561064e57600080fd5b5061025261065d366004611f8c565b611746565b60006001600160e01b03198216637965db0b60e01b148061069357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060005b60208160ff161080156106d15750828160ff16602081106106c1576106c1612464565b1a60f81b6001600160f81b031916155b156106e857806106e081612490565b91505061069e565b8060ff16602003610709575050604080516020810190915260008152919050565b60006107168260206124af565b905060008160ff166001600160401b0381111561073557610735611fc1565b6040519080825280601f01601f19166020018201604052801561075f576020820181803683370190505b50905060005b8260ff168160ff1610156107c9578561077e82866124c8565b60ff166020811061079157610791612464565b1a60f81b828260ff16815181106107aa576107aa612464565b60200101906001600160f81b031916908160001a905350600101610765565b50949350505050565b60007f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff206001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085691906124e1565b60405163576bcd2f60e01b81526001600160401b03841660048201523060248201529091506001600160a01b0382169063576bcd2f9034906044016000604051808303818588803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b50505050505050565b60006108d2816117a3565b60005b828110156109245761091b60008051602061265283398151915285858481811061090157610901612464565b905060200201602081019061091691906124fe565b6117b0565b506001016108d5565b50505050565b600060208251111561095a578160405163ea46556360e01b81526004016109519190611ec8565b60405180910390fd5b602082015190508151602061096f919061251b565b61097a90600861252e565b1c919050565b60008281526020819052604090206001015461099b816117a3565b6109248383611823565b6001600160a01b03811633146109ce5760405163334bd91960e11b815260040160405180910390fd5b6109d882826117b0565b505050565b60006109e8816117a3565b60045460008080808080808080805b8c811015610d80576000610a628f8f84818110610a1657610a16612464565b9050602002810190610a289190612545565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061092a92505050565b600081815260026020526040812054919250819003610acf5760405162461bcd60e51b8152602060048201526024808201527f64656c697374696e673a204641494c5f53594d424f4c5f4e4f545f415641494c60448201526341424c4560e01b6064820152608401610951565b60008d815260036020818152604080842054808552600283528185208690558585529290915290912081905593506006610b0a60018f61251b565b610b1491906125a1565b9b506006610b2360018361251b565b610b2d91906125a1565b60008d815260016020526040902054909b50995060de8a901c6007169750610b5688600661251b565b610b6190602561252e565b8a901c641fffffffff1695506006610b7a60018361251b565b610b8491906125b5565b610b8f90600561251b565b610b9a90602561252e565b96508a8c03610bc35785871b610bb9641fffffffff891b60001961251b565b8b16179950610d24565b60008b8152600160205260409020549850601386901c610be38b60e11c90565b610bed91906125c9565b9450610bf98960e11c90565b851015610c6e5760405162461bcd60e51b815260206004820152603c60248201527f64656c697374696e673a204641494c5f4c4153545f54494d455354414d505f4960448201527f535f4c4553535f5448414e5f5441524745545f54494d455354414d50000000006064820152608401610951565b610c788960e11c90565b610c82908661251b565b9450620400008510610ce75760405162461bcd60e51b815260206004820152602860248201527f64656c697374696e673a204641494c5f44454c54415f54494d455f4558434545604482015267445f335f4441595360c01b6064820152608401610951565b6207ffff95909516601385901b179485871b610d0c641fffffffff891b60001961251b565b60008d8152600160205260409020908b169190911790555b610d388a610d3360018b61251b565b6118ad565b60008d815260016020908152604080832093909355848252600281528282208290558f825260039052908120558c610d6f816125dc565b9d5050600190920191506109f79050565b50505060049790975550505050505050505050565b600080600080610da4856110bb565b91509150610db282826118d1565b90969095509350505050565b6000610dc9816117a3565b60007f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff206001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d91906124e1565b60405163349b2b8f60e21b81526001600160401b0386166004820152336024820152604481018590529091506001600160a01b0382169063d26cae3c90606401600060405180830381600087803b158015610ea757600080fd5b505af1158015610ebb573d6000803e3d6000fd5b5050505050505050565b6040805180820190915260008082526020820152600080610f1e61034d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061092a92505050565b915091506000610f2d8361191c565b604080518082019091526001600160401b038216808252600785900b602083015291925090600003610f765786866040516308e197c160e41b81526004016109519291906125f3565b9695505050505050565b60606000826001600160401b03811115610f9c57610f9c611fc1565b604051908082528060200260200182016040528015610fe157816020015b6040805180820190915260008082526020820152815260200190600190039081610fba5790505b50905060005b838110156110b35760008061100a61034d888886818110610a1657610a16612464565b9150915060006110198361191c565b604080518082019091526001600160401b038216808252600785900b6020830152919250906000036110845788888681811061105757611057612464565b90506020028101906110699190612545565b6040516308e197c160e41b81526004016109519291906125f3565b8086868151811061109757611097612464565b6020026020010181905250505050508080600101915050610fe7565b509392505050565b60008181526002602052604081205481908082036110f6576110dc84610699565b6040516308e197c160e41b81526004016109519190611ec8565b600660001982010460066000198301069250925050915091565b600080516020612652833981519152611128816117a3565b6040516343ba231760e11b81526001600160401b03831660048201527f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff206001600160a01b031690638774462e90602401600060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000805160206126528339815191526111ef816117a3565b60405163ba1b5f2360e01b81526001600160401b038085166004830152831660248201527f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff206001600160a01b03169063ba1b5f239034906044016000604051808303818588803b158015610ea757600080fd5b336001600160a01b037f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff2016146112ab57604051636e96d7e160e11b815260040160405180910390fd5b608081015160408101516203ffff60079190910b12156112de5760405163b10d81c560e01b815260040160405180910390fd5b6002826060015160028111156112f6576112f6612622565b146113145760405163e27c149d60e01b815260040160405180910390fd5b604081015160208201515160079190910b906000906000199082908190819081906203fffe198801908290815b8181101561149c57600260008d60200151838151811061136357611363612464565b6020026020010151600001518152602001908152602001600020549950896000036113b2576110dc8c6020015182815181106113a1576113a1612464565b602002602001015160000151610699565b6000198a0192506006830497508789146114185785156113de5760008981526001602052604090208690555b600088815260016020526040902054979850889795506113fe8660e11c90565b965086841115611418578396506114158688611db7565b95505b6006830660250260cc0394508a6203ffff87871c1688011061143a5785611492565b61149286888d038e60200151848151811061145757611457612464565b6020026020010151602001516001600160401b031660138903641fffffffff811b199390931660139290921b6207ffff9091161790911b1790565b9550600101611341565b5084156114b55760008881526001602052604090208590555b505050505050505050505050565b6000828152602081905260409020600101546114de816117a3565b61092483836117b0565b60006114f3816117a3565b81156109d85760045460006115096006836125a1565b600081815260016020526040812054919250600760de83901c16905b8681101561163f576000611544898984818110610a1657610a16612464565b600081815260026020526040902054909150156115af5760405162461bcd60e51b815260206004820152602360248201527f6c697374696e673a204641494c5f53594d424f4c5f49535f414c52454144595f60448201526214d15560ea1b6064820152608401610951565b60006115bc6006886125a1565b9050866115c881612638565b60008481526002602090815260408083208490558383526003909152902084905597505085811461161c5760009586526001602052604080872095909555808652939094205492938460de85901c60071693505b8361162681612638565b94505061163385856118ad565b94505050600101611525565b505060009182526001602052604090912055600455505050565b60006106938261191c565b600061166f816117a3565b60007f0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff206001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f391906124e1565b60405163fc7a1c2960e01b81526001600160401b03851660048201523360248201529091506001600160a01b0382169063fc7a1c2990604401600060405180830381600087803b1580156108aa57600080fd5b6000611751816117a3565b60005b828110156109245761179a60008051602061265283398151915285858481811061178057611780612464565b905060200201602081019061179591906124fe565b611823565b50600101611754565b6117ad8133611e41565b50565b60006117bc83836111ae565b1561181b576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610693565b506000610693565b600061182f83836111ae565b61181b576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556118653390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610693565b6001600760de1b031960001960256006849003021b019190911660de9190911b1790565b60008281526001602052604081205481906025840260ff1660b981900382901c6207ffff166119008360e11c90565b60cc83900384901c6203ffff16019350935050505b9250929050565b60008160000361192e57506000919050565b506001606d1b62040000821015611b7f57816204000003915081600116600014611966576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611983576d2001a3738d157cbeed661f6eb03602606d1c5b60048216156119a0576d200346fc94469961060a2dca328a02606d1c5b60088216156119bd576d20068e4f1561d255b44b568c032402606d1c5b60108216156119da576d200d1df6014a4a9014baffb8599e02606d1c5b60208216156119f7576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611a14576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611a31576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611a4f576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611a6d576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611a8b576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611aa9576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611ac7576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611ae5576d48984caba30b40521004a50ee12002606d1c5b614000821615611b03576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611b22576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611b42576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611b63576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b80621dcd6560761b81611b7857611b7861258b565b0492915050565b6203ffff19909101906001821615611ba5576d2000d1b71758e219652bd3c3611302606d1c5b6002821615611bc2576d2001a3738d157cbeed661f6eb03602606d1c5b6004821615611bdf576d200346fc94469961060a2dca328a02606d1c5b6008821615611bfc576d20068e4f1561d255b44b568c032402606d1c5b6010821615611c19576d200d1df6014a4a9014baffb8599e02606d1c5b6020821615611c36576d201a414c7682e7073bf3b554ad0802606d1c5b6040821615611c53576d203498238e85baee52e71bebd2cc02606d1c5b6080821615611c70576d206986b863ec99f4db81adbc87a102606d1c5b610100821615611c8e576d20d4696f19155ff7f037dab4656102606d1c5b610200821615611cac576d21ae54d48d99b179d35cee362c5202606d1c5b610400821615611cca576d237344b1cc7250b2db8eaff5466202606d1c5b610800821615611ce8576d2745c57b409f06f3e79a2f7cb86802606d1c5b611000821615611d06576d3032a97cd3c1b51fcefe55685d0f02606d1c5b612000821615611d24576d48984caba30b40521004a50ee12002606d1c5b614000821615611d42576da4b02ddd73f26b638c2cef3d00fc02606d1c5b618000821615611d61576e034f91a016aa2d09fe9a635c0ca03702606d1c5b62010000821615611d81576e57b127a165bef92f108b218cd9bc7a02606d1c5b62020000821615611da2576ff04f1c3c33c8919f172ba42a5b99e82502606d1c5b6001606d1b633b9aca0082020490505b919050565b600080611dc48460e11c90565b9050600760de85901c166000805b82811015611e26576025810260cc0391506203ffff87831c168481018711611e0b57848101879003831b6203ffff841b19891617611e1b565b641fffffffff60121984011b1988165b975050600101611dd2565b5060e185901b6001600160e11b038716179695505050505050565b611e4b82826111ae565b611e7a5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610951565b5050565b600060208284031215611e9057600080fd5b81356001600160e01b031981168114611ea857600080fd5b9392505050565b600060208284031215611ec157600080fd5b5035919050565b602081526000825180602084015260005b81811015611ef65760208186018101516040868401015201611ed9565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160401b0381168114611db257600080fd5b600060208284031215611f3f57600080fd5b611ea882611f16565b60008083601f840112611f5a57600080fd5b5081356001600160401b03811115611f7157600080fd5b6020830191508360208260051b850101111561191557600080fd5b60008060208385031215611f9f57600080fd5b82356001600160401b03811115611fb557600080fd5b610db285828601611f48565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715611ff957611ff9611fc1565b60405290565b604051606081016001600160401b0381118282101715611ff957611ff9611fc1565b604080519081016001600160401b0381118282101715611ff957611ff9611fc1565b604051601f8201601f191681016001600160401b038111828210171561206b5761206b611fc1565b604052919050565b60006020828403121561208557600080fd5b81356001600160401b0381111561209b57600080fd5b8201601f810184136120ac57600080fd5b80356001600160401b038111156120c5576120c5611fc1565b6120d8601f8201601f1916602001612043565b8181528560208385010111156120ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b6001600160a01b03811681146117ad57600080fd5b6000806040838503121561213357600080fd5b8235915060208301356121458161210b565b809150509250929050565b6000806040838503121561216357600080fd5b61216c83611f16565b946020939093013593505050565b6000806020838503121561218d57600080fd5b82356001600160401b038111156121a357600080fd5b8301601f810185136121b457600080fd5b80356001600160401b038111156121ca57600080fd5b8560208284010111156121dc57600080fd5b6020919091019590945092505050565b81516001600160401b0316815260208083015160070b9082015260408101610693565b602080825282518282018190526000918401906040840190835b818110156122685761225283855180516001600160401b0316825260209081015160070b910152565b6020939093019260409290920191600101612229565b509095945050505050565b6000806040838503121561228657600080fd5b61228f83611f16565b915061229d60208401611f16565b90509250929050565b8035600781900b8114611db257600080fd5b6000602082840312156122ca57600080fd5b81356001600160401b038111156122e057600080fd5b820160a081850312156122f257600080fd5b6122fa611fd7565b8135815261230a60208301611f16565b602082015261231b60408301611f16565b604082015260608201356003811061233257600080fd5b606082015260808201356001600160401b0381111561235057600080fd5b91909101906060828603121561236557600080fd5b61236d611fff565b61237683611f16565b815260208301356001600160401b0381111561239157600080fd5b8301601f810187136123a257600080fd5b80356001600160401b038111156123bb576123bb611fc1565b6123ca60208260051b01612043565b8082825260208201915060208360061b8501019250898311156123ec57600080fd5b6020840193505b8284101561243d576040848b03121561240b57600080fd5b612413612021565b8435815261242360208601611f16565b6020820152808352506020820191506040840193506123f3565b602085015250612452915050604084016122a6565b60408201526080820152949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81036124a6576124a661247a565b60010192915050565b60ff82811682821603908111156106935761069361247a565b60ff81811683821601908111156106935761069361247a565b6000602082840312156124f357600080fd5b8151611ea88161210b565b60006020828403121561251057600080fd5b8135611ea88161210b565b818103818111156106935761069361247a565b80820281158282048414176106935761069361247a565b6000808335601e1984360301811261255c57600080fd5b8301803591506001600160401b0382111561257657600080fd5b60200191503681900382131561191557600080fd5b634e487b7160e01b600052601260045260246000fd5b6000826125b0576125b061258b565b500490565b6000826125c4576125c461258b565b500690565b808201808211156106935761069361247a565b6000816125eb576125eb61247a565b506000190190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052602160045260246000fd5b60006001820161264a5761264a61247a565b506001019056fe01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee41a2646970667358221220ff86173ff68e03c5ce4d2cc9b519d1cf9af268980bfe8fa4f9ccc3ca009b8d2f64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff20
-----Decoded View---------------
Arg [0] : tunnelRouter_ (address): 0x5a3DBDca69d8dF796A517006832A6413Dce2ff20
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a3dbdca69d8df796a517006832a6413dce2ff20
Deployed Bytecode Sourcemap
178:14682:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:0;;;;;;;;;;-1:-1:-1;2565:202:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:12;;463:22;445:41;;433:2;418:18;2565:202:0;;;;;;;;637:588:6;;;;;;;;;;-1:-1:-1;637:588:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1901:185:5:-;;;;;;:::i;:::-;;:::i;:::-;;2990:236;;;;;;;;;;-1:-1:-1;2990:236:5;;;;;:::i;:::-;;:::i;3810:120:0:-;;;;;;;;;;-1:-1:-1;3810:120:0;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;;;;2585:25:12;;;2573:2;2558:18;3810:120:0;2439:177:12;996:313:5;;;;;;;;;;-1:-1:-1;996:313:5;;;;;:::i;:::-;;:::i;4226:136:0:-;;;;;;;;;;-1:-1:-1;4226:136:0;;;;;:::i;:::-;;:::i;5328:245::-;;;;;;;;;;-1:-1:-1;5328:245:0;;;;;:::i;:::-;;:::i;12766:2092:6:-;;;;;;;;;;-1:-1:-1;12766:2092:6;;;;;:::i;:::-;;:::i;7614:260::-;;;;;;;;;;-1:-1:-1;7614:260:6;;;;;:::i;:::-;;:::i;:::-;;;;5710:25:12;;;5766:2;5751:18;;5744:34;;;;5683:18;7614:260:6;5536:248:12;2152:211:5;;;;;;;;;;-1:-1:-1;2152:211:5;;;;;:::i;:::-;;:::i;333:47:6:-;;;;;;;;;;-1:-1:-1;333:47:6;;;;;:::i;:::-;;;;;;;;;;;;;;1291:485;;;;;;;;;;-1:-1:-1;1291:485:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1847:709::-;;;;;;;;;;-1:-1:-1;1847:709:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;350:37:5:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8194:32:12;;;8176:51;;8164:2;8149:18;350:37:5;8030:203:12;7290:318:6;;;;;;;;;;-1:-1:-1;7290:318:6;;;;;:::i;:::-;;:::i;:::-;;;;8408:25:12;;;8481:4;8469:17;;;8464:2;8449:18;;8442:45;8381:18;7290:318:6;8238:255:12;435:36:6;;;;;;;;;;;;;;;;235:39;;;;;;;;;;-1:-1:-1;235:39:6;;;;;:::i;:::-;;;;;;;;;;;;;;1693:143:5;;;;;;;;;;-1:-1:-1;1693:143:5;;;;;:::i;:::-;;:::i;2854:136:0:-;;;;;;;;;;-1:-1:-1;2854:136:0;;;;;:::i;:::-;;:::i;2187:49::-;;;;;;;;;;-1:-1:-1;2187:49:0;2232:4;2187:49;;280:47:6;;;;;;;;;;-1:-1:-1;280:47:6;;;;;:::i;:::-;;;;;;;;;;;;;;1375:250:5;;;;;;:::i;:::-;;:::i;2621:1836:6:-;;;;;;;;;;-1:-1:-1;2621:1836:6;;;;;:::i;:::-;;:::i;387:41::-;;;;;;;;;;;;422:6;387:41;;4642:138:0;;;;;;;;;;-1:-1:-1;4642:138:0;;;;;:::i;:::-;;:::i;11671:1089:6:-;;;;;;;;;;-1:-1:-1;11671:1089:6;;;;;:::i;:::-;;:::i;11555:110::-;;;;;;;;;;-1:-1:-1;11555:110:6;;;;;:::i;:::-;;:::i;469:82:5:-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;469:82:5;;2432:193;;;;;;;;;;-1:-1:-1;2432:193:5;;;;;:::i;:::-;;:::i;2689:234::-;;;;;;;;;;-1:-1:-1;2689:234:5;;;;;:::i;:::-;;:::i;2565:202:0:-;2650:4;-1:-1:-1;;;;;;2673:47:0;;-1:-1:-1;;;2673:47:0;;:87;;-1:-1:-1;;;;;;;;;;861:40:3;;;2724:36:0;2666:94;2565:202;-1:-1:-1;;2565:202:0:o;637:588:6:-;706:13;813:11;838:68;853:2;845:5;:10;;;:27;;;;;859:1;861:5;859:8;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;859:13:6;;845:27;838:68;;;888:7;;;;:::i;:::-;;;;838:68;;;973:5;:11;;982:2;973:11;969:51;;-1:-1:-1;;1000:9:6;;;;;;;;;-1:-1:-1;1000:9:6;;;637:588;-1:-1:-1;637:588:6:o;969:51::-;1029:9;1041:10;1046:5;1041:2;:10;:::i;:::-;1029:22;;1061:16;1090:3;1080:14;;-1:-1:-1;;;;;1080:14:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1080:14:6;;1061:33;;1109:7;1104:78;1126:3;1122:7;;:1;:7;;;1104:78;;;1159:1;1161:9;1169:1;1161:5;:9;:::i;:::-;1159:12;;;;;;;;;:::i;:::-;;;;1150:3;1154:1;1150:6;;;;;;;;;;:::i;:::-;;;;:21;-1:-1:-1;;;;;1150:21:6;;;;;;;;-1:-1:-1;1131:3:6;;1104:78;;;-1:-1:-1;1214:3:6;637:588;-1:-1:-1;;;;637:588:6:o;1901:185:5:-;1962:12;1991;-1:-1:-1;;;;;1977:33:5;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2023:56;;-1:-1:-1;;;2023:56:5;;-1:-1:-1;;;;;12576:31:12;;2023:56:5;;;12558:50:12;2073:4:5;12624:18:12;;;12617:60;1962:50:5;;-1:-1:-1;;;;;;2023:13:5;;;;;2044:9;;12531:18:12;;2023:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:134;1901:185;:::o;2990:236::-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;3107:9:5::1;3102:118;3122:19:::0;;::::1;3102:118;;;3162:47;-1:-1:-1::0;;;;;;;;;;;3197:8:5::1;;3206:1;3197:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3162;:47::i;:::-;-1:-1:-1::0;3143:3:5::1;;3102:118;;;;2990:236:::0;;;:::o;996:313::-;1086:9;1130:2;1117;1111:16;:21;1107:88;;;1181:2;1155:29;;-1:-1:-1;;;1155:29:5;;;;;;;;:::i;:::-;;;;;;;;1107:88;1246:2;1242;1238:11;1232:18;1227:23;;1287:2;1281:16;1276:2;:21;;;;:::i;:::-;1275:27;;1301:1;1275:27;:::i;:::-;1269:33;;996:313;-1:-1:-1;996:313:5:o;4226:136:0:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;5328:245::-:0;-1:-1:-1;;;;;5421:34:0;;735:10:2;5421:34:0;5417:102;;5478:30;;-1:-1:-1;;;5478:30:0;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;12766:2092:6:-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;12887:17:6::1;::::0;12858:26:::1;::::0;;;;;;;;;13138:1665:::1;13158:18:::0;;::::1;13138:1665;;;13197:21;13221:39;13249:7;;13257:1;13249:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;13221:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13221:27:6::1;::::0;-1:-1:-1;;;13221:39:6:i:1;:::-;13274:10;13287:27:::0;;;:12:::1;:27;::::0;;;;;13197:63;;-1:-1:-1;13336:7:6;;;13328:56:::1;;;::::0;-1:-1:-1;;;13328:56:6;;13975:2:12;13328:56:6::1;::::0;::::1;13957:21:12::0;14014:2;13994:18;;;13987:30;14053:34;14033:18;;;14026:62;-1:-1:-1;;;14104:18:12;;;14097:34;14148:19;;13328:56:6::1;13773:400:12::0;13328:56:6::1;13412:32;::::0;;;:12:::1;:32;::::0;;;;;;;;13459:24;;;:12:::1;:24:::0;;;;;:29;;;13502:16;;;;;;;;;;:29;;;13412:32;-1:-1:-1;13583:1:6::1;13557:22;13578:1;13425:18:::0;13557:22:::1;:::i;:::-;13556:28;;;;:::i;:::-;13546:38:::0;-1:-1:-1;13619:1:6::1;13609:6;13614:1;13609:2:::0;:6:::1;:::i;:::-;13608:12;;;;:::i;:::-;13642:13;::::0;;;:4:::1;:13;::::0;;;;;13598:22;;-1:-1:-1;13642:13:6;-1:-1:-1;4740:3:6;4733:10;;;4748:12;4732:29;13669:27;-1:-1:-1;13741:9:6::1;13669:27:::0;13741:1:::1;:9;:::i;:::-;13735:16;::::0;:2:::1;:16;:::i;:::-;13725:27:::0;;::::1;13757:13;13724:47;::::0;-1:-1:-1;13818:1:6::1;13808:6;13813:1;13808:2:::0;:6:::1;:::i;:::-;13807:12;;;;:::i;:::-;13802:18;::::0;:1:::1;:18;:::i;:::-;13796:25;::::0;:2:::1;:25;:::i;:::-;13785:36;;13851:7;13840;:18:::0;13836:763:::1;;13951:23:::0;;::::1;13896:49;13918:13;13917:27:::0;::::1;-1:-1:-1::0;;13896:49:6::1;:::i;:::-;13887:5;:59;13886:89;13878:97;;13836:763;;;14022:13;::::0;;;:4:::1;:13;::::0;;;;;;-1:-1:-1;14103:2:6::1;14088:17:::0;;::::1;14061:23;14078:5:::0;4581:3;4574:10;;4463:157;14061:23:::1;:45;;;;:::i;:::-;14054:52;;14140:23;14157:5;4581:3:::0;4574:10;;4463:157;14140:23:::1;14132:4;:31;;14124:104;;;::::0;-1:-1:-1;;;14124:104:6;;14884:2:12;14124:104:6::1;::::0;::::1;14866:21:12::0;14923:2;14903:18;;;14896:30;14962:34;14942:18;;;14935:62;15033:30;15013:18;;;15006:58;15081:19;;14124:104:6::1;14682:424:12::0;14124:104:6::1;14254:23;14271:5;4581:3:::0;4574:10;;4463:157;14254:23:::1;14246:31;::::0;;::::1;:::i;:::-;;;14310:7;14303:4;:14;14295:67;;;::::0;-1:-1:-1;;;14295:67:6;;15313:2:12;14295:67:6::1;::::0;::::1;15295:21:12::0;15352:2;15332:18;;;15325:30;15391:34;15371:18;;;15364:62;-1:-1:-1;;;15442:18:12;;;15435:38;15490:19;;14295:67:6::1;15111:404:12::0;14295:67:6::1;14425:13;14410:29:::0;;;::::1;14403:2;14395:10:::0;;::::1;14394:46;::::0;14560:23;;::::1;14505:49;14527:13;14526:27:::0;::::1;-1:-1:-1::0;;14505:49:6::1;:::i;:::-;14459:13;::::0;;;:4:::1;:13;::::0;;;;14496:59;;::::1;14495:89:::0;;;::::1;14459:125:::0;;13836:763:::1;14629:26;14638:5:::0;14645:9:::1;14653:1;14645:5:::0;:9:::1;:::i;:::-;14629:8;:26::i;:::-;14613:13;::::0;;;:4:::1;:13;::::0;;;;;;;:42;;;;14677:27;;;:12:::1;:27:::0;;;;;14670:34;;;14725:32;;;:12:::1;:32:::0;;;;;14718:39;14738:18;14772:20:::1;14738:18:::0;14772:20:::1;:::i;:::-;::::0;-1:-1:-1;;13178:3:6::1;::::0;;::::1;::::0;-1:-1:-1;13138:1665:6::1;::::0;-1:-1:-1;13138:1665:6::1;;-1:-1:-1::0;;;14813:17:6::1;:38:::0;;;;-1:-1:-1;;;;;;;;;;12766:2092:6:o;7614:260::-;7675:12;7689:19;7745:12;7759:9;7772:23;7788:6;7772:15;:23::i;:::-;7744:51;;;;7831:26;7847:4;7853:3;7831:15;:26::i;:::-;7809:48;;;;-1:-1:-1;7614:260:6;-1:-1:-1;;;;7614:260:6:o;2152:211:5:-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;2251:12:5::1;2280;-1:-1:-1::0;;;;;2266:33:5::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2312:44;::::0;-1:-1:-1;;;2312:44:5;;-1:-1:-1;;;;;15879:31:12;;2312:44:5::1;::::0;::::1;15861:50:12::0;2337:10:5::1;15927:18:12::0;;;15920:60;15996:18;;;15989:34;;;2251:50:5;;-1:-1:-1;;;;;;2312:14:5;::::1;::::0;::::1;::::0;15834:18:12;;2312:44:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2241:122;2152:211:::0;;;:::o;1291:485:6:-;-1:-1:-1;;;;;;;;;;;;;;;;;1384:12:6;1398:17;1419:54;1434:38;1462:9;;1434:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1434:27:6;;-1:-1:-1;;;1434:38:6:i;1419:54::-;1383:90;;;;1483:12;1498:23;1516:4;1498:17;:23::i;:::-;1553:99;;;;;;;;;-1:-1:-1;;;;;1553:99:6;;;;;;;;;;;;;1483:38;;-1:-1:-1;1553:99:6;1532:18;1667:16;1663:85;;1727:9;;1706:31;;-1:-1:-1;;;1706:31:6;;;;;;;;;:::i;1663:85::-;1764:5;1291:485;-1:-1:-1;;;;;;1291:485:6:o;1847:709::-;1923:14;1949:24;1988:10;-1:-1:-1;;;;;1976:30:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;1976:30:6;;;;;;;;;;;;;;;;1949:57;;2021:6;2016:508;2033:21;;;2016:508;;;2076:12;2090:17;2111:58;2126:42;2154:10;;2165:1;2154:13;;;;;;;:::i;2111:58::-;2075:94;;;;2183:12;2198:23;2216:4;2198:17;:23::i;:::-;2257:111;;;;;;;;;-1:-1:-1;;;;;2257:111:6;;;;;;;;;;;;;2183:38;;-1:-1:-1;2257:111:6;2236:18;2387:16;2383:97;;2451:10;;2462:1;2451:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2430:35;;-1:-1:-1;;;2430:35:6;;;;;;;;;:::i;2383:97::-;2508:5;2493:9;2503:1;2493:12;;;;;;;;:::i;:::-;;;;;;:20;;;;2061:463;;;;2056:3;;;;;;;2016:508;;;-1:-1:-1;2540:9:6;1847:709;-1:-1:-1;;;1847:709:6:o;7290:318::-;7352:12;7424:20;;;:12;:20;;;;;;7352:12;;7462:7;;;7458:77;;7499:35;7527:6;7499:27;:35::i;:::-;7478:57;;-1:-1:-1;;;7478:57:6;;;;;;;;:::i;7458:77::-;7568:1;-1:-1:-1;;7558:6:6;;7557:12;7588:1;-1:-1:-1;;7578:6:6;;7577:12;7549:42;;;;;7290:318;;;:::o;1693:143:5:-;-1:-1:-1;;;;;;;;;;;2464:16:0;2475:4;2464:10;:16::i;:::-;1781:48:5::1;::::0;-1:-1:-1;;;1781:48:5;;-1:-1:-1;;;;;16591:31:12;;1781:48:5::1;::::0;::::1;16573:50:12::0;1795:12:5::1;-1:-1:-1::0;;;;;1781:38:5::1;::::0;::::1;::::0;16546:18:12;;1781:48:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1693:143:::0;;:::o;2854:136:0:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:0;;;;;;;;;;;;;;;2854:136::o;1375:250:5:-;-1:-1:-1;;;;;;;;;;;2464:16:0;2475:4;2464:10;:16::i;:::-;1509:109:5::1;::::0;-1:-1:-1;;;1509:109:5;;-1:-1:-1;;;;;16822:31:12;;;1509:109:5::1;::::0;::::1;16804:50:12::0;16890:31;;16870:18;;;16863:59;1523:12:5::1;-1:-1:-1::0;;;;;1509:36:5::1;::::0;::::1;::::0;1553:9:::1;::::0;16777:18:12;;1509:109:5::1;;;;;;;;;;;;;;;;;::::0;::::1;2621:1836:6::0;600:10:5;-1:-1:-1;;;;;614:12:5;600:26;;596:90;;649:26;;-1:-1:-1;;;649:26:5;;;;;;;;;;;596:90;2787:11:6::1;::::0;::::1;::::0;2817:16:::1;::::0;::::1;::::0;2842:13:::1;2817:39;::::0;;;::::1;;2813:76;;;2865:24;;-1:-1:-1::0;;;2865:24:6::1;;;;;;;;;;;2813:76;2927:30;2907:4;:16;;;:50;;;;;;;;:::i;:::-;;2903:83;;2966:20;;-1:-1:-1::0;;;2966:20:6::1;;;;;;;;;;;2903:83;3031:16;::::0;::::1;::::0;3367:14:::1;::::0;::::1;::::0;:21;3024:24:::1;::::0;;;::::1;::::0;3001:12:::1;::::0;-1:-1:-1;;3110:17:6;3001:12;;;;;;;;-1:-1:-1;;3276:20:6;;;3001:12;;;3403:992:::1;3427:13;3423:1;:17;3403:992;;;3470:12;:38;3483:6;:14;;;3498:1;3483:17;;;;;;;;:::i;:::-;;;;;;;:24;;;3470:38;;;;;;;;;;;;3465:43;;3530:2;3536:1;3530:7:::0;3526:95:::1;;3567:53;3595:6;:14;;;3610:1;3595:17;;;;;;;;:::i;:::-;;;;;;;:24;;;3567:27;:53::i;3526:95::-;-1:-1:-1::0;;3652:6:6;;;-1:-1:-1;3700:1:6::1;3652:6:::0;3687:14:::1;3677:24;;3730:7;3723:3;:14;3719:393;;3765:9:::0;;3761:31:::1;;3776:9;::::0;;;:4:::1;:9;::::0;;;;:16;;;3761:31:::1;3822:13;::::0;;;:4:::1;:13;::::0;;;;;3827:7;;-1:-1:-1;3827:7:6;;3822:13;-1:-1:-1;3900:22:6::1;3822:13:::0;4581:3;4574:10;;4463:157;3900:22:::1;3892:30;;3962:5;3948:11;:19;3944:150;;;4003:11;3995:19;;4047:24;4059:4;4065:5;4047:11;:24::i;:::-;4040:31;;3944:150;4167:1;4154:14:::0;::::1;4148:2;:21;4141:3;:29;::::0;-1:-1:-1;4241:4:6;5133:13;5113:15;;;5112:35;4196:5:::1;:42;:49;4195:185;;4376:4;4195:185;;;4270:82;4293:4;4306:5;4299:4;:12;4313:6;:14;;;4328:1;4313:17;;;;;;;;:::i;:::-;;;;;;;:23;;;-1:-1:-1::0;;;;;4270:82:6::1;4349:2;4338:8;:13;6102::::0;6094:34;;6092:37;6085:45;;;;6167:2;6153:16;;;;6182:13;6174:22;;;6152:45;6151:59;;;6084:127;;5878:350;4270:82:::1;4188:192:::0;-1:-1:-1;3442:3:6::1;;3403:992;;;-1:-1:-1::0;4413:9:6;;4409:31:::1;;4424:9;::::0;;;:4:::1;:9;::::0;;;;:16;;;4409:31:::1;2726:1725;;;;;;;;;;;2621:1836:::0;:::o;4642:138:0:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;11671:1089:6:-:0;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;11761:32:6;;11786:7:::1;11761:32;11832:17;::::0;11803:26:::1;11873:22;11894:1;11832:17:::0;11873:22:::1;:::i;:::-;11905:12;11920:9:::0;;;:4:::1;:9;::::0;;;;;;;-1:-1:-1;4748:12:6;4740:3;4733:10;;;4732:29;;11984:695:::1;12004:18:::0;;::::1;11984:695;;;12043:21;12067:39;12095:7;;12103:1;12095:10;;;;;;;:::i;12067:39::-;12128:27;::::0;;;:12:::1;:27;::::0;;;;;12043:63;;-1:-1:-1;12128:32:6;12120:80:::1;;;::::0;-1:-1:-1;;;12120:80:6;;17267:2:12;12120:80:6::1;::::0;::::1;17249:21:12::0;17306:2;17286:18;;;17279:30;17345:34;17325:18;;;17318:62;-1:-1:-1;;;17396:18:12;;;17389:33;17439:19;;12120:80:6::1;17065:399:12::0;12120:80:6::1;12215:14;12232:22;12253:1;12232:18:::0;:22:::1;:::i;:::-;12215:39:::0;-1:-1:-1;12269:20:6;::::1;::::0;::::1;:::i;:::-;12303:27;::::0;;;:12:::1;:27;::::0;;;;;;;:48;;;12365:32;;;:12:::1;:32:::0;;;;;:48;;;12269:20;-1:-1:-1;;12432:13:6;;::::1;12428:177;;12465:9;::::0;;;:4:::1;:9;::::0;;;;;:16;;;;12537:9;;;;;;;;;;;4740:3;4733:10;;;4748:12;4732:29;12564:26:::1;;12428:177;12619:7:::0;::::1;::::0;::::1;:::i;:::-;;;;12647:21;12656:4;12662:5;12647:8;:21::i;:::-;12640:28:::0;-1:-1:-1;;;12024:3:6::1;;11984:695;;;-1:-1:-1::0;;12689:9:6::1;::::0;;;:4:::1;:9;::::0;;;;;:16;12715:17:::1;:38:::0;11671:1089;;;:::o;11555:110::-;11613:9;11638:20;11656:1;11638:17;:20::i;2432:193:5:-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;2518:12:5::1;2547;-1:-1:-1::0;;;;;2533:33:5::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2579:39;::::0;-1:-1:-1;;;2579:39:5;;-1:-1:-1;;;;;12576:31:12;;2579:39:5::1;::::0;::::1;12558:50:12::0;2607:10:5::1;12624:18:12::0;;;12617:60;2518:50:5;;-1:-1:-1;;;;;;2579:17:5;::::1;::::0;::::1;::::0;12531:18:12;;2579:39:5::1;;;;;;;;;;;;;;;;;::::0;::::1;2689:234:::0;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;2805:9:5::1;2800:117;2820:19:::0;;::::1;2800:117;;;2860:46;-1:-1:-1::0;;;;;;;;;;;2894:8:5::1;;2903:1;2894:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2860:10;:46::i;:::-;-1:-1:-1::0;2841:3:5::1;;2800:117;;3199:103:0::0;3265:30;3276:4;735:10:2;3265::0;:30::i;:::-;3199:103;:::o;6730:317::-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:0;;;;;;;;;;:37;;-1:-1:-1;;6866:37:0;;;6922:40;735:10:2;;6866:12:0;;6922:40;;6898:5;6922:40;-1:-1:-1;6983:4:0;6976:11;;6824:217;-1:-1:-1;7025:5:0;7018:12;;6179:316;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:0;;;;;;;;;:36;;-1:-1:-1;;6315:36:0;6347:4;6315:36;;;6397:12;735:10:2;;656:96;6397:12:0;-1:-1:-1;;;;;6370:40:0;6388:7;-1:-1:-1;;;;;6370:40:0;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:0;6424:11;;5368:237:6;-1:-1:-1;;;;;;;;5525:2:6;5531:1;:8;;;5525:15;5503:38;5502:68;5495:76;;;;5584:3;5576:11;;;;5494:94;;5368:237::o;6920:364::-;6992:12;7076:10;;;:4;:10;;;;;;6992:12;;7125:2;7119:8;;7100:27;;7184:3;:14;;;4915:15;;;4935:13;4914:35;7244:22;7261:4;4581:3;4574:10;;4463:157;7244:22;7226:3;:14;;;5113:15;;;5133:13;5112:35;7201:65;7141:126;;;;;;6920:364;;;;;;:::o;7880:3669::-;7940:9;7989:1;7994;7989:6;7985:20;;-1:-1:-1;8004:1:6;;7880:3669;-1:-1:-1;7880:3669:6:o;7985:20::-;-1:-1:-1;;;;422:6:6;8074:12;;8070:3463;;;8121:1;422:6;8110:12;8106:16;;8144:1;8148:4;8144:8;8156:1;8144:13;8140:69;;8168:33;8164:37;8206:3;8163:46;8140:69;8235:4;8231:8;;:13;8227:69;;8255:33;8251:37;8293:3;8250:46;8227:69;8322:4;8318:8;;:13;8314:69;;8342:33;8338:37;8380:3;8337:46;8314:69;8409:4;8405:8;;:13;8401:69;;8429:33;8425:37;8467:3;8424:46;8401:69;8496:4;8492:8;;:13;8488:69;;8516:33;8512:37;8554:3;8511:46;8488:69;8583:4;8579:8;;:13;8575:69;;8603:33;8599:37;8641:3;8598:46;8575:69;8670:4;8666:8;;:13;8662:69;;8690:33;8686:37;8728:3;8685:46;8662:69;8757:4;8753:8;;:13;8749:69;;8777:33;8773:37;8815:3;8772:46;8749:69;8844:6;8840:10;;:15;8836:71;;8866:33;8862:37;8904:3;8861:46;8836:71;8933:6;8929:10;;:15;8925:71;;8955:33;8951:37;8993:3;8950:46;8925:71;9022:6;9018:10;;:15;9014:71;;9044:33;9040:37;9082:3;9039:46;9014:71;9111:6;9107:10;;:15;9103:71;;9133:33;9129:37;9171:3;9128:46;9103:71;9200:6;9196:10;;:15;9192:71;;9222:33;9218:37;9260:3;9217:46;9192:71;9289:6;9285:10;;:15;9281:72;;9311:34;9307:38;9350:3;9306:47;9281:72;9379:6;9375:10;;:15;9371:72;;9401:34;9397:38;9440:3;9396:47;9371:72;9469:6;9465:10;;:15;9461:73;;9491:35;9487:39;9531:3;9486:48;9461:73;9560:8;9556:12;;:17;9552:76;;9584:36;9580:40;9625:3;9579:49;9552:76;9654:8;9650:12;;:17;9646:79;;9678:39;9674:43;9722:3;9673:52;9646:79;9792:1;-1:-1:-1;;;9747:46:6;;;;;:::i;:::-;;;7880:3669;-1:-1:-1;;7880:3669:6:o;8070:3463::-;-1:-1:-1;;9836:12:6;;;;9874:4;9870:8;;:13;9866:69;;9894:33;9890:37;9932:3;9889:46;9866:69;9961:4;9957:8;;:13;9953:69;;9981:33;9977:37;10019:3;9976:46;9953:69;10048:4;10044:8;;:13;10040:69;;10068:33;10064:37;10106:3;10063:46;10040:69;10135:4;10131:8;;:13;10127:69;;10155:33;10151:37;10193:3;10150:46;10127:69;10222:4;10218:8;;:13;10214:69;;10242:33;10238:37;10280:3;10237:46;10214:69;10309:4;10305:8;;:13;10301:69;;10329:33;10325:37;10367:3;10324:46;10301:69;10396:4;10392:8;;:13;10388:69;;10416:33;10412:37;10454:3;10411:46;10388:69;10483:4;10479:8;;:13;10475:69;;10503:33;10499:37;10541:3;10498:46;10475:69;10570:6;10566:10;;:15;10562:71;;10592:33;10588:37;10630:3;10587:46;10562:71;10659:6;10655:10;;:15;10651:71;;10681:33;10677:37;10719:3;10676:46;10651:71;10748:6;10744:10;;:15;10740:71;;10770:33;10766:37;10808:3;10765:46;10740:71;10837:6;10833:10;;:15;10829:71;;10859:33;10855:37;10897:3;10854:46;10829:71;10926:6;10922:10;;:15;10918:71;;10948:33;10944:37;10986:3;10943:46;10918:71;11015:6;11011:10;;:15;11007:72;;11037:34;11033:38;11076:3;11032:47;11007:72;11105:6;11101:10;;:15;11097:72;;11127:34;11123:38;11166:3;11122:47;11097:72;11195:6;11191:10;;:15;11187:73;;11217:35;11213:39;11257:3;11212:48;11187:73;11286:8;11282:12;;:17;11278:76;;11310:36;11306:40;11351:3;11305:49;11278:76;11380:8;11376:12;;:17;11372:79;;11404:39;11400:43;11448:3;11399:52;11372:79;-1:-1:-1;;;11478:3:6;11474:7;;11473:45;11469:49;;8070:3463;7880:3669;;;:::o;6234:680::-;6304:14;6354:13;6370:21;6387:3;4581;4574:10;;4463:157;6370:21;6354:37;-1:-1:-1;4748:12:6;4740:3;4733:10;;;4732:29;6405:13;;6482:374;6506:5;6502:1;:9;6482:374;;;6554:2;:6;;6547:3;:14;;-1:-1:-1;5133:13:6;5113:15;;;5112:35;6658:18;;;:25;-1:-1:-1;6657:184:6;;6800:18;;;:25;;;5824:29;;5785:13;5777:41;;5775:44;5769:50;;5768:86;6657:184;;;6102:13;-1:-1:-1;;6742:13:6;;6094:34;6092:37;6085:45;;6708:48;6651:190;-1:-1:-1;;6513:3:6;;6482:374;;;-1:-1:-1;5341:3:6;5333:11;;;-1:-1:-1;;;;;5297:31:6;;5296:49;6869:28;6234:680;-1:-1:-1;;;;;;6234:680:6:o;3432:197:0:-;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:0;;-1:-1:-1;;;;;17801:32:12;;3565:47:0;;;17783:51:12;17850:18;;;17843:34;;;17756:18;;3565:47:0;17609:274:12;3515:108:0;3432:197;;:::o;14:286:12:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:12;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:12:o;497:226::-;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;-1:-1:-1;670:23:12;;497:226;-1:-1:-1;497:226:12:o;728:527::-;877:2;866:9;859:21;840:4;909:6;903:13;952:6;947:2;936:9;932:18;925:34;977:1;987:140;1001:6;998:1;995:13;987:140;;;1112:2;1096:14;;;1092:23;;1086:30;1081:2;1062:17;;;1058:26;1051:66;1016:10;987:140;;;991:3;1176:1;1171:2;1162:6;1151:9;1147:22;1143:31;1136:42;1246:2;1239;1235:7;1230:2;1222:6;1218:15;1214:29;1203:9;1199:45;1195:54;1187:62;;;728:527;;;;:::o;1260:171::-;1327:20;;-1:-1:-1;;;;;1376:30:12;;1366:41;;1356:69;;1421:1;1418;1411:12;1436:184;1494:6;1547:2;1535:9;1526:7;1522:23;1518:32;1515:52;;;1563:1;1560;1553:12;1515:52;1586:28;1604:9;1586:28;:::i;1625:367::-;1688:8;1698:6;1752:3;1745:4;1737:6;1733:17;1729:27;1719:55;;1770:1;1767;1760:12;1719:55;-1:-1:-1;1793:20:12;;-1:-1:-1;;;;;1825:30:12;;1822:50;;;1868:1;1865;1858:12;1822:50;1905:4;1897:6;1893:17;1881:29;;1965:3;1958:4;1948:6;1945:1;1941:14;1933:6;1929:27;1925:38;1922:47;1919:67;;;1982:1;1979;1972:12;1997:437;2083:6;2091;2144:2;2132:9;2123:7;2119:23;2115:32;2112:52;;;2160:1;2157;2150:12;2112:52;2200:9;2187:23;-1:-1:-1;;;;;2225:6:12;2222:30;2219:50;;;2265:1;2262;2255:12;2219:50;2304:70;2366:7;2357:6;2346:9;2342:22;2304:70;:::i;2621:127::-;2682:10;2677:3;2673:20;2670:1;2663:31;2713:4;2710:1;2703:15;2737:4;2734:1;2727:15;2753:253;2825:2;2819:9;2867:4;2855:17;;-1:-1:-1;;;;;2887:34:12;;2923:22;;;2884:62;2881:88;;;2949:18;;:::i;:::-;2985:2;2978:22;2753:253;:::o;3011:251::-;3083:2;3077:9;3125:2;3113:15;;-1:-1:-1;;;;;3143:34:12;;3179:22;;;3140:62;3137:88;;;3205:18;;:::i;3267:251::-;3339:2;3333:9;;;3369:15;;-1:-1:-1;;;;;3399:34:12;;3435:22;;;3396:62;3393:88;;;3461:18;;:::i;3523:275::-;3594:2;3588:9;3659:2;3640:13;;-1:-1:-1;;3636:27:12;3624:40;;-1:-1:-1;;;;;3679:34:12;;3715:22;;;3676:62;3673:88;;;3741:18;;:::i;:::-;3777:2;3770:22;3523:275;;-1:-1:-1;3523:275:12:o;3803:766::-;3872:6;3925:2;3913:9;3904:7;3900:23;3896:32;3893:52;;;3941:1;3938;3931:12;3893:52;3981:9;3968:23;-1:-1:-1;;;;;4006:6:12;4003:30;4000:50;;;4046:1;4043;4036:12;4000:50;4069:22;;4122:4;4114:13;;4110:27;-1:-1:-1;4100:55:12;;4151:1;4148;4141:12;4100:55;4191:2;4178:16;-1:-1:-1;;;;;4209:6:12;4206:30;4203:56;;;4239:18;;:::i;:::-;4281:57;4328:2;4305:17;;-1:-1:-1;;4301:31:12;4334:2;4297:40;4281:57;:::i;:::-;4361:6;4354:5;4347:21;4409:7;4404:2;4395:6;4391:2;4387:15;4383:24;4380:37;4377:57;;;4430:1;4427;4420:12;4377:57;4485:6;4480:2;4476;4472:11;4467:2;4460:5;4456:14;4443:49;4537:1;4512:18;;;4532:2;4508:27;4501:38;;;;4516:5;3803:766;-1:-1:-1;;;;3803:766:12:o;4574:131::-;-1:-1:-1;;;;;4649:31:12;;4639:42;;4629:70;;4695:1;4692;4685:12;4710:367;4778:6;4786;4839:2;4827:9;4818:7;4814:23;4810:32;4807:52;;;4855:1;4852;4845:12;4807:52;4900:23;;;-1:-1:-1;4999:2:12;4984:18;;4971:32;5012:33;4971:32;5012:33;:::i;:::-;5064:7;5054:17;;;4710:367;;;;;:::o;5789:298::-;5856:6;5864;5917:2;5905:9;5896:7;5892:23;5888:32;5885:52;;;5933:1;5930;5923:12;5885:52;5956:28;5974:9;5956:28;:::i;:::-;5946:38;6053:2;6038:18;;;;6025:32;;-1:-1:-1;;;5789:298:12:o;6323:587::-;6394:6;6402;6455:2;6443:9;6434:7;6430:23;6426:32;6423:52;;;6471:1;6468;6461:12;6423:52;6511:9;6498:23;-1:-1:-1;;;;;6536:6:12;6533:30;6530:50;;;6576:1;6573;6566:12;6530:50;6599:22;;6652:4;6644:13;;6640:27;-1:-1:-1;6630:55:12;;6681:1;6678;6671:12;6630:55;6721:2;6708:16;-1:-1:-1;;;;;6739:6:12;6736:30;6733:50;;;6779:1;6776;6769:12;6733:50;6824:7;6819:2;6810:6;6806:2;6802:15;6798:24;6795:37;6792:57;;;6845:1;6842;6835:12;6792:57;6876:2;6868:11;;;;;6898:6;;-1:-1:-1;6323:587:12;-1:-1:-1;;;6323:587:12:o;7106:240::-;6990:12;;-1:-1:-1;;;;;6986:37:12;6974:50;;7087:4;7076:16;;;7070:23;7067:1;7056:38;7040:14;;;7033:62;7286:2;7271:18;;7298:42;6915:186;7351:674;7587:2;7599:21;;;7669:13;;7572:18;;;7691:22;;;7539:4;;7770:15;;;7744:2;7729:18;;;7539:4;7813:186;7827:6;7824:1;7821:13;7813:186;;;7876:43;7915:3;7906:6;7900:13;6990:12;;-1:-1:-1;;;;;6986:37:12;6974:50;;7087:4;7076:16;;;7070:23;7067:1;7056:38;7040:14;;7033:62;6915:186;7876:43;7986:2;7974:15;;;;;7948:2;7939:12;;;;;7849:1;7842:9;7813:186;;;-1:-1:-1;8016:3:12;;7351:674;-1:-1:-1;;;;;7351:674:12:o;8680:256::-;8746:6;8754;8807:2;8795:9;8786:7;8782:23;8778:32;8775:52;;;8823:1;8820;8813:12;8775:52;8846:28;8864:9;8846:28;:::i;:::-;8836:38;;8893:37;8926:2;8915:9;8911:18;8893:37;:::i;:::-;8883:47;;8680:256;;;;;:::o;8941:160::-;9007:20;;9067:1;9056:20;;;9046:31;;9036:59;;9091:1;9088;9081:12;9106:2251;9193:6;9246:2;9234:9;9225:7;9221:23;9217:32;9214:52;;;9262:1;9259;9252:12;9214:52;9302:9;9289:23;-1:-1:-1;;;;;9327:6:12;9324:30;9321:50;;;9367:1;9364;9357:12;9321:50;9390:22;;9446:4;9428:16;;;9424:27;9421:47;;;9464:1;9461;9454:12;9421:47;9490:22;;:::i;:::-;9557:16;;9582:22;;9636:30;9662:2;9654:11;;9636:30;:::i;:::-;9631:2;9624:5;9620:14;9613:54;9699:30;9725:2;9721;9717:11;9699:30;:::i;:::-;9694:2;9687:5;9683:14;9676:54;9775:2;9771;9767:11;9754:25;9810:1;9801:7;9798:14;9788:42;;9826:1;9823;9816:12;9788:42;9857:2;9846:14;;9839:31;9916:3;9908:12;;9895:26;-1:-1:-1;;;;;9933:32:12;;9930:52;;;9978:1;9975;9968:12;9930:52;10001:17;;;;;10052:2;10034:16;;;10030:25;10027:45;;;10068:1;10065;10058:12;10027:45;10096:22;;:::i;:::-;10143:21;10161:2;10143:21;:::i;:::-;10134:7;10127:38;10211:2;10207;10203:11;10190:25;-1:-1:-1;;;;;10230:8:12;10227:32;10224:52;;;10272:1;10269;10262:12;10224:52;10295:17;;10343:4;10335:13;;10331:27;-1:-1:-1;10321:55:12;;10372:1;10369;10362:12;10321:55;10412:2;10399:16;-1:-1:-1;;;;;10430:6:12;10427:30;10424:56;;;10460:18;;:::i;:::-;10500:40;10536:2;10527:6;10524:1;10520:14;10516:23;10500:40;:::i;:::-;10562:3;10586:6;10581:3;10574:19;10618:2;10613:3;10609:12;10602:19;;10673:2;10663:6;10660:1;10656:14;10652:2;10648:23;10644:32;10630:46;;10699:7;10691:6;10688:19;10685:39;;;10720:1;10717;10710:12;10685:39;10752:2;10748;10744:11;10733:22;;10764:418;10780:6;10775:3;10772:15;10764:418;;;10860:2;10854:3;10845:7;10841:17;10837:26;10834:46;;;10876:1;10873;10866:12;10834:46;10908:22;;:::i;:::-;10983:17;;11013:24;;11075:31;11102:2;11093:12;;11075:31;:::i;:::-;11070:2;11061:7;11057:16;11050:57;11132:7;11127:3;11120:20;;11169:2;11164:3;11160:12;11153:19;;10806:2;10801:3;10797:12;10790:19;;10764:418;;;11211:2;11198:16;;11191:31;-1:-1:-1;11256:29:12;;-1:-1:-1;;11281:2:12;11273:11;;11256:29;:::i;:::-;11251:2;11238:16;;11231:55;11313:3;11302:15;;11295:32;11306:5;9106:2251;-1:-1:-1;;;;9106:2251:12:o;11362:127::-;11423:10;11418:3;11414:20;11411:1;11404:31;11454:4;11451:1;11444:15;11478:4;11475:1;11468:15;11494:127;11555:10;11550:3;11546:20;11543:1;11536:31;11586:4;11583:1;11576:15;11610:4;11607:1;11600:15;11626:175;11663:3;11707:4;11700:5;11696:16;11736:4;11727:7;11724:17;11721:43;;11744:18;;:::i;:::-;11793:1;11780:15;;11626:175;-1:-1:-1;;11626:175:12:o;11806:151::-;11896:4;11889:12;;;11875;;;11871:31;;11914:14;;11911:40;;;11931:18;;:::i;11962:148::-;12050:4;12029:12;;;12043;;;12025:31;;12068:13;;12065:39;;;12084:18;;:::i;12115:266::-;12200:6;12253:2;12241:9;12232:7;12228:23;12224:32;12221:52;;;12269:1;12266;12259:12;12221:52;12301:9;12295:16;12320:31;12345:5;12320:31;:::i;12688:247::-;12747:6;12800:2;12788:9;12779:7;12775:23;12771:32;12768:52;;;12816:1;12813;12806:12;12768:52;12855:9;12842:23;12874:31;12899:5;12874:31;:::i;12940:128::-;13007:9;;;13028:11;;;13025:37;;;13042:18;;:::i;13073:168::-;13146:9;;;13177;;13194:15;;;13188:22;;13174:37;13164:71;;13215:18;;:::i;13246:522::-;13324:4;13330:6;13390:11;13377:25;13484:2;13480:7;13469:8;13453:14;13449:29;13445:43;13425:18;13421:68;13411:96;;13503:1;13500;13493:12;13411:96;13530:33;;13582:20;;;-1:-1:-1;;;;;;13614:30:12;;13611:50;;;13657:1;13654;13647:12;13611:50;13690:4;13678:17;;-1:-1:-1;13721:14:12;13717:27;;;13707:38;;13704:58;;;13758:1;13755;13748:12;14178:127;14239:10;14234:3;14230:20;14227:1;14220:31;14270:4;14267:1;14260:15;14294:4;14291:1;14284:15;14310:120;14350:1;14376;14366:35;;14381:18;;:::i;:::-;-1:-1:-1;14415:9:12;;14310:120::o;14435:112::-;14467:1;14493;14483:35;;14498:18;;:::i;:::-;-1:-1:-1;14532:9:12;;14435:112::o;14552:125::-;14617:9;;;14638:10;;;14635:36;;;14651:18;;:::i;15520:136::-;15559:3;15587:5;15577:39;;15596:18;;:::i;:::-;-1:-1:-1;;;15632:18:12;;15520:136::o;16034:390::-;16193:2;16182:9;16175:21;16232:6;16227:2;16216:9;16212:18;16205:34;16289:6;16281;16276:2;16265:9;16261:18;16248:48;16345:1;16316:22;;;16340:2;16312:31;;;16305:42;;;;16408:2;16387:15;;;-1:-1:-1;;16383:29:12;16368:45;16364:54;;16034:390;-1:-1:-1;16034:390:12:o;16933:127::-;16994:10;16989:3;16985:20;16982:1;16975:31;17025:4;17022:1;17015:15;17049:4;17046:1;17039:15;17469:135;17508:3;17529:17;;;17526:43;;17549:18;;:::i;:::-;-1:-1:-1;17596:1:12;17585:13;;17469:135::o
Swarm Source
ipfs://ff86173ff68e03c5ce4d2cc9b519d1cf9af268980bfe8fa4f9ccc3ca009b8d2f
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.