Token Matic Token
This token is updated based on the Solarbeam's website.
Overview ERC20
Price
$0.93 @ 0.141125 MOVR (+0.79%)
Fully Diluted Market Cap
Total Supply:
59,617.384755 MATIC
Holders:
358 addresses
Transfers:
-
Contract:
Decimals:
18
Official Site:
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
Bridged MATIC Token of RelayChain.Market
Volume (24H) | : | $251,467,905.00 |
Market Capitalization | : | $8,620,692,293.00 |
Circulating Supply | : | 9,279,469,069.00 MATIC |
Market Data Source: Coinmarketcap |
Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | ![]() | MATIC-USDT | $0.9288 0.0000333 Btc | $44,764,253.00 48,193,520.129 MATIC | 29.3104% |
2 | ![]() | MATIC-USD | $0.9298 0.0000334 Btc | $11,371,979.00 12,230,564.500 MATIC | 7.4384% |
3 | ![]() | MATIC-BUSD | $0.9286 0.0000333 Btc | $8,107,073.00 8,730,729.450 MATIC | 5.3099% |
4 | ![]() | MATIC-USDT | $0.9285 0.0000333 Btc | $7,029,306.00 7,546,859.514 MATIC | 4.5899% |
5 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $4,394,511.00 4,713,089.430 MATIC | 2.8664% |
6 | ![]() | MATIC-USDT | $0.9295 0.0000333 Btc | $4,351,353.00 4,637,076.738 MATIC | 2.8202% |
7 | ![]() | MATIC-KRW | $0.9407 0.0000337 Btc | $4,327,311.00 4,599,899.136 MATIC | 2.7976% |
8 | ![]() | MATIC-BTC | $0.9293 0.0000333 Btc | $4,266,311.00 4,591,131.614 MATIC | 2.7922% |
9 | ![]() | MATIC-USDT | $0.9284 0.0000333 Btc | $3,922,976.00 4,200,790.500 MATIC | 2.5548% |
10 | ![]() | MATIC-USDT | $0.9289 0.0000333 Btc | $3,874,540.00 4,171,289.098 MATIC | 2.5369% |
11 | ![]() | MATIC-USDT | $0.9294 0.0000333 Btc | $3,688,799.00 3,970,118.700 MATIC | 2.4146% |
12 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $3,145,649.00 3,387,632.868 MATIC | 2.0603% |
13 | ![]() | MATIC-USDT | $0.9296 0.0000333 Btc | $2,871,653.00 3,089,033.030 MATIC | 1.8787% |
14 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $2,666,112.00 2,871,259.060 MATIC | 1.7462% |
15 | ![]() | MATIC-USDT | $0.9297 0.0000333 Btc | $2,533,449.00 2,712,682.079 MATIC | 1.6498% |
16 | ![]() | MATIC-USD | $0.9314 0.0000334 Btc | $2,400,131.00 2,576,906.502 MATIC | 1.5672% |
17 | ![]() | MATIC-BUSD | $0.929 0.0000333 Btc | $2,314,925.00 2,491,731.374 MATIC | 1.5154% |
18 | ![]() | MATIC-USDT | $0.929 0.0000333 Btc | $2,264,511.00 2,437,452.100 MATIC | 1.4824% |
19 | ![]() | MATIC-USDT | $0.9285 0.0000333 Btc | $2,135,882.00 2,300,447.033 MATIC | 1.3991% |
20 | ![]() | MATIC-USDT | $0.9284 0.0000333 Btc | $1,792,063.00 1,930,356.000 MATIC | 1.1740% |
21 | ![]() | MATIC-USD | $0.929 0.0000333 Btc | $1,783,247.00 1,919,533.950 MATIC | 1.1674% |
22 | ![]() | MATIC-BTC | $0.9286 0.0000333 Btc | $1,782,090.00 1,919,200.137 MATIC | 1.1672% |
23 | ![]() | MATIC-ETH | $0.9288 0.0000333 Btc | $1,504,065.00 1,619,305.838 MATIC | 0.9848% |
24 | ![]() | MATIC-USDT | $0.9298 0.0000333 Btc | $1,334,077.00 1,427,670.679 MATIC | 0.8683% |
25 | ![]() | MATIC-USDT | $0.9308 0.0000334 Btc | $1,292,095.00 1,387,072.051 MATIC | 0.8436% |
26 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $1,111,348.00 1,189,841.100 MATIC | 0.7236% |
27 | ![]() | 0X7D1AFA7B718FB893DB30A3ABC0CFC608AACFEBB0-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $0.9302 0.0000334 Btc | $1,101,404.00 1,168,989.948 0X7D1AFA7B718FB893DB30A3ABC0CFC608AACFEBB0 | 0.7110% |
28 | ![]() | MATIC-USD | $0.93 0.0000333 Btc | $1,082,289.00 1,163,726.223 MATIC | 0.7078% |
29 | ![]() | MATIC-USDT | $0.9285 0.0000333 Btc | $1,028,844.00 1,108,119.669 MATIC | 0.6739% |
30 | ![]() | MATIC-USDT | $0.9275 0.0000333 Btc | $1,024,907.00 1,104,971.779 MATIC | 0.6720% |
31 | ![]() | MATIC-USDT | $0.9278 0.0000333 Btc | $972,772.00 1,042,181.087 MATIC | 0.6338% |
32 | ![]() | 0X3A58A54C066FDC0F2D55FC9C89F0415C92EBF3C4-MATIC | $0.9286 0.0000333 Btc | $917,114.00 920,529.269 0X3A58A54C066FDC0F2D55FC9C89F0415C92EBF3C4 | 0.5598% |
33 | ![]() | MATIC-USDT | $0.9288 0.0000333 Btc | $870,497.00 932,793.000 MATIC | 0.5673% |
34 | ![]() | MATIC-USDT | $0.9274 0.0000333 Btc | $727,073.00 784,024.700 MATIC | 0.4768% |
35 | ![]() | MATIC-USDT | $0.9291 0.0000333 Btc | $720,043.00 770,318.564 MATIC | 0.4685% |
36 | ![]() | MATIC-ETH | $0.9283 0.0000333 Btc | $719,261.00 774,784.488 MATIC | 0.4712% |
37 | ![]() | MATIC-EUR | $0.9305 0.0000334 Btc | $706,456.00 759,218.492 MATIC | 0.4617% |
38 | ![]() | MATIC-USD | $0.9299 0.0000334 Btc | $682,016.00 733,406.242 MATIC | 0.4460% |
39 | ![]() | MATIC-TRY | $0.9647 0.0000346 Btc | $639,120.00 662,527.331 MATIC | 0.4029% |
40 | ![]() | MATIC-EUR | $0.9288 0.0000333 Btc | $629,546.00 677,836.088 MATIC | 0.4122% |
41 | ![]() | MATIC-USDT | $0.9281 0.0000333 Btc | $620,849.00 668,976.000 MATIC | 0.4069% |
42 | ![]() | MATIC-USD | $0.9299 0.0000333 Btc | $615,703.00 662,117.514 MATIC | 0.4027% |
43 | ![]() | MATIC-USD | $0.93 0.0000333 Btc | $492,850.00 529,929.000 MATIC | 0.3223% |
44 | ![]() | MATIC-USDC | $0.9301 0.0000333 Btc | $457,600.00 491,687.700 MATIC | 0.2990% |
45 | ![]() | MATIC-KRW | $0.9362 0.0000335 Btc | $437,268.00 467,063.844 MATIC | 0.2841% |
46 | ![]() | MATIC-USDT | $0.9284 0.0000333 Btc | $422,050.00 454,615.060 MATIC | 0.2765% |
47 | ![]() | MATIC-USDT | $0.901 0.0000323 Btc | $413,630.00 459,083.344 MATIC | 0.2792% |
48 | ![]() | MATIC-USDT | $0.9284 0.0000333 Btc | $405,141.00 433,422.140 MATIC | 0.2636% |
49 | ![]() | MATIC-USDT | $0.929 0.0000333 Btc | $400,029.00 428,274.100 MATIC | 0.2605% |
50 | ![]() | MATIC-USDT | $0.9283 0.0000333 Btc | $349,503.00 376,506.510 MATIC | 0.2290% |
51 | ![]() | MATIC-EUR | $0.929 0.0000333 Btc | $346,109.00 372,579.576 MATIC | 0.2266% |
52 | ![]() | MATIC-TRY | $0.962 0.0000345 Btc | $283,342.00 294,539.891 MATIC | 0.1791% |
53 | ![]() | MATIC-USDC | $0.9286 0.0000333 Btc | $273,313.00 289,928.634 MATIC | 0.1763% |
54 | ![]() | MATIC-THB | $0.9215 0.0000330 Btc | $270,472.00 293,497.668 MATIC | 0.1785% |
55 | ![]() | MATIC-USDT | $0.9283 0.0000333 Btc | $256,099.00 274,525.800 MATIC | 0.1670% |
56 | ![]() | MATIC-TUSD | $0.9289 0.0000333 Btc | $250,551.00 269,743.318 MATIC | 0.1641% |
57 | ![]() | MATIC-INR | $1.17 0.0000418 Btc | $239,607.00 205,539.660 MATIC | 0.1250% |
58 | ![]() | MATIC-BNB | $0.9298 0.0000333 Btc | $233,305.00 250,918.879 MATIC | 0.1526% |
59 | ![]() | MATIC-USDT | $0.927 0.0000332 Btc | $220,168.00 237,508.038 MATIC | 0.1444% |
60 | ![]() | MATIC-USDT | $0.9276 0.0000333 Btc | $208,019.00 224,243.350 MATIC | 0.1364% |
61 | ![]() | MATIC-USDT | $0.9291 0.0000333 Btc | $196,732.00 211,743.100 MATIC | 0.1288% |
62 | ![]() | MATIC-EUR | $0.929 0.0000333 Btc | $171,199.00 184,288.500 MATIC | 0.1121% |
63 | ![]() | MATIC-USD | $0.9304 0.0000333 Btc | $170,862.00 183,639.585 MATIC | 0.1117% |
64 | ![]() | MATIC-USDT | $0.9296 0.0000333 Btc | $161,800.00 174,051.983 MATIC | 0.1059% |
65 | ![]() | MATIC-USDT | $0.9277 0.0000333 Btc | $152,570.00 164,466.492 MATIC | 0.1000% |
66 | ![]() | MATIC-JPY | $0.9299 0.0000334 Btc | $131,546.00 141,468.576 MATIC | 0.0860% |
67 | ![]() | MATIC-GBP | $0.9307 0.0000334 Btc | $120,935.00 129,934.900 MATIC | 0.0790% |
68 | ![]() | MATIC-USD | $0.9295 0.0000333 Btc | $116,764.00 125,615.666 MATIC | 0.0764% |
69 | ![]() | MATIC-BTC | $0.9297 0.0000333 Btc | $113,560.00 121,441.000 MATIC | 0.0739% |
70 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $113,436.00 121,691.009 MATIC | 0.0740% |
71 | ![]() | MATIC-BUSD | $0.9295 0.0000333 Btc | $110,488.00 118,864.829 MATIC | 0.0723% |
72 | ![]() | MATIC-BTC | $0.9288 0.0000333 Btc | $102,494.00 110,350.100 MATIC | 0.0671% |
73 | ![]() | MATIC-BTC | $0.9288 0.0000333 Btc | $101,877.00 109,691.708 MATIC | 0.0667% |
74 | ![]() | MATIC-BTC | $0.9283 0.0000333 Btc | $89,532.00 96,451.838 MATIC | 0.0587% |
75 | ![]() | MATIC-EUR | $0.9281 0.0000333 Btc | $88,081.00 94,903.442 MATIC | 0.0577% |
76 | ![]() | MATIC-XT | $0.929 0.0000333 Btc | $84,176.00 90,651.760 MATIC | 0.0551% |
77 | ![]() | MATIC-USDC | $0.9287 0.0000333 Btc | $82,668.00 89,013.200 MATIC | 0.0541% |
78 | ![]() | MATIC-USDT | $0.9315 0.0000334 Btc | $81,132.00 87,165.200 MATIC | 0.0530% |
79 | ![]() | MATIC-USDC | $0.9288 0.0000333 Btc | $78,849.00 84,503.110 MATIC | 0.0514% |
80 | ![]() | MATIC-BUSD | $0.9289 0.0000333 Btc | $70,431.00 75,304.503 MATIC | 0.0458% |
81 | ![]() | MATIC-USDC | $0.9302 0.0000333 Btc | $69,321.00 74,524.390 MATIC | 0.0453% |
82 | ![]() | MATIC-USDC | $0.9281 0.0000333 Btc | $68,154.00 73,431.887 MATIC | 0.0447% |
83 | ![]() | MATIC-BTC | $0.9293 0.0000333 Btc | $64,941.00 69,885.885 MATIC | 0.0425% |
84 | ![]() | MATIC-USDT | $0.9288 0.0000333 Btc | $55,643.00 59,905.630 MATIC | 0.0364% |
85 | ![]() | MATIC-USDT | $0.9286 0.0000333 Btc | $55,390.00 59,652.156 MATIC | 0.0363% |
86 | ![]() | MATIC-USD | $0.9297 0.0000333 Btc | $54,365.00 58,476.318 MATIC | 0.0356% |
87 | ![]() | MATIC-USDT | $0.9284 0.0000333 Btc | $53,286.00 56,962.359 MATIC | 0.0346% |
88 | ![]() | MATIC-BTC | $0.9285 0.0000333 Btc | $46,962.00 50,579.338 MATIC | 0.0308% |
89 | ![]() | MATIC-ETH | $0.9296 0.0000333 Btc | $45,069.00 48,483.453 MATIC | 0.0295% |
90 | ![]() | MATIC-IDR | $0.9284 0.0000333 Btc | $44,296.00 47,712.229 MATIC | 0.0290% |
91 | ![]() | 0XCC42724C6683B7E57334C4E856F4C9965ED682BD-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C | $0.9285 0.0000333 Btc | $36,856.00 39,032.841 0XCC42724C6683B7E57334C4E856F4C9965ED682BD | 0.0237% |
92 | ![]() | MATIC-GBP | $0.9295 0.0000333 Btc | $25,443.00 27,372.656 MATIC | 0.0166% |
93 | ![]() | MATIC-USDT | $0.9285 0.0000333 Btc | $25,070.00 0.000 MATIC | 0.0000% |
94 | ![]() | MATIC-BIDR | $0.929 0.0000333 Btc | $23,720.00 25,531.960 MATIC | 0.0155% |
95 | ![]() | MATIC-BTC | $0.9283 0.0000333 Btc | $19,734.52 21,133.523 MATIC | 0.0129% |
96 | ![]() | MATIC-GBP | $0.9317 0.0000334 Btc | $19,327.87 20,744.654 MATIC | 0.0126% |
97 | ![]() | MATIC-TRY | $0.9649 0.0000346 Btc | $17,031.51 17,538.800 MATIC | 0.0107% |
98 | ![]() | MATIC-UAH | $1.049 0.0000376 Btc | $9,090.51 8,665.655 MATIC | 0.0053% |
99 | ![]() | MATIC-GBP | $0.9307 0.0000334 Btc | $7,821.29 8,347.803 MATIC | 0.0051% |
100 | ![]() | MATIC-ETH | $0.9297 0.0000333 Btc | $7,543.43 8,029.000 MATIC | 0.0049% |
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x14a0243c333a5b238143068dc3a7323ba4c30ecb
Contract Name:
ERC20PresetMinterPauser
Compiler Version
v0.6.4+commit.1dca32f3
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-24 */ // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol pragma solidity ^0.6.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * 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: * * ``` * 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}: * * ``` * 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. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_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) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @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 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. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _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. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol pragma solidity ^0.6.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } } // File: @openzeppelin/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Pausable.sol pragma solidity ^0.6.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC20Pausable is ERC20, Pausable { /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/presets/ERC20PresetMinterPauser.sol pragma solidity ^0.6.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to aother accounts */ contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ constructor(string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _setupDecimals(decimals); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) { super._beforeTokenTransfer(from, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","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":"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001da338038062001da3833981810160405260608110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b5060405260209081015185519093508592508491620001bd91600491850190620003ee565b508051620001d3906005906020840190620003ee565b50506006805461ff001960ff1990911660121716905550620002126000620002036001600160e01b036200029f16565b6001600160e01b03620002a416565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b0190206200024a90620002036001600160e01b036200029f16565b604080516a5041555345525f524f4c4560a81b8152905190819003600b0190206200028290620002036001600160e01b036200029f16565b62000296816001600160e01b03620002bd16565b50505062000490565b335b90565b620002b982826001600160e01b03620002d316565b5050565b6006805460ff191660ff92909216919091179055565b600082815260208181526040909120620002f89183906200139a62000355821b17901c565b15620002b957620003116001600160e01b036200029f16565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000375836001600160a01b0384166001600160e01b036200037e16565b90505b92915050565b60006200039583836001600160e01b03620003d616565b620003cd5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000378565b50600062000378565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200043157805160ff191683800117855562000461565b8280016001018555821562000461579182015b828111156200046157825182559160200191906001019062000444565b506200046f92915062000473565b5090565b620002a191905b808211156200046f57600081556001016200047a565b61190380620004a06000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d53913931461051f578063d547741f14610527578063dd62ed3e14610553578063e63ab1e914610581576101a9565b8063a457c2d7146104aa578063a9059cbb146104d6578063ca15c87314610502576101a9565b80639010d07c116100d35780639010d07c1461042f57806391d148541461046e57806395d89b411461049a578063a217fddf146104a2576101a9565b806370a08231146103d557806379cc6790146103fb5780638456cb5914610427576101a9565b8063313ce567116101665780633f4ba83a116101405780633f4ba83a1461037c57806340c10f191461038457806342966c68146103b05780635c975abb146103cd576101a9565b8063313ce5671461030657806336568abe146103245780633950935114610350576101a9565b806306fdde03146101ae578063095ea7b31461022b57806318160ddd1461026b57806323b872dd14610285578063248a9ca3146102bb5780632f2ff15d146102d8575b600080fd5b6101b6610589565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f05781810151838201526020016101d8565b50505050905090810190601f16801561021d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102576004803603604081101561024157600080fd5b506001600160a01b03813516906020013561061f565b604080519115158252519081900360200190f35b61027361063d565b60408051918252519081900360200190f35b6102576004803603606081101561029b57600080fd5b506001600160a01b03813581169160208101359091169060400135610643565b610273600480360360208110156102d157600080fd5b50356106d0565b610304600480360360408110156102ee57600080fd5b50803590602001356001600160a01b03166106e5565b005b61030e610751565b6040805160ff9092168252519081900360200190f35b6103046004803603604081101561033a57600080fd5b50803590602001356001600160a01b031661075a565b6102576004803603604081101561036657600080fd5b506001600160a01b0381351690602001356107bb565b61030461080f565b6103046004803603604081101561039a57600080fd5b506001600160a01b038135169060200135610880565b610304600480360360208110156103c657600080fd5b50356108f1565b610257610905565b610273600480360360208110156103eb57600080fd5b50356001600160a01b0316610913565b6103046004803603604081101561041157600080fd5b506001600160a01b03813516906020013561092e565b61030461098e565b6104526004803603604081101561044557600080fd5b50803590602001356109fd565b604080516001600160a01b039092168252519081900360200190f35b6102576004803603604081101561048457600080fd5b50803590602001356001600160a01b0316610a22565b6101b6610a40565b610273610aa1565b610257600480360360408110156104c057600080fd5b506001600160a01b038135169060200135610aa6565b610257600480360360408110156104ec57600080fd5b506001600160a01b038135169060200135610b14565b6102736004803603602081101561051857600080fd5b5035610b28565b610273610b3f565b6103046004803603604081101561053d57600080fd5b50803590602001356001600160a01b0316610b62565b6102736004803603604081101561056957600080fd5b506001600160a01b0381358116916020013516610bbb565b610273610be6565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106155780601f106105ea57610100808354040283529160200191610615565b820191906000526020600020905b8154815290600101906020018083116105f857829003601f168201915b5050505050905090565b600061063361062c610c09565b8484610c0d565b5060015b92915050565b60035490565b6000610650848484610cf9565b6106c68461065c610c09565b6106c18560405180606001604052806028815260200161172d602891396001600160a01b038a1660009081526002602052604081209061069a610c09565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610e6216565b610c0d565b5060019392505050565b60009081526020819052604090206002015490565b60008281526020819052604090206002015461070890610703610c09565b610a22565b6107435760405162461bcd60e51b815260040180806020018281038252602f81526020018061162b602f913960400191505060405180910390fd5b61074d8282610ef9565b5050565b60065460ff1690565b610762610c09565b6001600160a01b0316816001600160a01b0316146107b15760405162461bcd60e51b815260040180806020018281038252602f815260200180611875602f913960400191505060405180910390fd5b61074d8282610f68565b60006106336107c8610c09565b846106c185600260006107d9610c09565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610fd716565b604080516a5041555345525f524f4c4560a81b8152905190819003600b01902061083b90610703610c09565b6108765760405162461bcd60e51b815260040180806020018281038252603981526020018061167c6039913960400191505060405180910390fd5b61087e611031565b565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b0190206108ac90610703610c09565b6108e75760405162461bcd60e51b81526004018080602001828103825260368152602001806117556036913960400191505060405180910390fd5b61074d82826110d5565b6109026108fc610c09565b826111d3565b50565b600654610100900460ff1690565b6001600160a01b031660009081526001602052604090205490565b600061096b8260405180606001604052806024815260200161178b6024913961095e86610959610c09565b610bbb565b919063ffffffff610e6216565b905061097f83610979610c09565b83610c0d565b61098983836111d3565b505050565b604080516a5041555345525f524f4c4560a81b8152905190819003600b0190206109ba90610703610c09565b6109f55760405162461bcd60e51b81526004018080602001828103825260378152602001806118196037913960400191505060405180910390fd5b61087e6112db565b6000828152602081905260408120610a1b908363ffffffff61136316565b9392505050565b6000828152602081905260408120610a1b908363ffffffff61136f16565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106155780601f106105ea57610100808354040283529160200191610615565b600081565b6000610633610ab3610c09565b846106c1856040518060600160405280602581526020016118506025913960026000610add610c09565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610e6216565b6000610633610b21610c09565b8484610cf9565b600081815260208190526040812061063790611384565b604080516a4d494e5445525f524f4c4560a81b8152905190819003600b01902081565b600082815260208190526040902060020154610b8090610703610c09565b6107b15760405162461bcd60e51b81526004018080602001828103825260308152602001806116fd6030913960400191505060405180910390fd5b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b604080516a5041555345525f524f4c4560a81b8152905190819003600b01902081565b3390565b6001600160a01b038316610c525760405162461bcd60e51b81526004018080602001828103825260248152602001806117f56024913960400191505060405180910390fd5b6001600160a01b038216610c975760405162461bcd60e51b81526004018080602001828103825260228152602001806116b56022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610d3e5760405162461bcd60e51b81526004018080602001828103825260258152602001806117d06025913960400191505060405180910390fd5b6001600160a01b038216610d835760405162461bcd60e51b81526004018080602001828103825260238152602001806116086023913960400191505060405180910390fd5b610d8e83838361138f565b610dd1816040518060600160405280602681526020016116d7602691396001600160a01b038616600090815260016020526040902054919063ffffffff610e6216565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610e06908263ffffffff610fd716565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610ef15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610eb6578181015183820152602001610e9e565b50505050905090810190601f168015610ee35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828152602081905260409020610f17908263ffffffff61139a16565b1561074d57610f24610c09565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081905260409020610f86908263ffffffff6113af16565b1561074d57610f93610c09565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600082820183811015610a1b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600654610100900460ff16611084576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6006805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6110b8610c09565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038216611130576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61113c6000838361138f565b60035461114f908263ffffffff610fd716565b6003556001600160a01b03821660009081526001602052604090205461117b908263ffffffff610fd716565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166112185760405162461bcd60e51b81526004018080602001828103825260218152602001806117af6021913960400191505060405180910390fd5b6112248260008361138f565b6112678160405180606001604052806022815260200161165a602291396001600160a01b038516600090815260016020526040902054919063ffffffff610e6216565b6001600160a01b038316600090815260016020526040902055600354611293908263ffffffff6113c416565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600654610100900460ff161561132b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586110b8610c09565b6000610a1b8383611406565b6000610a1b836001600160a01b03841661146a565b600061063782611482565b610989838383611486565b6000610a1b836001600160a01b0384166114d5565b6000610a1b836001600160a01b03841661151f565b6000610a1b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610e62565b815460009082106114485760405162461bcd60e51b81526004018080602001828103825260228152602001806115e66022913960400191505060405180910390fd5b82600001828154811061145757fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b611491838383610989565b611499610905565b156109895760405162461bcd60e51b815260040180806020018281038252602a8152602001806118a4602a913960400191505060405180910390fd5b60006114e1838361146a565b61151757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610637565b506000610637565b600081815260018301602052604081205480156115db578354600019808301919081019060009087908390811061155257fe5b906000526020600020015490508087600001848154811061156f57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061159f57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610637565b600091505061063756fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332305072657365744d696e7465725061757365723a206d75737420686176652070617573657220726f6c6520746f20756e706175736545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332305072657365744d696e7465725061757365723a206d7573742068617665206d696e74657220726f6c6520746f206d696e7445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332305072657365744d696e7465725061757365723a206d75737420686176652070617573657220726f6c6520746f20706175736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c6645524332305061757361626c653a20746f6b656e207472616e73666572207768696c6520706175736564a2646970667358221220ae30a42d417300dba54485751134c6d44d367fda645ac2f1c800d5c2b04f8b2464736f6c63430006040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000f4176616c616e63686520546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044156415800000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
42743:2063:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42743:2063:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;29297:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29297:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31403:169;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;31403:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30372:100;;;:::i;:::-;;;;;;;;;;;;;;;;32046:321;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;32046:321:0;;;;;;;;;;;;;;;;;:::i;15834:114::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15834:114:0;;:::i;16210:227::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16210:227:0;;;;;;-1:-1:-1;;;;;16210:227:0;;:::i;:::-;;30224:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17419:209;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17419:209:0;;;;;;-1:-1:-1;;;;;17419:209:0;;:::i;32776:218::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;32776:218:0;;;;;;;;:::i;44450:170::-;;;:::i;43657:197::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;43657:197:0;;;;;;;;:::i;38590:91::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38590:91:0;;:::i;40370:78::-;;;:::i;30535:119::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30535:119:0;-1:-1:-1;;;;;30535:119:0;;:::i;39000:295::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39000:295:0;;;;;;;;:::i;44068:164::-;;;:::i;15507:138::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15507:138:0;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15507:138:0;;;;;;;;;;;;;;14468:139;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14468:139:0;;;;;;-1:-1:-1;;;;;14468:139:0;;:::i;29499:87::-;;;:::i;13636:49::-;;;:::i;33497:269::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;33497:269:0;;;;;;;;:::i;30867:175::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;30867:175:0;;;;;;;;:::i;14781:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14781:127:0;;:::i;42839:62::-;;;:::i;16682:230::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16682:230:0;;;;;;-1:-1:-1;;;;;16682:230:0;;:::i;31105:151::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;31105:151:0;;;;;;;;;;:::i;42908:62::-;;;:::i;29297:83::-;29367:5;29360:12;;;;;;;;-1:-1:-1;;29360:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29334:13;;29360:12;;29367:5;;29360:12;;29367:5;29360:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29297:83;:::o;31403:169::-;31486:4;31503:39;31512:12;:10;:12::i;:::-;31526:7;31535:6;31503:8;:39::i;:::-;-1:-1:-1;31560:4:0;31403:169;;;;;:::o;30372:100::-;30452:12;;30372:100;:::o;32046:321::-;32152:4;32169:36;32179:6;32187:9;32198:6;32169:9;:36::i;:::-;32216:121;32225:6;32233:12;:10;:12::i;:::-;32247:89;32285:6;32247:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32247:19:0;;;;;;:11;:19;;;;;;32267:12;:10;:12::i;:::-;-1:-1:-1;;;;;32247:33:0;;;;;;;;;;;;-1:-1:-1;32247:33:0;;;:89;;:37;:89;:::i;:::-;32216:8;:121::i;:::-;-1:-1:-1;32355:4:0;32046:321;;;;;:::o;15834:114::-;15891:7;15918:12;;;;;;;;;;:22;;;;15834:114::o;16210:227::-;16302:6;:12;;;;;;;;;;:22;;;16294:45;;16326:12;:10;:12::i;:::-;16294:7;:45::i;:::-;16286:105;;;;-1:-1:-1;;;16286:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16404:25;16415:4;16421:7;16404:10;:25::i;:::-;16210:227;;:::o;30224:83::-;30290:9;;;;30224:83;:::o;17419:209::-;17517:12;:10;:12::i;:::-;-1:-1:-1;;;;;17506:23:0;:7;-1:-1:-1;;;;;17506:23:0;;17498:83;;;;-1:-1:-1;;;17498:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17594:26;17606:4;17612:7;17594:11;:26::i;32776:218::-;32864:4;32881:83;32890:12;:10;:12::i;:::-;32904:7;32913:50;32952:10;32913:11;:25;32925:12;:10;:12::i;:::-;-1:-1:-1;;;;;32913:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;32913:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;44450:170::-;42946:24;;;-1:-1:-1;;;42946:24:0;;;;;;;;;;;;44495:34;;44516:12;:10;:12::i;44495:34::-;44487:104;;;;-1:-1:-1;;;44487:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44602:10;:8;:10::i;:::-;44450:170::o;43657:197::-;42877:24;;;-1:-1:-1;;;42877:24:0;;;;;;;;;;;;43725:34;;43746:12;:10;:12::i;43725:34::-;43717:101;;;;-1:-1:-1;;;43717:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43829:17;43835:2;43839:6;43829:5;:17::i;38590:91::-;38646:27;38652:12;:10;:12::i;:::-;38666:6;38646:5;:27::i;:::-;38590:91;:::o;40370:78::-;40433:7;;;;;;;;40370:78::o;30535:119::-;-1:-1:-1;;;;;30628:18:0;30601:7;30628:18;;;:9;:18;;;;;;;30535:119::o;39000:295::-;39077:26;39106:84;39143:6;39106:84;;;;;;;;;;;;;;;;;:32;39116:7;39125:12;:10;:12::i;:::-;39106:9;:32::i;:::-;:36;:84;;:36;:84;:::i;:::-;39077:113;;39203:51;39212:7;39221:12;:10;:12::i;:::-;39235:18;39203:8;:51::i;:::-;39265:22;39271:7;39280:6;39265:5;:22::i;:::-;39000:295;;;:::o;44068:164::-;42946:24;;;-1:-1:-1;;;42946:24:0;;;;;;;;;;;;44111:34;;44132:12;:10;:12::i;44111:34::-;44103:102;;;;-1:-1:-1;;;44103:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44216:8;:6;:8::i;15507:138::-;15580:7;15607:12;;;;;;;;;;:30;;15631:5;15607:30;:23;:30;:::i;:::-;15600:37;15507:138;-1:-1:-1;;;15507:138:0:o;14468:139::-;14537:4;14561:12;;;;;;;;;;:38;;14591:7;14561:38;:29;:38;:::i;29499:87::-;29571:7;29564:14;;;;;;;;-1:-1:-1;;29564:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29538:13;;29564:14;;29571:7;;29564:14;;29571:7;29564:14;;;;;;;;;;;;;;;;;;;;;;;;13636:49;13681:4;13636:49;:::o;33497:269::-;33590:4;33607:129;33616:12;:10;:12::i;:::-;33630:7;33639:96;33678:15;33639:96;;;;;;;;;;;;;;;;;:11;:25;33651:12;:10;:12::i;:::-;-1:-1:-1;;;;;33639:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;33639:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;30867:175::-;30953:4;30970:42;30980:12;:10;:12::i;:::-;30994:9;31005:6;30970:9;:42::i;14781:127::-;14844:7;14871:12;;;;;;;;;;:29;;:27;:29::i;42839:62::-;42877:24;;;-1:-1:-1;;;42877:24:0;;;;;;;;;;;;42839:62;:::o;16682:230::-;16775:6;:12;;;;;;;;;;:22;;;16767:45;;16799:12;:10;:12::i;16767:45::-;16759:106;;;;-1:-1:-1;;;16759:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31105:151;-1:-1:-1;;;;;31221:18:0;;;31194:7;31221:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31105:151::o;42908:62::-;42946:24;;;-1:-1:-1;;;42946:24:0;;;;;;;;;;;;42908:62;:::o;11581:106::-;11669:10;11581:106;:::o;36644:346::-;-1:-1:-1;;;;;36746:19:0;;36738:68;;;;-1:-1:-1;;;36738:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36825:21:0;;36817:68;;;;-1:-1:-1;;;36817:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36898:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;36950:32;;;;;;;;;;;;;;;;;36644:346;;;:::o;34256:539::-;-1:-1:-1;;;;;34362:20:0;;34354:70;;;;-1:-1:-1;;;34354:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34443:23:0;;34435:71;;;;-1:-1:-1;;;34435:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34519:47;34540:6;34548:9;34559:6;34519:20;:47::i;:::-;34599:71;34621:6;34599:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34599:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;34579:17:0;;;;;;;:9;:17;;;;;;:91;;;;34704:20;;;;;;;:32;;34729:6;34704:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;34681:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;34752:35;;;;;;;34681:20;;34752:35;;;;;;;;;;;;;34256:539;;;:::o;23533:192::-;23619:7;23655:12;23647:6;;;;23639:29;;;;-1:-1:-1;;;23639:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23639:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23691:5:0;;;23533:192::o;18539:188::-;18613:6;:12;;;;;;;;;;:33;;18638:7;18613:33;:24;:33;:::i;:::-;18609:111;;;18695:12;:10;:12::i;:::-;-1:-1:-1;;;;;18668:40:0;18686:7;-1:-1:-1;;;;;18668:40:0;18680:4;18668:40;;;;;;;;;;18539:188;;:::o;18735:192::-;18810:6;:12;;;;;;;;;;:36;;18838:7;18810:36;:27;:36;:::i;:::-;18806:114;;;18895:12;:10;:12::i;:::-;-1:-1:-1;;;;;18868:40:0;18886:7;-1:-1:-1;;;;;18868:40:0;18880:4;18868:40;;;;;;;;;;18735:192;;:::o;22646:181::-;22704:7;22736:5;;;22760:6;;;;22752:46;;;;;-1:-1:-1;;;22752:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41103:120;40806:7;;;;;;;40798:40;;;;;-1:-1:-1;;;40798:40:0;;;;;;;;;;;;-1:-1:-1;;;40798:40:0;;;;;;;;;;;;;;;41162:7:::1;:15:::0;;-1:-1:-1;;41162:15:0::1;::::0;;41193:22:::1;41202:12;:10;:12::i;:::-;41193:22;::::0;;-1:-1:-1;;;;;41193:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;41103:120::o:0;35076:378::-;-1:-1:-1;;;;;35160:21:0;;35152:65;;;;;-1:-1:-1;;;35152:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35230:49;35259:1;35263:7;35272:6;35230:20;:49::i;:::-;35307:12;;:24;;35324:6;35307:24;:16;:24;:::i;:::-;35292:12;:39;-1:-1:-1;;;;;35363:18:0;;;;;;:9;:18;;;;;;:30;;35386:6;35363:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;35342:18:0;;;;;;:9;:18;;;;;;;;:51;;;;35409:37;;;;;;;35342:18;;;;35409:37;;;;;;;;;;35076:378;;:::o;35786:418::-;-1:-1:-1;;;;;35870:21:0;;35862:67;;;;-1:-1:-1;;;35862:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35942:49;35963:7;35980:1;35984:6;35942:20;:49::i;:::-;36025:68;36048:6;36025:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36025:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;36004:18:0;;;;;;:9;:18;;;;;:89;36119:12;;:24;;36136:6;36119:24;:16;:24;:::i;:::-;36104:12;:39;36159:37;;;;;;;;36185:1;;-1:-1:-1;;;;;36159:37:0;;;;;;;;;;;;35786:418;;:::o;40921:118::-;40607:7;;;;;;;40606:8;40598:37;;;;;-1:-1:-1;;;40598:37:0;;;;;;;;;;;;-1:-1:-1;;;40598:37:0;;;;;;;;;;;;;;;40981:7:::1;:14:::0;;-1:-1:-1;;40981:14:0::1;;;::::0;;41011:20:::1;41018:12;:10;:12::i;6294:149::-:0;6368:7;6411:22;6415:3;6427:5;6411:3;:22::i;5589:158::-;5669:4;5693:46;5703:3;-1:-1:-1;;;;;5723:14:0;;5693:9;:46::i;5833:117::-;5896:7;5923:19;5931:3;5923:7;:19::i;44628:175::-;44751:44;44778:4;44784:2;44788:6;44751:26;:44::i;5035:143::-;5105:4;5129:41;5134:3;-1:-1:-1;;;;;5154:14:0;;5129:4;:41::i;5354:149::-;5427:4;5451:44;5459:3;-1:-1:-1;;;;;5479:14:0;;5451:7;:44::i;23102:136::-;23160:7;23187:43;23191:1;23194;23187:43;;;;;;;;;;;;;;;;;:3;:43::i;4577:204::-;4672:18;;4644:7;;4672:26;-1:-1:-1;4664:73:0;;;;-1:-1:-1;;;4664:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4755:3;:11;;4767:5;4755:18;;;;;;;;;;;;;;;;4748:25;;4577:204;;;;:::o;3909:129::-;3982:4;4006:19;;;:12;;;;;:19;;;;;;:24;;;3909:129::o;4124:109::-;4207:18;;4124:109::o;41808:238::-;41917:44;41944:4;41950:2;41954:6;41917:26;:44::i;:::-;41983:8;:6;:8::i;:::-;41982:9;41974:64;;;;-1:-1:-1;;;41974:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1689:414;1752:4;1774:21;1784:3;1789:5;1774:9;:21::i;:::-;1769:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;1812:11:0;:23;;;;;;;;;;;;;1995:18;;1973:19;;;:12;;;:19;;;;;;:40;;;;2028:11;;1769:327;-1:-1:-1;2079:5:0;2072:12;;2279:1544;2345:4;2484:19;;;:12;;;:19;;;;;;2520:15;;2516:1300;;2955:18;;-1:-1:-1;;2906:14:0;;;;2955:22;;;;2882:21;;2955:3;;:22;;3242;;;;;;;;;;;;;;3222:42;;3388:9;3359:3;:11;;3371:13;3359:26;;;;;;;;;;;;;;;;;;;:38;;;;3465:23;;;3507:1;3465:12;;;:23;;;;;;3491:17;;;3465:43;;3617:17;;3465:3;;3617:17;;;;;;;;;;;;;;;;;;;;;;3712:3;:12;;:19;3725:5;3712:19;;;;;;;;;;;3705:26;;;3755:4;3748:11;;;;;;;;2516:1300;3799:5;3792:12;;;;
Swarm Source
ipfs://ae30a42d417300dba54485751134c6d44d367fda645ac2f1c800d5c2b04f8b24