Token Balancer
Overview [ERC-20]
Price
$4.14 @ 0.001855 Eth (-3.59%)
Fully Diluted Market Cap
Max Total Supply:
110,123.984796810295830183 BAL
Holders:
75,769 ( 0.005%)
Contract:
Decimals:
18
Official Site:
Balance
0.003234249758757157 BALValue
$0.01 ( ~4.48168661636471E-06 Eth) [0.0000%]
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
A Balancer Pool is an automated market maker with certain key properties that cause it to function as a selfbalancing weighted portfolio and price sensor.Market
Volume (24H) | : | $13,333,067.00 |
Market Capitalization | : | $222,817,184.00 |
Circulating Supply | : | 53,787,434.00 BAL |
Market Data Source: Coinmarketcap |
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | ![]() | BAL-USDT | $4.1400 0.0018551 Eth | $2,689,034.0000 650,145.000 BAL | 21.1394% |
2 | ![]() | BAL-USD | $4.1000 0.0018364 Eth | $2,536,510.0000 618,962.973 BAL | 20.1255% |
3 | ![]() | BAL-USDT | $4.1400 0.0018546 Eth | $2,163,008.0000 513,089.460 BAL | 16.6831% |
4 | ![]() | BAL-USDT | $4.1500 0.0018565 Eth | $581,946.0000 140,334.349 BAL | 4.5630% |
5 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $4.1700 0.0018722 Eth | $552,340.0000 133,211.076 0XBA100000625A3754423978A60C9317C58A424E3D | 4.3313% |
6 | ![]() | BAL-USDT | $4.1500 0.0018592 Eth | $543,055.0000 130,855.560 BAL | 4.2548% |
7 | ![]() | BAL-USDT | $4.1500 0.0018574 Eth | $498,043.0000 117,600.720 BAL | 3.8238% |
8 | ![]() | BAL-BTC | $4.1300 0.0018534 Eth | $453,481.0000 107,594.720 BAL | 3.4984% |
9 | ![]() | BAL-USDT | $4.1400 0.0018531 Eth | $430,388.0000 101,990.092 BAL | 3.3162% |
10 | ![]() | BAL-BTC | $4.1100 0.0018424 Eth | $271,888.0000 66,111.035 BAL | 2.1496% |
11 | ![]() | BAL-USDT | $4.1500 0.0018567 Eth | $232,048.0000 55,949.190 BAL | 1.8192% |
12 | ![]() | BAL-USDT | $4.1300 0.0018521 Eth | $221,369.0000 52,432.934 BAL | 1.7049% |
13 | ![]() | BAL-USDT | $4.1500 0.0018578 Eth | $220,271.0000 53,079.070 BAL | 1.7259% |
14 | ![]() | BAL-USDT | $4.1500 0.0018563 Eth | $172,109.0000 40,742.721 BAL | 1.3247% |
15 | ![]() | BAL-USDT | $4.1500 0.0018583 Eth | $149,633.0000 35,452.190 BAL | 1.1527% |
16 | ![]() | BAL-USD | $4.1600 0.0018612 Eth | $144,336.0000 34,696.198 BAL | 1.1281% |
17 | ![]() | BAL-USDT | $4.1400 0.0018536 Eth | $130,156.0000 31,419.290 BAL | 1.0216% |
18 | ![]() | BAL-KRW | $4.3200 0.0019394 Eth | $109,387.0000 25,296.821 BAL | 0.8225% |
19 | ![]() | BAL-BTC | $4.1300 0.0018522 Eth | $100,771.0000 24,373.340 BAL | 0.7925% |
20 | ![]() | BAL-USDT | $4.1400 0.0018574 Eth | $93,478.0000 22,132.170 BAL | 0.7196% |
21 | ![]() | BAL-USDT | $4.1400 0.0018550 Eth | $87,926.0000 21,241.010 BAL | 0.6906% |
22 | ![]() | BAL-USDT | $4.1300 0.0018494 Eth | $86,017.0000 20,837.200 BAL | 0.6775% |
23 | ![]() | BAL-USDT | $4.1200 0.0018442 Eth | $74,777.0000 18,164.899 BAL | 0.5906% |
24 | ![]() | BAL-USDT | $4.1400 0.0018567 Eth | $72,981.0000 17,609.994 BAL | 0.5726% |
25 | ![]() | BAL-USD | $4.1400 0.0018542 Eth | $71,758.0000 17,342.490 BAL | 0.5639% |
26 | ![]() | BAL-SGD | $4.1400 0.0018547 Eth | $71,697.0000 17,323.166 BAL | 0.5633% |
27 | ![]() | BAL-TRY | $4.2000 0.0018788 Eth | $67,167.0000 15,995.776 BAL | 0.5201% |
28 | ![]() | BAL-EUR | $4.1400 0.0018549 Eth | $65,881.0000 15,930.026 BAL | 0.5180% |
29 | ![]() | BAL-USDT | $4.1500 0.0018583 Eth | $62,830.0000 15,146.855 BAL | 0.4925% |
30 | ![]() | BAL-USDT | $4.1400 0.0018562 Eth | $61,061.0000 14,737.550 BAL | 0.4792% |
31 | ![]() | BAL-USDT | $4.1400 0.0018554 Eth | $55,567.0000 13,420.681 BAL | 0.4364% |
32 | ![]() | 0X9A71012B13CA4D3D0CDC72A177DF3EF03B0E76A3-USDC | $4.0900 0.0018338 Eth | $50,237.0000 12,286.650 0X9A71012B13CA4D3D0CDC72A177DF3EF03B0E76A3 | 0.3995% |
33 | ![]() | 0X7EF541E2A22058048904FE5744F9C7E4C57AF717-0X6A023CCD1FF6F2045C3309768EAD9E68F978F6E1 | $4.1500 0.0018585 Eth | $45,683.0000 860.075 0X7EF541E2A22058048904FE5744F9C7E4C57AF717 | 0.0280% |
34 | ![]() | BAL-USDT | $4.1500 0.0018560 Eth | $34,708.0000 8,226.786 BAL | 0.2675% |
35 | ![]() | BAL-USDT | $4.1400 0.0018554 Eth | $33,752.0000 8,016.779 BAL | 0.2607% |
36 | ![]() | 0X9A71012B13CA4D3D0CDC72A177DF3EF03B0E76A3-MATIC | $4.1100 0.0018428 Eth | $30,006.0000 7,303.082 0X9A71012B13CA4D3D0CDC72A177DF3EF03B0E76A3 | 0.2375% |
37 | ![]() | BAL-USDT | $4.1400 0.0018545 Eth | $25,556.0000 6,175.400 BAL | 0.2008% |
38 | ![]() | 0X040D1EDC9569D4BAB2D15287DC5A4F10F56A56B8-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1 | $4.1100 0.0018452 Eth | $22,355.0000 5,433.841 0X040D1EDC9569D4BAB2D15287DC5A4F10F56A56B8 | 0.1767% |
39 | ![]() | BAL-USDT | $4.1500 0.0018554 Eth | $17,735.1800 4,200.680 BAL | 0.1366% |
40 | ![]() | BAL-USD | $4.1400 0.0018553 Eth | $16,651.7800 4,022.168 BAL | 0.1308% |
41 | ![]() | BAL-USDT | $4.1300 0.0018478 Eth | $15,697.3600 3,713.660 BAL | 0.1207% |
42 | ![]() | BAL-ETH | $4.1400 0.0018566 Eth | $14,588.6300 3,521.260 BAL | 0.1145% |
43 | ![]() | BAL-BTC | $4.1500 0.0018547 Eth | $13,808.7900 3,331.030 BAL | 0.1083% |
44 | ![]() | BAL-XBT | $4.2400 0.0019015 Eth | $13,722.6200 3,234.093 BAL | 0.1052% |
45 | ![]() | BAL-USDT | $4.1400 0.0018560 Eth | $11,733.1500 2,777.279 BAL | 0.0903% |
46 | ![]() | BAL-EUR | $4.1300 0.0018527 Eth | $10,453.3400 2,528.420 BAL | 0.0822% |
47 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $4.1300 0.0018533 Eth | $10,452.1900 2,528.694 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0822% |
48 | ![]() | USDC-BAL | $4.0700 0.0017675 Eth | $9,056.6000 9,000.000 USDC | 0.2926% |
49 | ![]() | BAL-THB | $4.1200 0.0018461 Eth | $8,004.5300 1,942.503 BAL | 0.0632% |
50 | ![]() | BAL-BTC | $4.1300 0.0018534 Eth | $7,554.1400 1,828.013 BAL | 0.0594% |
51 | ![]() | BAL-USDT | $4.2000 0.0018837 Eth | $7,093.9800 1,687.665 BAL | 0.0549% |
52 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-ETH | $4.1800 0.0018729 Eth | $6,354.7500 1,521.806 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0495% |
53 | ![]() | BAL-BRL | $4.1900 0.0018794 Eth | $5,995.5900 1,429.628 BAL | 0.0465% |
54 | ![]() | BAL-TRY | $4.1700 0.0018663 Eth | $5,729.0000 1,350.902 BAL | 0.0439% |
55 | ![]() | BAL-USDT | $4.1300 0.0018497 Eth | $5,534.7100 1,310.932 BAL | 0.0426% |
56 | ![]() | BAL-USD | $4.1400 0.0018516 Eth | $5,217.4100 1,261.462 BAL | 0.0410% |
57 | ![]() | BAL-USDT | $4.1500 0.0018566 Eth | $5,148.1500 1,241.370 BAL | 0.0404% |
58 | ![]() | BAL-USD | $4.1400 0.0018580 Eth | $5,021.5700 1,212.148 BAL | 0.0394% |
59 | ![]() | 0X7EF541E2A22058048904FE5744F9C7E4C57AF717-0X9C58BACC331C9AA871AFD802DB6379A98E80CEDB | $4.1500 0.0018585 Eth | $4,308.3800 207.301 0X7EF541E2A22058048904FE5744F9C7E4C57AF717 | 0.0067% |
60 | ![]() | BAL-BTC | $4.1400 0.0018544 Eth | $3,300.0200 797.245 BAL | 0.0259% |
61 | ![]() | BAL-THB | $4.1100 0.0018397 Eth | $2,640.6200 625.550 BAL | 0.0203% |
62 | ![]() | BAL-USDT | $4.1300 0.0018497 Eth | $2,586.1100 626.198 BAL | 0.0204% |
63 | ![]() | BAL-USDT | $4.1500 0.0018596 Eth | $2,537.4200 611.472 BAL | 0.0199% |
64 | ![]() | BAL-USD | $4.1400 0.0018561 Eth | $2,209.1300 533.220 BAL | 0.0173% |
65 | ![]() | BAL-BRL | $4.4000 0.0019711 Eth | $1,810.5700 411.339 BAL | 0.0134% |
66 | ![]() | BAL-ETH | $4.1500 0.0018606 Eth | $1,713.0300 411.819 BAL | 0.0134% |
67 | ![]() | BAL-USDT | $4.1200 0.0018471 Eth | $1,099.6300 260.568 BAL | 0.0085% |
68 | ![]() | BAL-USDT | $4.1200 0.0018471 Eth | $1,074.0300 260.568 BAL | 0.0085% |
69 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $4.1700 0.0018722 Eth | $983.4600 235.603 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0077% |
70 | ![]() | BAL-KRW | $4.3700 0.0019582 Eth | $878.0300 201.108 BAL | 0.0065% |
71 | ![]() | BAL-ETH | $4.2200 0.0018894 Eth | $848.3100 201.146 BAL | 0.0065% |
72 | ![]() | BAL-AUD | $4.0800 0.0018267 Eth | $652.3900 160.000 BAL | 0.0052% |
73 | ![]() | BAL-USDT | $4.0500 0.0017567 Eth | $616.1300 152.229 BAL | 0.0049% |
74 | ![]() | BAL-USDT | $4.1400 0.0018554 Eth | $550.0900 132.859 BAL | 0.0043% |
75 | ![]() | BAL-INR | $4.1900 0.0018762 Eth | $490.3000 117.072 BAL | 0.0038% |
76 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $4.1300 0.0018525 Eth | $489.8300 117.804 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0038% |
77 | ![]() | 0X040D1EDC9569D4BAB2D15287DC5A4F10F56A56B8-0X2F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F | $4.1100 0.0018426 Eth | $267.5700 65.129 0X040D1EDC9569D4BAB2D15287DC5A4F10F56A56B8 | 0.0021% |
78 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-USDC | $3.7800 0.0017015 Eth | $181.8300 48.052 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0016% |
79 | ![]() | BAL-IDR | $4.3700 0.0019565 Eth | $174.0100 39.815 BAL | 0.0013% |
80 | ![]() | BAL-USDT | $4.1500 0.0018592 Eth | $127.0200 29.946 BAL | 0.0010% |
81 | ![]() | 0X43D4A3CD90DDD2F8F4F693170C9C8098163502AD-0XBA100000625A3754423978A60C9317C58A424E3D | $4.0200 0.0018043 Eth | $123.2900 11,981.171 0X43D4A3CD90DDD2F8F4F693170C9C8098163502AD | 0.3896% |
82 | ![]() | BAL-IDR | $4.1500 0.0018568 Eth | $97.7700 22.350 BAL | 0.0007% |
83 | ![]() | BAL-USDT | $4.0400 0.0018099 Eth | $84.1600 20.954 BAL | 0.0007% |
84 | ![]() | BAL-BTC | $4.1100 0.0018405 Eth | $67.8600 16.518 BAL | 0.0005% |
85 | ![]() | BAL-EUR | $4.1700 0.0018664 Eth | $49.5900 11.910 BAL | 0.0004% |
86 | ![]() | BAL-USD | $4.1600 0.0018637 Eth | $40.1900 9.530 BAL | 0.0003% |
87 | ![]() | BAL-BTC | $4.4200 0.0019228 Eth | $23.3400 5.280 BAL | 0.0002% |
88 | ![]() | BAL-BTC | $4.4200 0.0019265 Eth | $23.2600 5.280 BAL | 0.0002% |
89 | ![]() | BAL-USDT | $4.0700 0.0018570 Eth | $22.5800 5.542 BAL | 0.0002% |
90 | ![]() | BAL-USDT | $4.1000 0.0018368 Eth | $20.4900 4.998 BAL | 0.0002% |
91 | ![]() | BAL-USDT | $4.3200 0.0019380 Eth | $11.8200 2.733 BAL | 0.0001% |
92 | ![]() | 0XBA100000625A3754423978A60C9317C58A424E3D-0XDE30DA39C46104798BB5AA3FE8B9E0E1F348163F | $3.6800 0.0017937 Eth | $2.2100 0.600 0XBA100000625A3754423978A60C9317C58A424E3D | 0.0000% |
Similar Match Source Code This contract matches the deployed ByteCode of the Source Code for Contract 0x7c6b91d9be155a6db01f749217d76ff02a7227f2 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
L2StandardERC20
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2021-11-28 */ // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.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/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.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 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; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.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 {ERC20PresetMinterPauser}. * * 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 Contracts guidelines: functions revert * instead 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, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } 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] + 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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This 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); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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: * * - `account` 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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This 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 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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @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); } // File contracts/standards/IL2StandardERC20.sol pragma solidity ^0.8.9; interface IL2StandardERC20 is IERC20, IERC165 { function l1Token() external returns (address); function mint(address _to, uint256 _amount) external; function burn(address _from, uint256 _amount) external; event Mint(address indexed _account, uint256 _amount); event Burn(address indexed _account, uint256 _amount); } // File contracts/standards/L2StandardERC20.sol pragma solidity ^0.8.9; contract L2StandardERC20 is IL2StandardERC20, ERC20 { address public l1Token; address public l2Bridge; /** * @param _l2Bridge Address of the L2 standard bridge. * @param _l1Token Address of the corresponding L1 token. * @param _name ERC20 name. * @param _symbol ERC20 symbol. */ constructor( address _l2Bridge, address _l1Token, string memory _name, string memory _symbol ) ERC20(_name, _symbol) { l1Token = _l1Token; l2Bridge = _l2Bridge; } modifier onlyL2Bridge() { require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn"); _; } function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165 bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^ IL2StandardERC20.mint.selector ^ IL2StandardERC20.burn.selector; return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface; } function mint(address _to, uint256 _amount) public virtual onlyL2Bridge { _mint(_to, _amount); emit Mint(_to, _amount); } function burn(address _from, uint256 _amount) public virtual onlyL2Bridge { _burn(_from, _amount); emit Burn(_from, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_l2Bridge","type":"address"},{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","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"},{"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":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l1Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620013d7380380620013d783398101604081905262000034916200022f565b8151829082906200004d9060039060208501906200009f565b508051620000639060049060208401906200009f565b5050600580546001600160a01b039586166001600160a01b031991821617909155600680549690951695169490941790925550620002fc915050565b828054620000ad90620002bf565b90600052602060002090601f016020900481019282620000d157600085556200011c565b82601f10620000ec57805160ff19168380011785556200011c565b828001600101855582156200011c579182015b828111156200011c578251825591602001919060010190620000ff565b506200012a9291506200012e565b5090565b5b808211156200012a57600081556001016200012f565b80516001600160a01b03811681146200015d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a762000162565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d262000162565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b600080600080608085870312156200024657600080fd5b620002518562000145565b9350620002616020860162000145565b60408601519093506001600160401b03808211156200027f57600080fd5b6200028d8883890162000178565b93506060870151915080821115620002a457600080fd5b50620002b38782880162000178565b91505092959194509250565b600181811c90821680620002d457607f821691505b60208210811415620002f657634e487b7160e01b600052602260045260246000fd5b50919050565b6110cb806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610e4a565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610e93565b610118610150366004610f2f565b610425565b6002545b604051908152602001610124565b610118610175366004610f59565b61043b565b60405160128152602001610124565b610118610197366004610f2f565b61050c565b6101af6101aa366004610f2f565b610555565b005b6101596101bf366004610f95565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561061a565b6101af6101fd366004610f2f565b610629565b610118610210366004610f2f565b6106e2565b610118610223366004610f2f565b6107a0565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610fb0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610fe3565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610fe3565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b60006104323384846107ad565b50600192915050565b600061044884848461092d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160209081526040808320338452909152902054828110156104f45760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61050185338584036107ad565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610432918590610550908690611066565b6107ad565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105bc5760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b6105c68282610b93565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161060e91815260200190565b60405180910390a25050565b6060600480546103a290610fe3565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106905760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104eb565b61069a8282610c99565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161060e91815260200190565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054828110156107895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104eb565b61079633858584036107ad565b5060019392505050565b600061043233848461092d565b73ffffffffffffffffffffffffffffffffffffffff83166108355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff82166108be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166109b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff8216610a3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610adb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610b1f908490611066565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b8591815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216610bf65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104eb565b8060026000828254610c089190611066565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610c42908490611066565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104eb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610dfa90849061107e565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610920565b600060208284031215610e5c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e8c57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ec057858101830151858201604001528201610ea4565b81811115610ed2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f2a57600080fd5b919050565b60008060408385031215610f4257600080fd5b610f4b83610f06565b946020939093013593505050565b600080600060608486031215610f6e57600080fd5b610f7784610f06565b9250610f8560208501610f06565b9150604084013590509250925092565b600060208284031215610fa757600080fd5b610e8c82610f06565b60008060408385031215610fc357600080fd5b610fcc83610f06565b9150610fda60208401610f06565b90509250929050565b600181811c90821680610ff757607f821691505b60208210811415611031577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561107957611079611037565b500190565b60008282101561109057611090611037565b50039056fea2646970667358221220cf6f2a647337a3023928b1f0a8286454f8c5755dd6ed9bb72c21a4693b3d555b64736f6c6343000809003300000000000000000000000042000000000000000000000000000000000000100000000000000000000000007697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000b536172636f7068616775730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005534152434f000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
17782:1466:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18477:454;;;;;;:::i;:::-;;:::i;:::-;;;516:14:1;;509:22;491:41;;479:2;464:18;18477:454:0;;;;;;;;6451:100;;;:::i;:::-;;;;;;;:::i;8618:169::-;;;;;;:::i;:::-;;:::i;7571:108::-;7659:12;;7571:108;;;1810:25:1;;;1798:2;1783:18;7571:108:0;1664:177:1;9269:492:0;;;;;;:::i;:::-;;:::i;7413:93::-;;;7496:2;2321:36:1;;2309:2;2294:18;7413:93:0;2179:184:1;10170:215:0;;;;;;:::i;:::-;;:::i;18939:146::-;;;;;;:::i;:::-;;:::i;:::-;;7742:127;;;;;;:::i;:::-;7843:18;;7816:7;7843:18;;;;;;;;;;;;7742:127;6670:104;;;:::i;19093:152::-;;;;;;:::i;:::-;;:::i;10888:413::-;;;;;;:::i;:::-;;:::i;8082:175::-;;;;;;:::i;:::-;;:::i;17870:23::-;;;;;;;;;;;;2735:42:1;2723:55;;;2705:74;;2693:2;2678:18;17870:23:0;2559:226:1;17841:22:0;;;;;;;;;8320:151;;;;;;:::i;:::-;8436:18;;;;8409:7;8436:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8320:151;18477:454;18546:4;18603:38;18697:125;18840:39;;;;;;:83;;-1:-1:-1;18883:40:0;;;;;;;;18840:83;18833:90;18477:454;-1:-1:-1;;;;18477:454:0:o;6451:100::-;6505:13;6538:5;6531:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6451:100;:::o;8618:169::-;8701:4;8718:39;4242:10;8741:7;8750:6;8718:8;:39::i;:::-;-1:-1:-1;8775:4:0;8618:169;;;;:::o;9269:492::-;9409:4;9426:36;9436:6;9444:9;9455:6;9426:9;:36::i;:::-;9502:19;;;9475:24;9502:19;;;:11;:19;;;;;;;;4242:10;9502:33;;;;;;;;9554:26;;;;9546:79;;;;-1:-1:-1;;;9546:79:0;;3699:2:1;9546:79:0;;;3681:21:1;3738:2;3718:18;;;3711:30;3777:34;3757:18;;;3750:62;3848:10;3828:18;;;3821:38;3876:19;;9546:79:0;;;;;;;;;9661:57;9670:6;4242:10;9711:6;9692:16;:25;9661:8;:57::i;:::-;-1:-1:-1;9749:4:0;;9269:492;-1:-1:-1;;;;9269:492:0:o;10170:215::-;4242:10;10258:4;10307:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;10258:4;;10275:80;;10298:7;;10307:47;;10344:10;;10307:47;:::i;:::-;10275:8;:80::i;18939:146::-;18404:8;;;;18390:10;:22;18382:67;;;;-1:-1:-1;;;18382:67:0;;4430:2:1;18382:67:0;;;4412:21:1;;;4449:18;;;4442:30;4508:34;4488:18;;;4481:62;4560:18;;18382:67:0;4228:356:1;18382:67:0;19022:19:::1;19028:3;19033:7;19022:5;:19::i;:::-;19064:3;19059:18;;;19069:7;19059:18;;;;1810:25:1::0;;1798:2;1783:18;;1664:177;19059:18:0::1;;;;;;;;18939:146:::0;;:::o;6670:104::-;6726:13;6759:7;6752:14;;;;;:::i;19093:152::-;18404:8;;;;18390:10;:22;18382:67;;;;-1:-1:-1;;;18382:67:0;;4430:2:1;18382:67:0;;;4412:21:1;;;4449:18;;;4442:30;4508:34;4488:18;;;4481:62;4560:18;;18382:67:0;4228:356:1;18382:67:0;19178:21:::1;19184:5;19191:7;19178:5;:21::i;:::-;19222:5;19217:20;;;19229:7;19217:20;;;;1810:25:1::0;;1798:2;1783:18;;1664:177;10888:413:0;4242:10;10981:4;11025:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;11078:35;;;;11070:85;;;;-1:-1:-1;;;11070:85:0;;4791:2:1;11070:85:0;;;4773:21:1;4830:2;4810:18;;;4803:30;4869:34;4849:18;;;4842:62;4940:7;4920:18;;;4913:35;4965:19;;11070:85:0;4589:401:1;11070:85:0;11191:67;4242:10;11214:7;11242:15;11223:16;:34;11191:8;:67::i;:::-;-1:-1:-1;11289:4:0;;10888:413;-1:-1:-1;;;10888:413:0:o;8082:175::-;8168:4;8185:42;4242:10;8209:9;8220:6;8185:9;:42::i;14572:380::-;14708:19;;;14700:68;;;;-1:-1:-1;;;14700:68:0;;5197:2:1;14700:68:0;;;5179:21:1;5236:2;5216:18;;;5209:30;5275:34;5255:18;;;5248:62;5346:6;5326:18;;;5319:34;5370:19;;14700:68:0;4995:400:1;14700:68:0;14787:21;;;14779:68;;;;-1:-1:-1;;;14779:68:0;;5602:2:1;14779:68:0;;;5584:21:1;5641:2;5621:18;;;5614:30;5680:34;5660:18;;;5653:62;5751:4;5731:18;;;5724:32;5773:19;;14779:68:0;5400:398:1;14779:68:0;14860:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14912:32;;1810:25:1;;;14912:32:0;;1783:18:1;14912:32:0;;;;;;;;14572:380;;;:::o;11791:733::-;11931:20;;;11923:70;;;;-1:-1:-1;;;11923:70:0;;6005:2:1;11923:70:0;;;5987:21:1;6044:2;6024:18;;;6017:30;6083:34;6063:18;;;6056:62;6154:7;6134:18;;;6127:35;6179:19;;11923:70:0;5803:401:1;11923:70:0;12012:23;;;12004:71;;;;-1:-1:-1;;;12004:71:0;;6411:2:1;12004:71:0;;;6393:21:1;6450:2;6430:18;;;6423:30;6489:34;6469:18;;;6462:62;6560:5;6540:18;;;6533:33;6583:19;;12004:71:0;6209:399:1;12004:71:0;12172:17;;;12148:21;12172:17;;;;;;;;;;;12208:23;;;;12200:74;;;;-1:-1:-1;;;12200:74:0;;6815:2:1;12200:74:0;;;6797:21:1;6854:2;6834:18;;;6827:30;6893:34;6873:18;;;6866:62;6964:8;6944:18;;;6937:36;6990:19;;12200:74:0;6613:402:1;12200:74:0;12310:17;;;;:9;:17;;;;;;;;;;;12330:22;;;12310:42;;12374:20;;;;;;;;:30;;12346:6;;12310:9;12374:30;;12346:6;;12374:30;:::i;:::-;;;;;;;;12439:9;12422:35;;12431:6;12422:35;;;12450:6;12422:35;;;;1810:25:1;;1798:2;1783:18;;1664:177;12422:35:0;;;;;;;;11912:612;11791:733;;;:::o;12811:399::-;12895:21;;;12887:65;;;;-1:-1:-1;;;12887:65:0;;7222:2:1;12887:65:0;;;7204:21:1;7261:2;7241:18;;;7234:30;7300:33;7280:18;;;7273:61;7351:18;;12887:65:0;7020:355:1;12887:65:0;13043:6;13027:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;13060:18:0;;;:9;:18;;;;;;;;;;:28;;13082:6;;13060:9;:28;;13082:6;;13060:28;:::i;:::-;;;;-1:-1:-1;;13104:37:0;;1810:25:1;;;13104:37:0;;;;13121:1;;13104:37;;1798:2:1;1783:18;13104:37:0;;;;;;;12811:399;;:::o;13543:591::-;13627:21;;;13619:67;;;;-1:-1:-1;;;13619:67:0;;7582:2:1;13619:67:0;;;7564:21:1;7621:2;7601:18;;;7594:30;7660:34;7640:18;;;7633:62;7731:3;7711:18;;;7704:31;7752:19;;13619:67:0;7380:397:1;13619:67:0;13786:18;;;13761:22;13786:18;;;;;;;;;;;13823:24;;;;13815:71;;;;-1:-1:-1;;;13815:71:0;;7984:2:1;13815:71:0;;;7966:21:1;8023:2;8003:18;;;7996:30;8062:34;8042:18;;;8035:62;8133:4;8113:18;;;8106:32;8155:19;;13815:71:0;7782:398:1;13815:71:0;13922:18;;;:9;:18;;;;;;;;;;13943:23;;;13922:44;;13988:12;:22;;13960:6;;13922:9;13988:22;;13960:6;;13988:22;:::i;:::-;;;;-1:-1:-1;;14028:37:0;;1810:25:1;;;14054:1:0;;14028:37;;;;;;1798:2:1;1783:18;14028:37:0;1664:177:1;14:332;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:1:o;543:656::-;655:4;684:2;713;702:9;695:21;745:6;739:13;788:6;783:2;772:9;768:18;761:34;813:1;823:140;837:6;834:1;831:13;823:140;;;932:14;;;928:23;;922:30;898:17;;;917:2;894:26;887:66;852:10;;823:140;;;981:6;978:1;975:13;972:91;;;1051:1;1046:2;1037:6;1026:9;1022:22;1018:31;1011:42;972:91;-1:-1:-1;1115:2:1;1103:15;1120:66;1099:88;1084:104;;;;1190:2;1080:113;;543:656;-1:-1:-1;;;543:656:1:o;1204:196::-;1272:20;;1332:42;1321:54;;1311:65;;1301:93;;1390:1;1387;1380:12;1301:93;1204:196;;;:::o;1405:254::-;1473:6;1481;1534:2;1522:9;1513:7;1509:23;1505:32;1502:52;;;1550:1;1547;1540:12;1502:52;1573:29;1592:9;1573:29;:::i;:::-;1563:39;1649:2;1634:18;;;;1621:32;;-1:-1:-1;;;1405:254:1:o;1846:328::-;1923:6;1931;1939;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;2031:29;2050:9;2031:29;:::i;:::-;2021:39;;2079:38;2113:2;2102:9;2098:18;2079:38;:::i;:::-;2069:48;;2164:2;2153:9;2149:18;2136:32;2126:42;;1846:328;;;;;:::o;2368:186::-;2427:6;2480:2;2468:9;2459:7;2455:23;2451:32;2448:52;;;2496:1;2493;2486:12;2448:52;2519:29;2538:9;2519:29;:::i;2790:260::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2958:29;2977:9;2958:29;:::i;:::-;2948:39;;3006:38;3040:2;3029:9;3025:18;3006:38;:::i;:::-;2996:48;;2790:260;;;;;:::o;3055:437::-;3134:1;3130:12;;;;3177;;;3198:61;;3252:4;3244:6;3240:17;3230:27;;3198:61;3305:2;3297:6;3294:14;3274:18;3271:38;3268:218;;;3342:77;3339:1;3332:88;3443:4;3440:1;3433:15;3471:4;3468:1;3461:15;3268:218;;3055:437;;;:::o;3906:184::-;3958:77;3955:1;3948:88;4055:4;4052:1;4045:15;4079:4;4076:1;4069:15;4095:128;4135:3;4166:1;4162:6;4159:1;4156:13;4153:39;;;4172:18;;:::i;:::-;-1:-1:-1;4208:9:1;;4095:128::o;8185:125::-;8225:4;8253:1;8250;8247:8;8244:34;;;8258:18;;:::i;:::-;-1:-1:-1;8295:9:1;;8185:125::o
Swarm Source
ipfs://cf6f2a647337a3023928b1f0a8286454f8c5755dd6ed9bb72c21a4693b3d555b