Source Code
Latest 25 from a total of 39,452 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| 0x903a4d31 | 132101053 | 342 days ago | IN | 0 ETH | 0.000527020956 | ||||
| 0x903a4d31 | 132093224 | 342 days ago | IN | 0 ETH | 0.000527352221 | ||||
| 0x903a4d31 | 132069180 | 342 days ago | IN | 0 ETH | 0.000525559464 | ||||
| 0x903a4d31 | 132069143 | 342 days ago | IN | 0 ETH | 0.000525532466 | ||||
| 0x903a4d31 | 132068888 | 342 days ago | IN | 0 ETH | 0.000525498321 | ||||
| 0x903a4d31 | 132068593 | 342 days ago | IN | 0 ETH | 0.000525584842 | ||||
| 0x903a4d31 | 132068530 | 342 days ago | IN | 0 ETH | 0.000525596309 | ||||
| 0x903a4d31 | 132065315 | 342 days ago | IN | 0 ETH | 0.000525992346 | ||||
| 0x903a4d31 | 132064963 | 342 days ago | IN | 0 ETH | 0.000525831762 | ||||
| 0x903a4d31 | 132064453 | 342 days ago | IN | 0 ETH | 0.000526100383 | ||||
| 0x903a4d31 | 132064120 | 342 days ago | IN | 0 ETH | 0.000525996824 | ||||
| 0x903a4d31 | 132064118 | 342 days ago | IN | 0 ETH | 0.000526014822 | ||||
| 0x903a4d31 | 132064097 | 342 days ago | IN | 0 ETH | 0.00052595709 | ||||
| 0x903a4d31 | 132063553 | 342 days ago | IN | 0 ETH | 0.000527520227 | ||||
| 0x903a4d31 | 132063363 | 342 days ago | IN | 0 ETH | 0.00052681087 | ||||
| 0x903a4d31 | 132063097 | 342 days ago | IN | 0 ETH | 0.000526337089 | ||||
| 0x903a4d31 | 132062539 | 343 days ago | IN | 0 ETH | 0.000526862043 | ||||
| 0x903a4d31 | 132061670 | 343 days ago | IN | 0 ETH | 0.00052606431 | ||||
| 0x903a4d31 | 132055059 | 343 days ago | IN | 0 ETH | 0.000525464714 | ||||
| 0x903a4d31 | 132051414 | 343 days ago | IN | 0 ETH | 0.000525480038 | ||||
| 0x903a4d31 | 132047052 | 343 days ago | IN | 0 ETH | 0.000525486327 | ||||
| 0x903a4d31 | 132046426 | 343 days ago | IN | 0 ETH | 0.000525499612 | ||||
| 0x903a4d31 | 132046307 | 343 days ago | IN | 0 ETH | 0.000525517838 | ||||
| 0x903a4d31 | 132020784 | 343 days ago | IN | 0 ETH | 0.000525524782 | ||||
| 0x903a4d31 | 132018806 | 344 days ago | IN | 0 ETH | 0.00052550169 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 109677301 | 861 days ago | 13.065 ETH | ||||
| 107706847 | 906 days ago | 4.81 ETH | ||||
| 107581819 | 909 days ago | 5.28 ETH | ||||
| 107558260 | 910 days ago | 0 ETH | ||||
| 107558260 | 910 days ago | 0 ETH | ||||
| 107558207 | 910 days ago | 0 ETH | ||||
| 107558207 | 910 days ago | 0 ETH | ||||
| 107558163 | 910 days ago | 0 ETH | ||||
| 107558163 | 910 days ago | 0 ETH | ||||
| 107558026 | 910 days ago | 0 ETH | ||||
| 107558026 | 910 days ago | 0 ETH | ||||
| 107557992 | 910 days ago | 0 ETH | ||||
| 107557992 | 910 days ago | 0 ETH | ||||
| 107557965 | 910 days ago | 0 ETH | ||||
| 107557965 | 910 days ago | 0 ETH | ||||
| 107557803 | 910 days ago | 0 ETH | ||||
| 107557803 | 910 days ago | 0 ETH | ||||
| 107557782 | 910 days ago | 0 ETH | ||||
| 107557782 | 910 days ago | 0 ETH | ||||
| 107557761 | 910 days ago | 0 ETH | ||||
| 107557761 | 910 days ago | 0 ETH | ||||
| 107557757 | 910 days ago | 0 ETH | ||||
| 107557757 | 910 days ago | 0 ETH | ||||
| 107557742 | 910 days ago | 0 ETH | ||||
| 107557742 | 910 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SybilResistance
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/**
*Submitted for verification at optimistic.etherscan.io on 2023-02-19
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
library Pairing {
struct G1Point {
uint X;
uint Y;
}
// Encoding of field elements is: X[0] * z + X[1]
struct G2Point {
uint[2] X;
uint[2] Y;
}
/// @return the generator of G1
function P1() pure internal returns (G1Point memory) {
return G1Point(1, 2);
}
/// @return the generator of G2
function P2() pure internal returns (G2Point memory) {
return G2Point(
[10857046999023057135944570762232829481370756359578518086990519993285655852781,
11559732032986387107991004021392285783925812861821192530917403151452391805634],
[8495653923123431417604973247489272438418190587263600148770280649306958101930,
4082367875863433681332203403145435568316851327593401208105741076214120093531]
);
}
/// @return the negation of p, i.e. p.addition(p.negate()) should be zero.
function negate(G1Point memory p) pure internal returns (G1Point memory) {
// The prime q in the base field F_q for G1
uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
if (p.X == 0 && p.Y == 0)
return G1Point(0, 0);
return G1Point(p.X, q - (p.Y % q));
}
/// @return r the sum of two points of G1
function addition(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {
uint[4] memory input;
input[0] = p1.X;
input[1] = p1.Y;
input[2] = p2.X;
input[3] = p2.Y;
bool success;
assembly {
success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)
// Use "invalid" to make gas estimation work
switch success case 0 { invalid() }
}
require(success);
}
/// @return r the product of a point on G1 and a scalar, i.e.
/// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p.
function scalar_mul(G1Point memory p, uint s) internal view returns (G1Point memory r) {
uint[3] memory input;
input[0] = p.X;
input[1] = p.Y;
input[2] = s;
bool success;
assembly {
success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)
// Use "invalid" to make gas estimation work
switch success case 0 { invalid() }
}
require (success);
}
/// @return the result of computing the pairing check
/// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1
/// For example pairing([P1(), P1().negate()], [P2(), P2()]) should
/// return true.
function pairing(G1Point[] memory p1, G2Point[] memory p2) internal view returns (bool) {
require(p1.length == p2.length);
uint elements = p1.length;
uint inputSize = elements * 6;
uint[] memory input = new uint[](inputSize);
for (uint i = 0; i < elements; i++)
{
input[i * 6 + 0] = p1[i].X;
input[i * 6 + 1] = p1[i].Y;
input[i * 6 + 2] = p2[i].X[1];
input[i * 6 + 3] = p2[i].X[0];
input[i * 6 + 4] = p2[i].Y[1];
input[i * 6 + 5] = p2[i].Y[0];
}
uint[1] memory out;
bool success;
assembly {
success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20)
// Use "invalid" to make gas estimation work
switch success case 0 { invalid() }
}
require(success);
return out[0] != 0;
}
/// Convenience method for a pairing check for two pairs.
function pairingProd2(G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2) internal view returns (bool) {
G1Point[] memory p1 = new G1Point[](2);
G2Point[] memory p2 = new G2Point[](2);
p1[0] = a1;
p1[1] = b1;
p2[0] = a2;
p2[1] = b2;
return pairing(p1, p2);
}
/// Convenience method for a pairing check for three pairs.
function pairingProd3(
G1Point memory a1, G2Point memory a2,
G1Point memory b1, G2Point memory b2,
G1Point memory c1, G2Point memory c2
) internal view returns (bool) {
G1Point[] memory p1 = new G1Point[](3);
G2Point[] memory p2 = new G2Point[](3);
p1[0] = a1;
p1[1] = b1;
p1[2] = c1;
p2[0] = a2;
p2[1] = b2;
p2[2] = c2;
return pairing(p1, p2);
}
/// Convenience method for a pairing check for four pairs.
function pairingProd4(
G1Point memory a1, G2Point memory a2,
G1Point memory b1, G2Point memory b2,
G1Point memory c1, G2Point memory c2,
G1Point memory d1, G2Point memory d2
) internal view returns (bool) {
G1Point[] memory p1 = new G1Point[](4);
G2Point[] memory p2 = new G2Point[](4);
p1[0] = a1;
p1[1] = b1;
p1[2] = c1;
p1[3] = d1;
p2[0] = a2;
p2[1] = b2;
p2[2] = c2;
p2[3] = d2;
return pairing(p1, p2);
}
}
// Groth16 Proof struct
struct Proof {
Pairing.G1Point a;
Pairing.G2Point b;
Pairing.G1Point c;
}
contract ProofOfCountry {
using Pairing for *;
struct VerifyingKey {
Pairing.G1Point alpha;
Pairing.G2Point beta;
Pairing.G2Point gamma;
Pairing.G2Point delta;
Pairing.G1Point[] gamma_abc;
}
function verifyingKey() pure internal returns (VerifyingKey memory vk) {
vk.alpha = Pairing.G1Point(uint256(0x1dcfbcc68c706725d95cae80087f4f803f7c628fd2ebed0c8d8f1c08efb000a2), uint256(0x1db5c895af5af97da17f06a993745f82dc6c3f43b862de01bb499821a2f07f7f));
vk.beta = Pairing.G2Point([uint256(0x14595f61ba4aede46e251c87d00e8f5ddd659e3a94f14212cabd8642e28f03b7), uint256(0x2ad520f86f05f729da4c87a6732a2b73b5594f54a3433ddbf9329a859717e893)], [uint256(0x12966aef85fa2cb49ba6c72aaf3b519a909369085de41a7a10db36f6aee9a333), uint256(0x2b2aa977f11a4b1d2fa1b43487a3b348fb78658b4948628ae8a0c77a27309607)]);
vk.gamma = Pairing.G2Point([uint256(0x0e646c79b92eb81e771a8beedcf750922d68c4cae6e674f28386f05db695f087), uint256(0x2f32db257bd38e510b2c46905bf42ee017eb8dd3736ecf94a63ee388e9dcf7c6)], [uint256(0x2bced1358c17d910723e709aefed3c3b9c127401fbb5b8196023af37eb6924a6), uint256(0x200c899f19599e02ee93c8287a7120147c6f8e001e9c7f7e5c643fce1a2aa94a)]);
vk.delta = Pairing.G2Point([uint256(0x1116bc1932e65897160357ba10be9222ec1e34adffa8b8c9182b60cac7752446), uint256(0x207f45a790597c02fd21413d5d9ed6bd4b633c18ead06295fe9a8b93562380d2)], [uint256(0x05de54e825005fa8bf89ded4db3448d013c2faa95f3e14e4f502ebb076b6ec42), uint256(0x04a769b3533c1f4394d7523639a81fb549d0f086313f93b605ada17b0d7aeaf5)]);
vk.gamma_abc = new Pairing.G1Point[](7);
vk.gamma_abc[0] = Pairing.G1Point(uint256(0x0a0b29d53e75e2681c6cf103f088f351971c06a78c1af4c2c3fad558bd480aba), uint256(0x014db04b3e5fbbd59699890460efd29b5df2491dcade336ed9e58f1920c9b091));
vk.gamma_abc[1] = Pairing.G1Point(uint256(0x0ab0d26e0b44acc3f6166a737f25c6b594f8ee0550b0b774a5fc1a9b1c90c2e5), uint256(0x2be4d4802073c03ab7a5160c0f1bfef2f1c8fb0ecfb61c2a2ddfa0f1d64b98f2));
vk.gamma_abc[2] = Pairing.G1Point(uint256(0x08539b6e4fa48392fa14e89394f52ff8ca375c23103bfc6f78af24152666cc57), uint256(0x16099e7289a9f2539a9d5abe3665ffaf7236de57ccb24cdff3e4cb8047709198));
vk.gamma_abc[3] = Pairing.G1Point(uint256(0x21e5733b57484e09646f512c1c0d95c6670d6701c7540b9487f4f08723c19bb8), uint256(0x11fb6e9d01ab0f58928f40f21da7beee62943aa3c2c5490100ffb6a09d8ce2e5));
vk.gamma_abc[4] = Pairing.G1Point(uint256(0x1ea9366f1bee313ec9786dc19facf5dccf3e47e23d9477e274b377e4272bceda), uint256(0x13b1db8802d9fc947ad2ab6ffce35e3e9b147ce6a79760886cefb4e9e4b0212e));
vk.gamma_abc[5] = Pairing.G1Point(uint256(0x186067a849502f2e7ce583156758d2aa6d10b98638374d897bd0ab1438f3e45d), uint256(0x2b777f559e2f11fe20903a6b6fe5808a73c93e278effadaad217701caae97063));
vk.gamma_abc[6] = Pairing.G1Point(uint256(0x151caaf5340893a1c7e92b6fcaa315046b38a29e5904b7f31088994a6554cf47), uint256(0x04ccd8e7e9a8637873c3fc75ae69afa761886cec6e78675f391ed008c20a0083));
}
function verify(uint[] memory input, Proof memory proof) internal view returns (uint) {
uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
VerifyingKey memory vk = verifyingKey();
require(input.length + 1 == vk.gamma_abc.length);
// Compute the linear combination vk_x
Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0);
for (uint i = 0; i < input.length; i++) {
require(input[i] < snark_scalar_field);
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.gamma_abc[i + 1], input[i]));
}
vk_x = Pairing.addition(vk_x, vk.gamma_abc[0]);
if(!Pairing.pairingProd4(
proof.a, proof.b,
Pairing.negate(vk_x), vk.gamma,
Pairing.negate(proof.c), vk.delta,
Pairing.negate(vk.alpha), vk.beta)) return 1;
return 0;
}
function verifyTx(
Proof memory proof, uint[6] memory input
) public view returns (bool r) {
uint[] memory inputValues = new uint[](6);
for(uint i = 0; i < input.length; i++){
inputValues[i] = input[i];
}
if (verify(inputValues, proof) == 0) {
return true;
} else {
return false;
}
}
// function verifyEncoded(Proof calldata proof, uint[] calldata input_) public view returns (bool r) {
// // (Proof memory proof, uint[25] memory input) = abi.decode(b, (Proof, uint[25]));
// uint[6] memory input;
// for (uint i = 0; i < 6; i++) {
// input[i] = input_[i];
// }
// return verifyTx(proof, input);
// }
}
interface IRootsMinimal {
function rootIsRecent(uint256 root) external view returns (bool isRecent);
}
interface IPaidProof {
function setPrice(uint newPrice) external;
function collectPayments() external;
function allowIssuers(uint[] memory issuerAddresses) external;
function revokeIssuers(uint[] memory issuerAddresses) external;
function isValidIssuer(uint issuerAddress) external view returns (bool);
}
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
* @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;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract PaidProof is IPaidProof, Ownable {
uint public price; // Price in ETH to use a function with the needsPayment modifier
mapping(uint => bool) public allowedIssuers; // Whitelist of issuers
constructor() {}
function setPrice(uint newPrice) public onlyOwner {
price = newPrice;
}
function collectPayments() public onlyOwner {
payable(owner()).transfer(address(this).balance);
}
modifier needsPayment() {
require(msg.value >= price, "Missing payment");
_;
}
function allowIssuers(uint[] memory issuerAddresses) public onlyOwner {
uint8 i;
for (i = 0; i < issuerAddresses.length; i++) {
allowedIssuers[issuerAddresses[i]] = true;
}
}
function revokeIssuers(uint[] memory issuerAddresses) public onlyOwner {
uint8 i;
for (i = 0; i < issuerAddresses.length; i++) {
allowedIssuers[issuerAddresses[i]] = false;
}
}
function isValidIssuer(uint issuerAddress) public view returns (bool) {
return allowedIssuers[issuerAddress];
}
}
contract AntiSybilVerifier {
using Pairing for *;
struct VerifyingKey {
Pairing.G1Point alpha;
Pairing.G2Point beta;
Pairing.G2Point gamma;
Pairing.G2Point delta;
Pairing.G1Point[] gamma_abc;
}
function verifyingKey() pure internal returns (VerifyingKey memory vk) {
vk.alpha = Pairing.G1Point(uint256(0x07cf3ea35ce89bd47ae7884ed63e681cdd2bcc9b1522c8513995b2efe1424bbc), uint256(0x0175240658c74aefc5d7e5f9298254ac527b06a541c5745375d8be7f6618f80a));
vk.beta = Pairing.G2Point([uint256(0x05b2d5f21d70e3e463cf78c09b6791c65b5a4e220a8e9f598a1eb07db21455fa), uint256(0x2f9e034fc8cd01282b990581a71b3c539a9e8b7670c9c4a7def9ed865c3254be)], [uint256(0x0049736bfe2b83a68f14c7ac8df40ed448eb85344f2116539497062b9628a014), uint256(0x1e49966ae8c5ad615d4f804a1a0733a0f9e0ec802e1102297d1aa89e545cc8b5)]);
vk.gamma = Pairing.G2Point([uint256(0x09b8b9280d1a535c41cd655d52beb176de2c75c7eaa27f683edc5c3b23fd4d23), uint256(0x2483cc62f2f655231a041c2efe3c0acf8ec228c662367e7643dde9486566083e)], [uint256(0x2acd04fbd40b56b330ae9b7fae61de45078063eef9dc2efa85ac07670c9a8710), uint256(0x289242c611532eb565c01dda2af7fdace4e181b429b1c522f09e2c45a41ec986)]);
vk.delta = Pairing.G2Point([uint256(0x1fb55ccd4e42f62ea22ec3f2343c6963503de5d52a5886e2de5600bdd6045edf), uint256(0x1a62735f741101477afc183dd602246d45a685556369fa8a3b59e23b3d6bb9b3)], [uint256(0x2d72c8f7af207f2456102b5714d78986ed97f6a1859ff03b808cd1bbafa0ff7d), uint256(0x1a4dacd7a48f92c49b9a0c1e764a70b254ce3f61b2fa138e095237293ce7c3b5)]);
vk.gamma_abc = new Pairing.G1Point[](6);
vk.gamma_abc[0] = Pairing.G1Point(uint256(0x2fbf2edc978f739425e24af07b701b0252aa5ed5fe6d0c1fa93f4e4e762b2043), uint256(0x234cf92ca5acb62d3ca271ef6aa2ca4bb011886016a4fbb38bd78bfd3a3b05ee));
vk.gamma_abc[1] = Pairing.G1Point(uint256(0x1cdeace3919620bbdf2c821ff7a5067d36ec9b3e3b291c5871447e675f72dd88), uint256(0x255816c023276c902fb1b59789fc4ff19b23cf0e63cdc34fbd9202e5947a5020));
vk.gamma_abc[2] = Pairing.G1Point(uint256(0x18e3ec6edb610ebaaec15f751bf8173d6336d2c5b09b288b9c8a9d4787983935), uint256(0x272e548acd302e7fbda87612c1d68d737f1d816586e2a236b71e80cdd4cc3e07));
vk.gamma_abc[3] = Pairing.G1Point(uint256(0x2998028f89a5496e4adb5332b22a054b9c843c4f54dcdca0951444157f0c8db0), uint256(0x11faaa550f3ab63790adb6594e6bd9017e8253e416a4380ab7b8565acfcb82db));
vk.gamma_abc[4] = Pairing.G1Point(uint256(0x09a638226cfc46ac9661a3b62870302d3ff62a958ae2b5d141cba275a59932f3), uint256(0x0d46745c05f8ece61658144223e895c54f087cad3923b5e7e3cf44353ab35046));
vk.gamma_abc[5] = Pairing.G1Point(uint256(0x26b78e89f8c6fad685ff502edc6d501adf0fff4ca04439412ca7c40a71543df8), uint256(0x0eca22c5c5523eb363bb9df6a48421816aec29029d3d88ce2f4eeb595bf58870));
}
function verify(uint[] memory input, Proof memory proof) internal view returns (uint) {
uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
VerifyingKey memory vk = verifyingKey();
require(input.length + 1 == vk.gamma_abc.length);
// Compute the linear combination vk_x
Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0);
for (uint i = 0; i < input.length; i++) {
require(input[i] < snark_scalar_field);
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.gamma_abc[i + 1], input[i]));
}
vk_x = Pairing.addition(vk_x, vk.gamma_abc[0]);
if(!Pairing.pairingProd4(
proof.a, proof.b,
Pairing.negate(vk_x), vk.gamma,
Pairing.negate(proof.c), vk.delta,
Pairing.negate(vk.alpha), vk.beta)) return 1;
return 0;
}
function verifyTx(
Proof memory proof, uint[5] memory input
) public view returns (bool r) {
uint[] memory inputValues = new uint[](5);
for(uint i = 0; i < input.length; i++){
inputValues[i] = input[i];
}
if (verify(inputValues, proof) == 0) {
return true;
} else {
return false;
}
}
// function verifyEncoded(Proof calldata proof, uint[] calldata input_) public view returns (bool r) {
// // (Proof memory proof, uint[25] memory input) = abi.decode(b, (Proof, uint[25]));
// uint[5] memory input;
// for (uint i = 0; i < 5; i++) {
// input[i] = input_[i];
// }
// return verifyTx(proof, input);
// }
}
interface ISybilResistance {
function isUniqueForAction(address,uint256) external view returns (bool);
}
contract SybilResistance is PaidProof {
// Stores all used footprints
mapping(uint256 => bool) public masalaWasUsed;
// When *address* verifies they're unique for *actionId*, keccak256(address, actionId) will be stored as true:
mapping(bytes32 => bool) verifications;
// And an event will be emitted:
event Uniqueness(address userAddr, uint actionId);
AntiSybilVerifier verifier;
IRootsMinimal roots;
// allow for backwards compatability by also accepting users who verified in the old contract
bool legacySupport;
ISybilResistance oldContract;
constructor(address roots_, uint[] memory issuers_, uint price_, address oldContract_) {
roots = IRootsMinimal(roots_);
verifier = new AntiSybilVerifier();
allowIssuers(issuers_);
setPrice(price_);
if(oldContract_ != address(0)) {
legacySupport = true;
oldContract = ISybilResistance(oldContract_);
}
}
function isUniqueForAction(address addr, uint actionId) public view returns (bool unique) {
return (
verifications[keccak256(abi.encodePacked(addr, actionId))]) ||
(legacySupport && oldContract.isUniqueForAction(addr, actionId)
);
}
// It is useful to separate this from the prove() function which is changes state, so that somebody can call this off-chain as a view function.
// Then, they can maintain their own off-chain list of footprints and verified address
function proofIsValid(Proof calldata proof, uint[5] memory input) public view returns (bool isValid) {
require(roots.rootIsRecent(input[0]), "The root provided was not found in the Merkle tree's recent root list");
// Checking msg.sender no longer seems very necessary and prevents signature-free interactions. Without it, relayers can submit cross-chain transactions without the user signature. Thus, we are deprecating this check:
// require(uint256(uint160(msg.sender)) == input[1], "Second public argument of proof must be your address");
require(isValidIssuer(input[2]), "Proof must come from correct issuer's address");
require(!masalaWasUsed[input[4]], "One person can only verify once");
require(verifier.verifyTx(proof, input), "Failed to verify ZKP");
return true;
}
/// @param proof PairingAndProof.sol Proof struct
/// @param input The public inputs to the proof, in ZoKrates' format
function prove(Proof calldata proof, uint256[5] calldata input) public payable needsPayment {
require(proofIsValid(proof, input));
masalaWasUsed[input[4]] = true; //input[4] is address
bytes32 commit = keccak256(abi.encodePacked(uint160(input[1]), input[3])); //input[1] is address of user to be registered for actionId, input[3] is actionId
verifications[commit] = true;
emit Uniqueness(msg.sender, input[3]);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"roots_","type":"address"},{"internalType":"uint256[]","name":"issuers_","type":"uint256[]"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"address","name":"oldContract_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"actionId","type":"uint256"}],"name":"Uniqueness","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"issuerAddresses","type":"uint256[]"}],"name":"allowIssuers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowedIssuers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"actionId","type":"uint256"}],"name":"isUniqueForAction","outputs":[{"internalType":"bool","name":"unique","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"issuerAddress","type":"uint256"}],"name":"isValidIssuer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"masalaWasUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"a","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"b","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"c","type":"tuple"}],"internalType":"struct Proof","name":"proof","type":"tuple"},{"internalType":"uint256[5]","name":"input","type":"uint256[5]"}],"name":"proofIsValid","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"a","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"b","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"c","type":"tuple"}],"internalType":"struct Proof","name":"proof","type":"tuple"},{"internalType":"uint256[5]","name":"input","type":"uint256[5]"}],"name":"prove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"issuerAddresses","type":"uint256[]"}],"name":"revokeIssuers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620038553803806200385583398181016040528101906200003791906200061f565b620000576200004b620001c260201b60201c565b620001ca60201b60201c565b83600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620000a690620003e8565b604051809103906000f080158015620000c3573d6000803e3d6000fd5b50600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000115836200028e60201b60201c565b62000126826200031460201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620001b8576001600660146101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050620007cd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029e6200032e60201b60201c565b60005b81518160ff1610156200031057600160026000848460ff1681518110620002cd57620002cc620006b0565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808062000307906200071b565b915050620002a1565b5050565b620003246200032e60201b60201c565b8060018190555050565b6200033e620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000364620003bf60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b490620007ab565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116f8806200215d83390190565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000437826200040a565b9050919050565b62000449816200042a565b81146200045557600080fd5b50565b60008151905062000469816200043e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004bf8262000474565b810181811067ffffffffffffffff82111715620004e157620004e062000485565b5b80604052505050565b6000620004f6620003f6565b9050620005048282620004b4565b919050565b600067ffffffffffffffff82111562000527576200052662000485565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b62000552816200053d565b81146200055e57600080fd5b50565b600081519050620005728162000547565b92915050565b60006200058f620005898462000509565b620004ea565b90508083825260208201905060208402830185811115620005b557620005b462000538565b5b835b81811015620005e25780620005cd888262000561565b845260208401935050602081019050620005b7565b5050509392505050565b600082601f8301126200060457620006036200046f565b5b81516200061684826020860162000578565b91505092915050565b600080600080608085870312156200063c576200063b62000400565b5b60006200064c8782880162000458565b945050602085015167ffffffffffffffff81111562000670576200066f62000405565b5b6200067e87828801620005ec565b9350506040620006918782880162000561565b9250506060620006a48782880162000458565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b600062000728826200070e565b915060ff8214156200073f576200073e620006df565b5b600182019050919050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007936020836200074a565b9150620007a0826200075b565b602082019050919050565b60006020820190508181036000830152620007c68162000784565b9050919050565b61198080620007dd6000396000f3fe6080604052600436106100dd5760003560e01c806391b7f5ed1161007f578063c3f243af11610059578063c3f243af1461029d578063ce072163146102da578063f175a2d7146102f1578063f2fde38b1461032e576100dd565b806391b7f5ed1461020c57806396248d1214610235578063a035b1fe14610272576100dd565b8063775d0df0116100bb578063775d0df01461015f5780637fb0ac831461019c5780638da5cb5b146101c5578063903a4d31146101f0576100dd565b80635022a31f146100e25780636bd09a531461011f578063715018a614610148575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610e84565b610357565b6040516101169190610ee1565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610fbf565b61062a565b005b34801561015457600080fd5b5061015d6106a1565b005b34801561016b57600080fd5b5061018660048036038101906101819190611008565b6106b5565b6040516101939190610ee1565b60405180910390f35b3480156101a857600080fd5b506101c360048036038101906101be9190610fbf565b6106d5565b005b3480156101d157600080fd5b506101da61074c565b6040516101e79190611076565b60405180910390f35b61020a600480360381019061020591906110b3565b610775565b005b34801561021857600080fd5b50610233600480360381019061022e9190611008565b610927565b005b34801561024157600080fd5b5061025c60048036038101906102579190611121565b610939565b6040516102699190610ee1565b60405180910390f35b34801561027e57600080fd5b50610287610a58565b6040516102949190611170565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190611008565b610a5e565b6040516102d19190610ee1565b60405180910390f35b3480156102e657600080fd5b506102ef610a7e565b005b3480156102fd57600080fd5b5061031860048036038101906103139190611008565b610ad6565b6040516103259190610ee1565b60405180910390f35b34801561033a57600080fd5b506103556004803603810190610350919061118b565b610b00565b005b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d61af5c836000600581106103ab576103aa6111b8565b5b60200201516040518263ffffffff1660e01b81526004016103cc9190611170565b60206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190611213565b61045b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610452906112e9565b60405180910390fd5b61047c82600260058110610472576104716111b8565b5b6020020151610ad6565b6104bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b29061137b565b60405180910390fd5b60036000836004600581106104d3576104d26111b8565b5b6020020151815260200190815260200160002060009054906101000a900460ff1615610534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052b906113e7565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bcb9988684846040518363ffffffff1660e01b81526004016105919291906115e2565b60206040518083038186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190611213565b610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790611659565b60405180910390fd5b6001905092915050565b610632610b84565b60005b81518160ff16101561069d57600060026000848460ff168151811061065d5761065c6111b8565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610695906116b5565b915050610635565b5050565b6106a9610b84565b6106b36000610c02565b565b60036020528060005260406000206000915054906101000a900460ff1681565b6106dd610b84565b60005b81518160ff16101561074857600160026000848460ff1681518110610708576107076111b8565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610740906116b5565b9150506106e0565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6001543410156107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b19061172b565b60405180910390fd5b6107fb82826005806020026040519081016040528092919082600560200280828437600081840152601f19601f820116905080830192505050505050610357565b61080457600080fd5b6001600360008360046005811061081e5761081d6111b8565b5b6020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008160016005811061085e5761085d6111b8565b5b602002013582600360058110610877576108766111b8565b5b602002013560405160200161088d9291906117a2565b60405160208183030381529060405280519060200120905060016004600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd198fa8523413333ec863279d1630fa354ecc8b110ae00f9ca98c8b498fb46873383600360058110610907576109066111b8565b5b602002013560405161091a9291906117ce565b60405180910390a1505050565b61092f610b84565b8060018190555050565b6000600460008484604051602001610952929190611820565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff1680610a505750600660149054906101000a900460ff168015610a4f5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396248d1284846040518363ffffffff1660e01b81526004016109fe9291906117ce565b60206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190611213565b5b5b905092915050565b60015481565b60026020528060005260406000206000915054906101000a900460ff1681565b610a86610b84565b610a8e61074c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ad3573d6000803e3d6000fd5b50565b60006002600083815260200190815260200160002060009054906101000a900460ff169050919050565b610b08610b84565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906118be565b60405180910390fd5b610b8181610c02565b50565b610b8c610cc6565b73ffffffffffffffffffffffffffffffffffffffff16610baa61074c565b73ffffffffffffffffffffffffffffffffffffffff1614610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf79061192a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b60006101008284031215610cfe57610cfd610ce2565b5b81905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d5582610d0c565b810181811067ffffffffffffffff82111715610d7457610d73610d1d565b5b80604052505050565b6000610d87610cce565b9050610d938282610d4c565b919050565b600067ffffffffffffffff821115610db357610db2610d1d565b5b602082029050919050565b600080fd5b6000819050919050565b610dd681610dc3565b8114610de157600080fd5b50565b600081359050610df381610dcd565b92915050565b6000610e0c610e0784610d98565b610d7d565b90508060208402830185811115610e2657610e25610dbe565b5b835b81811015610e4f5780610e3b8882610de4565b845260208401935050602081019050610e28565b5050509392505050565b600082601f830112610e6e57610e6d610d07565b5b6005610e7b848285610df9565b91505092915050565b6000806101a08385031215610e9c57610e9b610cd8565b5b6000610eaa85828601610ce7565b925050610100610ebc85828601610e59565b9150509250929050565b60008115159050919050565b610edb81610ec6565b82525050565b6000602082019050610ef66000830184610ed2565b92915050565b600067ffffffffffffffff821115610f1757610f16610d1d565b5b602082029050602081019050919050565b6000610f3b610f3684610efc565b610d7d565b90508083825260208201905060208402830185811115610f5e57610f5d610dbe565b5b835b81811015610f875780610f738882610de4565b845260208401935050602081019050610f60565b5050509392505050565b600082601f830112610fa657610fa5610d07565b5b8135610fb6848260208601610f28565b91505092915050565b600060208284031215610fd557610fd4610cd8565b5b600082013567ffffffffffffffff811115610ff357610ff2610cdd565b5b610fff84828501610f91565b91505092915050565b60006020828403121561101e5761101d610cd8565b5b600061102c84828501610de4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061106082611035565b9050919050565b61107081611055565b82525050565b600060208201905061108b6000830184611067565b92915050565b6000819050826020600502820111156110ad576110ac610dbe565b5b92915050565b6000806101a083850312156110cb576110ca610cd8565b5b60006110d985828601610ce7565b9250506101006110eb85828601611091565b9150509250929050565b6110fe81611055565b811461110957600080fd5b50565b60008135905061111b816110f5565b92915050565b6000806040838503121561113857611137610cd8565b5b60006111468582860161110c565b925050602061115785828601610de4565b9150509250929050565b61116a81610dc3565b82525050565b60006020820190506111856000830184611161565b92915050565b6000602082840312156111a1576111a0610cd8565b5b60006111af8482850161110c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6111f081610ec6565b81146111fb57600080fd5b50565b60008151905061120d816111e7565b92915050565b60006020828403121561122957611228610cd8565b5b6000611237848285016111fe565b91505092915050565b600082825260208201905092915050565b7f54686520726f6f742070726f766964656420776173206e6f7420666f756e642060008201527f696e20746865204d65726b6c652074726565277320726563656e7420726f6f7460208201527f206c697374000000000000000000000000000000000000000000000000000000604082015250565b60006112d3604583611240565b91506112de82611251565b606082019050919050565b60006020820190508181036000830152611302816112c6565b9050919050565b7f50726f6f66206d75737420636f6d652066726f6d20636f72726563742069737360008201527f7565722773206164647265737300000000000000000000000000000000000000602082015250565b6000611365602d83611240565b915061137082611309565b604082019050919050565b6000602082019050818103600083015261139481611358565b9050919050565b7f4f6e6520706572736f6e2063616e206f6e6c7920766572696679206f6e636500600082015250565b60006113d1601f83611240565b91506113dc8261139b565b602082019050919050565b60006020820190508181036000830152611400816113c4565b9050919050565b600082905092915050565b60006114216020840184610de4565b905092915050565b61143281610dc3565b82525050565b604082016114496000830183611412565b6114566000850182611429565b506114646020830183611412565b6114716020850182611429565b50505050565b600082905092915050565b600082905092915050565b82818337600083830152505050565b6114a86040838361148d565b5050565b608082016114bd6000830183611482565b6114ca600085018261149c565b506114d86040830183611482565b6114e5604085018261149c565b50505050565b61010082016114fd6000830183611407565b61150a6000850182611438565b506115186040830183611477565b61152560408501826114ac565b5061153360c0830183611407565b61154060c0850182611438565b50505050565b600060059050919050565b600081905092915050565b6000819050919050565b60006115728383611429565b60208301905092915050565b6000602082019050919050565b61159481611546565b61159e8184611551565b92506115a98261155c565b8060005b838110156115da5781516115c18782611566565b96506115cc8361157e565b9250506001810190506115ad565b505050505050565b60006101a0820190506115f860008301856114eb565b61160661010083018461158b565b9392505050565b7f4661696c656420746f20766572696679205a4b50000000000000000000000000600082015250565b6000611643601483611240565b915061164e8261160d565b602082019050919050565b6000602082019050818103600083015261167281611636565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b60006116c0826116a8565b915060ff8214156116d4576116d3611679565b5b600182019050919050565b7f4d697373696e67207061796d656e740000000000000000000000000000000000600082015250565b6000611715600f83611240565b9150611720826116df565b602082019050919050565b6000602082019050818103600083015261174481611708565b9050919050565b60008160601b9050919050565b60006117638261174b565b9050919050565b61177b61177682611035565b611758565b82525050565b6000819050919050565b61179c61179782610dc3565b611781565b82525050565b60006117ae828561176a565b6014820191506117be828461178b565b6020820191508190509392505050565b60006040820190506117e36000830185611067565b6117f06020830184611161565b9392505050565b600061180282611758565b9050919050565b61181a61181582611055565b6117f7565b82525050565b600061182c8285611809565b60148201915061183c828461178b565b6020820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006118a8602683611240565b91506118b38261184c565b604082019050919050565b600060208201905081810360008301526118d78161189b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611914602083611240565b915061191f826118de565b602082019050919050565b6000602082019050818103600083015261194381611907565b905091905056fea26469706673582212202947c55672ae4574e91719254617011bbc0c8c9a39506c5c5b9ccbf064f5aabd64736f6c63430008090033608060405234801561001057600080fd5b506116d8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bcb9988614610030575b600080fd5b61004a6004803603810190610045919061143f565b610060565b604051610057919061149c565b60405180910390f35b600080600567ffffffffffffffff81111561007e5761007d61111d565b5b6040519080825280602002602001820160405280156100ac5781602001602082028036833780820191505090505b50905060005b6005811015610105578381600581106100ce576100cd6114b7565b5b60200201518282815181106100e6576100e56114b7565b5b60200260200101818152505080806100fd90611515565b9150506100b2565b506000610112828661012e565b1415610122576001915050610128565b60009150505b92915050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019050600061015e6102c5565b905080608001515160018651610174919061155e565b1461017e57600080fd5b60006040518060400160405280600081526020016000815250905060005b865181101561023757838782815181106101b9576101b86114b7565b5b6020026020010151106101cb57600080fd5b6102228261021d85608001516001856101e4919061155e565b815181106101f5576101f46114b7565b5b60200260200101518a85815181106102105761020f6114b7565b5b60200260200101516108a8565b61094f565b9150808061022f90611515565b91505061019c565b50610261818360800151600081518110610254576102536114b7565b5b602002602001015161094f565b90506102a78560000151866020015161027984610a1c565b856040015161028b8a60400151610a1c565b876060015161029d8960000151610a1c565b8960200151610ac1565b6102b757600193505050506102bf565b600093505050505b92915050565b6102cd610fe9565b60405180604001604052807f07cf3ea35ce89bd47ae7884ed63e681cdd2bcc9b1522c8513995b2efe1424bbc81526020017f0175240658c74aefc5d7e5f9298254ac527b06a541c5745375d8be7f6618f80a8152508160000181905250604051806040016040528060405180604001604052807f05b2d5f21d70e3e463cf78c09b6791c65b5a4e220a8e9f598a1eb07db21455fa81526020017f2f9e034fc8cd01282b990581a71b3c539a9e8b7670c9c4a7def9ed865c3254be815250815260200160405180604001604052807e49736bfe2b83a68f14c7ac8df40ed448eb85344f2116539497062b9628a01481526020017f1e49966ae8c5ad615d4f804a1a0733a0f9e0ec802e1102297d1aa89e545cc8b58152508152508160200181905250604051806040016040528060405180604001604052807f09b8b9280d1a535c41cd655d52beb176de2c75c7eaa27f683edc5c3b23fd4d2381526020017f2483cc62f2f655231a041c2efe3c0acf8ec228c662367e7643dde9486566083e815250815260200160405180604001604052807f2acd04fbd40b56b330ae9b7fae61de45078063eef9dc2efa85ac07670c9a871081526020017f289242c611532eb565c01dda2af7fdace4e181b429b1c522f09e2c45a41ec9868152508152508160400181905250604051806040016040528060405180604001604052807f1fb55ccd4e42f62ea22ec3f2343c6963503de5d52a5886e2de5600bdd6045edf81526020017f1a62735f741101477afc183dd602246d45a685556369fa8a3b59e23b3d6bb9b3815250815260200160405180604001604052807f2d72c8f7af207f2456102b5714d78986ed97f6a1859ff03b808cd1bbafa0ff7d81526020017f1a4dacd7a48f92c49b9a0c1e764a70b254ce3f61b2fa138e095237293ce7c3b58152508152508160600181905250600667ffffffffffffffff8111156105935761059261111d565b5b6040519080825280602002602001820160405280156105cc57816020015b6105b9611030565b8152602001906001900390816105b15790505b50816080018190525060405180604001604052807f2fbf2edc978f739425e24af07b701b0252aa5ed5fe6d0c1fa93f4e4e762b204381526020017f234cf92ca5acb62d3ca271ef6aa2ca4bb011886016a4fbb38bd78bfd3a3b05ee8152508160800151600081518110610642576106416114b7565b5b602002602001018190525060405180604001604052807f1cdeace3919620bbdf2c821ff7a5067d36ec9b3e3b291c5871447e675f72dd8881526020017f255816c023276c902fb1b59789fc4ff19b23cf0e63cdc34fbd9202e5947a502081525081608001516001815181106106ba576106b96114b7565b5b602002602001018190525060405180604001604052807f18e3ec6edb610ebaaec15f751bf8173d6336d2c5b09b288b9c8a9d478798393581526020017f272e548acd302e7fbda87612c1d68d737f1d816586e2a236b71e80cdd4cc3e078152508160800151600281518110610732576107316114b7565b5b602002602001018190525060405180604001604052807f2998028f89a5496e4adb5332b22a054b9c843c4f54dcdca0951444157f0c8db081526020017f11faaa550f3ab63790adb6594e6bd9017e8253e416a4380ab7b8565acfcb82db81525081608001516003815181106107aa576107a96114b7565b5b602002602001018190525060405180604001604052807f09a638226cfc46ac9661a3b62870302d3ff62a958ae2b5d141cba275a59932f381526020017f0d46745c05f8ece61658144223e895c54f087cad3923b5e7e3cf44353ab350468152508160800151600481518110610822576108216114b7565b5b602002602001018190525060405180604001604052807f26b78e89f8c6fad685ff502edc6d501adf0fff4ca04439412ca7c40a71543df881526020017f0eca22c5c5523eb363bb9df6a48421816aec29029d3d88ce2f4eeb595bf58870815250816080015160058151811061089a576108996114b7565b5b602002602001018190525090565b6108b0611030565b6108b861104a565b8360000151816000600381106108d1576108d06114b7565b5b6020020181815250508360200151816001600381106108f3576108f26114b7565b5b6020020181815250508281600260038110610911576109106114b7565b5b602002018181525050600060608360808460076107d05a03fa9050806000811461093a5761093c565bfe5b508061094757600080fd5b505092915050565b610957611030565b61095f61106c565b836000015181600060048110610978576109776114b7565b5b60200201818152505083602001518160016004811061099a576109996114b7565b5b6020020181815250508260000151816002600481106109bc576109bb6114b7565b5b6020020181815250508260200151816003600481106109de576109dd6114b7565b5b602002018181525050600060608360c08460066107d05a03fa90508060008114610a0757610a09565bfe5b5080610a1457600080fd5b505092915050565b610a24611030565b60007f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060008360000151148015610a61575060008360200151145b15610a85576040518060400160405280600081526020016000815250915050610abc565b604051806040016040528084600001518152602001828560200151610aaa91906115e3565b83610ab59190611614565b8152509150505b919050565b600080600467ffffffffffffffff811115610adf57610ade61111d565b5b604051908082528060200260200182016040528015610b1857816020015b610b05611030565b815260200190600190039081610afd5790505b5090506000600467ffffffffffffffff811115610b3857610b3761111d565b5b604051908082528060200260200182016040528015610b7157816020015b610b5e61108e565b815260200190600190039081610b565790505b5090508a82600081518110610b8957610b886114b7565b5b60200260200101819052508882600181518110610ba957610ba86114b7565b5b60200260200101819052508682600281518110610bc957610bc86114b7565b5b60200260200101819052508482600381518110610be957610be86114b7565b5b60200260200101819052508981600081518110610c0957610c086114b7565b5b60200260200101819052508781600181518110610c2957610c286114b7565b5b60200260200101819052508581600281518110610c4957610c486114b7565b5b60200260200101819052508381600381518110610c6957610c686114b7565b5b6020026020010181905250610c7e8282610c8e565b9250505098975050505050505050565b60008151835114610c9e57600080fd5b6000835190506000600682610cb39190611648565b905060008167ffffffffffffffff811115610cd157610cd061111d565b5b604051908082528060200260200182016040528015610cff5781602001602082028036833780820191505090505b50905060005b83811015610f8457868181518110610d2057610d1f6114b7565b5b602002602001015160000151826000600684610d3c9190611648565b610d46919061155e565b81518110610d5757610d566114b7565b5b602002602001018181525050868181518110610d7657610d756114b7565b5b602002602001015160200151826001600684610d929190611648565b610d9c919061155e565b81518110610dad57610dac6114b7565b5b602002602001018181525050858181518110610dcc57610dcb6114b7565b5b602002602001015160000151600160028110610deb57610dea6114b7565b5b6020020151826002600684610e009190611648565b610e0a919061155e565b81518110610e1b57610e1a6114b7565b5b602002602001018181525050858181518110610e3a57610e396114b7565b5b602002602001015160000151600060028110610e5957610e586114b7565b5b6020020151826003600684610e6e9190611648565b610e78919061155e565b81518110610e8957610e886114b7565b5b602002602001018181525050858181518110610ea857610ea76114b7565b5b602002602001015160200151600160028110610ec757610ec66114b7565b5b6020020151826004600684610edc9190611648565b610ee6919061155e565b81518110610ef757610ef66114b7565b5b602002602001018181525050858181518110610f1657610f156114b7565b5b602002602001015160200151600060028110610f3557610f346114b7565b5b6020020151826005600684610f4a9190611648565b610f54919061155e565b81518110610f6557610f646114b7565b5b6020026020010181815250508080610f7c90611515565b915050610d05565b50610f8d6110b4565b6000602082602086026020860160086107d05a03fa90508060008114610fb257610fb4565bfe5b5080610fbf57600080fd5b600082600060018110610fd557610fd46114b7565b5b602002015114159550505050505092915050565b6040518060a00160405280610ffc611030565b815260200161100961108e565b815260200161101661108e565b815260200161102361108e565b8152602001606081525090565b604051806040016040528060008152602001600081525090565b6040518060600160405280600390602082028036833780820191505090505090565b6040518060800160405280600490602082028036833780820191505090505090565b60405180604001604052806110a16110d6565b81526020016110ae6110d6565b81525090565b6040518060200160405280600190602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6111558261110c565b810181811067ffffffffffffffff821117156111745761117361111d565b5b80604052505050565b60006111876110f8565b9050611193828261114c565b919050565b6000819050919050565b6111ab81611198565b81146111b657600080fd5b50565b6000813590506111c8816111a2565b92915050565b6000604082840312156111e4576111e3611107565b5b6111ee604061117d565b905060006111fe848285016111b9565b6000830152506020611212848285016111b9565b60208301525092915050565b600080fd5b600067ffffffffffffffff82111561123e5761123d61111d565b5b602082029050919050565b600080fd5b600061126161125c84611223565b61117d565b9050806020840283018581111561127b5761127a611249565b5b835b818110156112a4578061129088826111b9565b84526020840193505060208101905061127d565b5050509392505050565b600082601f8301126112c3576112c261121e565b5b60026112d084828561124e565b91505092915050565b6000608082840312156112ef576112ee611107565b5b6112f9604061117d565b90506000611309848285016112ae565b600083015250604061131d848285016112ae565b60208301525092915050565b600061010082840312156113405761133f611107565b5b61134a606061117d565b9050600061135a848285016111ce565b600083015250604061136e848285016112d9565b60208301525060c0611382848285016111ce565b60408301525092915050565b600067ffffffffffffffff8211156113a9576113a861111d565b5b602082029050919050565b60006113c76113c28461138e565b61117d565b905080602084028301858111156113e1576113e0611249565b5b835b8181101561140a57806113f688826111b9565b8452602084019350506020810190506113e3565b5050509392505050565b600082601f8301126114295761142861121e565b5b60056114368482856113b4565b91505092915050565b6000806101a0838503121561145757611456611102565b5b600061146585828601611329565b92505061010061147785828601611414565b9150509250929050565b60008115159050919050565b61149681611481565b82525050565b60006020820190506114b1600083018461148d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061152082611198565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611553576115526114e6565b5b600182019050919050565b600061156982611198565b915061157483611198565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156115a9576115a86114e6565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006115ee82611198565b91506115f983611198565b925082611609576116086115b4565b5b828206905092915050565b600061161f82611198565b915061162a83611198565b92508282101561163d5761163c6114e6565b5b828203905092915050565b600061165382611198565b915061165e83611198565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611697576116966114e6565b5b82820290509291505056fea2646970667358221220dc9d99ad4efc49bf67d59d33972a0d191e94df7a3d73e1f3679f7e87a8ce87a964736f6c63430008090033000000000000000000000000b316940b687daa87392157e2ecfec1b9e182423d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003497556f7d0bf602d4237ecb8ae92840d09e4f630000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c8834c1fcf0df6623fc8c8ed25064a4148d9938803fae82f38bf01d9799d57fdda64fad4ac44e4c2c2f16c5bf8e1873d0a3e1993
Deployed Bytecode
0x6080604052600436106100dd5760003560e01c806391b7f5ed1161007f578063c3f243af11610059578063c3f243af1461029d578063ce072163146102da578063f175a2d7146102f1578063f2fde38b1461032e576100dd565b806391b7f5ed1461020c57806396248d1214610235578063a035b1fe14610272576100dd565b8063775d0df0116100bb578063775d0df01461015f5780637fb0ac831461019c5780638da5cb5b146101c5578063903a4d31146101f0576100dd565b80635022a31f146100e25780636bd09a531461011f578063715018a614610148575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610e84565b610357565b6040516101169190610ee1565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610fbf565b61062a565b005b34801561015457600080fd5b5061015d6106a1565b005b34801561016b57600080fd5b5061018660048036038101906101819190611008565b6106b5565b6040516101939190610ee1565b60405180910390f35b3480156101a857600080fd5b506101c360048036038101906101be9190610fbf565b6106d5565b005b3480156101d157600080fd5b506101da61074c565b6040516101e79190611076565b60405180910390f35b61020a600480360381019061020591906110b3565b610775565b005b34801561021857600080fd5b50610233600480360381019061022e9190611008565b610927565b005b34801561024157600080fd5b5061025c60048036038101906102579190611121565b610939565b6040516102699190610ee1565b60405180910390f35b34801561027e57600080fd5b50610287610a58565b6040516102949190611170565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190611008565b610a5e565b6040516102d19190610ee1565b60405180910390f35b3480156102e657600080fd5b506102ef610a7e565b005b3480156102fd57600080fd5b5061031860048036038101906103139190611008565b610ad6565b6040516103259190610ee1565b60405180910390f35b34801561033a57600080fd5b506103556004803603810190610350919061118b565b610b00565b005b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d61af5c836000600581106103ab576103aa6111b8565b5b60200201516040518263ffffffff1660e01b81526004016103cc9190611170565b60206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190611213565b61045b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610452906112e9565b60405180910390fd5b61047c82600260058110610472576104716111b8565b5b6020020151610ad6565b6104bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b29061137b565b60405180910390fd5b60036000836004600581106104d3576104d26111b8565b5b6020020151815260200190815260200160002060009054906101000a900460ff1615610534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052b906113e7565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bcb9988684846040518363ffffffff1660e01b81526004016105919291906115e2565b60206040518083038186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e19190611213565b610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790611659565b60405180910390fd5b6001905092915050565b610632610b84565b60005b81518160ff16101561069d57600060026000848460ff168151811061065d5761065c6111b8565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610695906116b5565b915050610635565b5050565b6106a9610b84565b6106b36000610c02565b565b60036020528060005260406000206000915054906101000a900460ff1681565b6106dd610b84565b60005b81518160ff16101561074857600160026000848460ff1681518110610708576107076111b8565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610740906116b5565b9150506106e0565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6001543410156107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b19061172b565b60405180910390fd5b6107fb82826005806020026040519081016040528092919082600560200280828437600081840152601f19601f820116905080830192505050505050610357565b61080457600080fd5b6001600360008360046005811061081e5761081d6111b8565b5b6020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555060008160016005811061085e5761085d6111b8565b5b602002013582600360058110610877576108766111b8565b5b602002013560405160200161088d9291906117a2565b60405160208183030381529060405280519060200120905060016004600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd198fa8523413333ec863279d1630fa354ecc8b110ae00f9ca98c8b498fb46873383600360058110610907576109066111b8565b5b602002013560405161091a9291906117ce565b60405180910390a1505050565b61092f610b84565b8060018190555050565b6000600460008484604051602001610952929190611820565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff1680610a505750600660149054906101000a900460ff168015610a4f5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396248d1284846040518363ffffffff1660e01b81526004016109fe9291906117ce565b60206040518083038186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190611213565b5b5b905092915050565b60015481565b60026020528060005260406000206000915054906101000a900460ff1681565b610a86610b84565b610a8e61074c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ad3573d6000803e3d6000fd5b50565b60006002600083815260200190815260200160002060009054906101000a900460ff169050919050565b610b08610b84565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906118be565b60405180910390fd5b610b8181610c02565b50565b610b8c610cc6565b73ffffffffffffffffffffffffffffffffffffffff16610baa61074c565b73ffffffffffffffffffffffffffffffffffffffff1614610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf79061192a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b60006101008284031215610cfe57610cfd610ce2565b5b81905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d5582610d0c565b810181811067ffffffffffffffff82111715610d7457610d73610d1d565b5b80604052505050565b6000610d87610cce565b9050610d938282610d4c565b919050565b600067ffffffffffffffff821115610db357610db2610d1d565b5b602082029050919050565b600080fd5b6000819050919050565b610dd681610dc3565b8114610de157600080fd5b50565b600081359050610df381610dcd565b92915050565b6000610e0c610e0784610d98565b610d7d565b90508060208402830185811115610e2657610e25610dbe565b5b835b81811015610e4f5780610e3b8882610de4565b845260208401935050602081019050610e28565b5050509392505050565b600082601f830112610e6e57610e6d610d07565b5b6005610e7b848285610df9565b91505092915050565b6000806101a08385031215610e9c57610e9b610cd8565b5b6000610eaa85828601610ce7565b925050610100610ebc85828601610e59565b9150509250929050565b60008115159050919050565b610edb81610ec6565b82525050565b6000602082019050610ef66000830184610ed2565b92915050565b600067ffffffffffffffff821115610f1757610f16610d1d565b5b602082029050602081019050919050565b6000610f3b610f3684610efc565b610d7d565b90508083825260208201905060208402830185811115610f5e57610f5d610dbe565b5b835b81811015610f875780610f738882610de4565b845260208401935050602081019050610f60565b5050509392505050565b600082601f830112610fa657610fa5610d07565b5b8135610fb6848260208601610f28565b91505092915050565b600060208284031215610fd557610fd4610cd8565b5b600082013567ffffffffffffffff811115610ff357610ff2610cdd565b5b610fff84828501610f91565b91505092915050565b60006020828403121561101e5761101d610cd8565b5b600061102c84828501610de4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061106082611035565b9050919050565b61107081611055565b82525050565b600060208201905061108b6000830184611067565b92915050565b6000819050826020600502820111156110ad576110ac610dbe565b5b92915050565b6000806101a083850312156110cb576110ca610cd8565b5b60006110d985828601610ce7565b9250506101006110eb85828601611091565b9150509250929050565b6110fe81611055565b811461110957600080fd5b50565b60008135905061111b816110f5565b92915050565b6000806040838503121561113857611137610cd8565b5b60006111468582860161110c565b925050602061115785828601610de4565b9150509250929050565b61116a81610dc3565b82525050565b60006020820190506111856000830184611161565b92915050565b6000602082840312156111a1576111a0610cd8565b5b60006111af8482850161110c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6111f081610ec6565b81146111fb57600080fd5b50565b60008151905061120d816111e7565b92915050565b60006020828403121561122957611228610cd8565b5b6000611237848285016111fe565b91505092915050565b600082825260208201905092915050565b7f54686520726f6f742070726f766964656420776173206e6f7420666f756e642060008201527f696e20746865204d65726b6c652074726565277320726563656e7420726f6f7460208201527f206c697374000000000000000000000000000000000000000000000000000000604082015250565b60006112d3604583611240565b91506112de82611251565b606082019050919050565b60006020820190508181036000830152611302816112c6565b9050919050565b7f50726f6f66206d75737420636f6d652066726f6d20636f72726563742069737360008201527f7565722773206164647265737300000000000000000000000000000000000000602082015250565b6000611365602d83611240565b915061137082611309565b604082019050919050565b6000602082019050818103600083015261139481611358565b9050919050565b7f4f6e6520706572736f6e2063616e206f6e6c7920766572696679206f6e636500600082015250565b60006113d1601f83611240565b91506113dc8261139b565b602082019050919050565b60006020820190508181036000830152611400816113c4565b9050919050565b600082905092915050565b60006114216020840184610de4565b905092915050565b61143281610dc3565b82525050565b604082016114496000830183611412565b6114566000850182611429565b506114646020830183611412565b6114716020850182611429565b50505050565b600082905092915050565b600082905092915050565b82818337600083830152505050565b6114a86040838361148d565b5050565b608082016114bd6000830183611482565b6114ca600085018261149c565b506114d86040830183611482565b6114e5604085018261149c565b50505050565b61010082016114fd6000830183611407565b61150a6000850182611438565b506115186040830183611477565b61152560408501826114ac565b5061153360c0830183611407565b61154060c0850182611438565b50505050565b600060059050919050565b600081905092915050565b6000819050919050565b60006115728383611429565b60208301905092915050565b6000602082019050919050565b61159481611546565b61159e8184611551565b92506115a98261155c565b8060005b838110156115da5781516115c18782611566565b96506115cc8361157e565b9250506001810190506115ad565b505050505050565b60006101a0820190506115f860008301856114eb565b61160661010083018461158b565b9392505050565b7f4661696c656420746f20766572696679205a4b50000000000000000000000000600082015250565b6000611643601483611240565b915061164e8261160d565b602082019050919050565b6000602082019050818103600083015261167281611636565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b60006116c0826116a8565b915060ff8214156116d4576116d3611679565b5b600182019050919050565b7f4d697373696e67207061796d656e740000000000000000000000000000000000600082015250565b6000611715600f83611240565b9150611720826116df565b602082019050919050565b6000602082019050818103600083015261174481611708565b9050919050565b60008160601b9050919050565b60006117638261174b565b9050919050565b61177b61177682611035565b611758565b82525050565b6000819050919050565b61179c61179782610dc3565b611781565b82525050565b60006117ae828561176a565b6014820191506117be828461178b565b6020820191508190509392505050565b60006040820190506117e36000830185611067565b6117f06020830184611161565b9392505050565b600061180282611758565b9050919050565b61181a61181582611055565b6117f7565b82525050565b600061182c8285611809565b60148201915061183c828461178b565b6020820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006118a8602683611240565b91506118b38261184c565b604082019050919050565b600060208201905081810360008301526118d78161189b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611914602083611240565b915061191f826118de565b602082019050919050565b6000602082019050818103600083015261194381611907565b905091905056fea26469706673582212202947c55672ae4574e91719254617011bbc0c8c9a39506c5c5b9ccbf064f5aabd64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b316940b687daa87392157e2ecfec1b9e182423d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003497556f7d0bf602d4237ecb8ae92840d09e4f630000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c8834c1fcf0df6623fc8c8ed25064a4148d9938803fae82f38bf01d9799d57fdda64fad4ac44e4c2c2f16c5bf8e1873d0a3e1993
-----Decoded View---------------
Arg [0] : roots_ (address): 0xb316940b687DAa87392157e2ECfeC1b9e182423d
Arg [1] : issuers_ (uint256[]): 1144726183143482297049508718223886886488380117896,1800252790190408162496944851144659187813457198890711068413419637171073980819
Arg [2] : price_ (uint256): 0
Arg [3] : oldContract_ (address): 0x3497556f7D0bF602D4237Ecb8ae92840D09E4f63
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000b316940b687daa87392157e2ecfec1b9e182423d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000003497556f7d0bf602d4237ecb8ae92840d09e4f63
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 000000000000000000000000c8834c1fcf0df6623fc8c8ed25064a4148d99388
Arg [6] : 03fae82f38bf01d9799d57fdda64fad4ac44e4c2c2f16c5bf8e1873d0a3e1993
Deployed Bytecode Sourcemap
19935:2995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21481:847;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14866:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13255:103;;;;;;;;;;;;;:::i;:::-;;20015:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14637:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12607:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22465:462;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14312:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20949:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14123:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14212:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14409:111;;;;;;;;;;;;;:::i;:::-;;15109:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13513:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21481:847;21568:12;21601:5;;;;;;;;;;;:18;;;21620:5;21626:1;21620:8;;;;;;;:::i;:::-;;;;;;21601:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21593:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22070:23;22084:5;22090:1;22084:8;;;;;;;:::i;:::-;;;;;;22070:13;:23::i;:::-;22062:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;22164:13;:23;22178:5;22184:1;22178:8;;;;;;;:::i;:::-;;;;;;22164:23;;;;;;;;;;;;;;;;;;;;;22163:24;22155:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22242:8;;;;;;;;;;;:17;;;22260:5;22267;22242:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22234:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22316:4;22309:11;;21481:847;;;;:::o;14866:235::-;12493:13;:11;:13::i;:::-;14948:7:::1;14966:116;14982:15;:22;14978:1;:26;;;14966:116;;;15063:5;15026:14;:34;15041:15;15057:1;15041:18;;;;;;;;;;:::i;:::-;;;;;;;;15026:34;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;15006:3;;;;;:::i;:::-;;;;14966:116;;;14937:164;14866:235:::0;:::o;13255:103::-;12493:13;:11;:13::i;:::-;13320:30:::1;13347:1;13320:18;:30::i;:::-;13255:103::o:0;20015:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;14637:221::-;12493:13;:11;:13::i;:::-;14718:7:::1;14736:115;14752:15;:22;14748:1;:26;;;14736:115;;;14833:4;14796:14;:34;14811:15;14827:1;14811:18;;;;;;;;;;:::i;:::-;;;;;;;;14796:34;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;14776:3;;;;;:::i;:::-;;;;14736:115;;;14707:151;14637:221:::0;:::o;12607:87::-;12653:7;12680:6;;;;;;;;;;;12673:13;;12607:87;:::o;22465:462::-;14584:5;;14571:9;:18;;14563:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;22576:26:::1;22589:5;22596;22576:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:26::i;:::-;22568:35;;;::::0;::::1;;22640:4;22614:13;:23;22628:5;22634:1;22628:8;;;;;;;:::i;:::-;;;;;;22614:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;22677:14;22729:5;22735:1;22729:8;;;;;;;:::i;:::-;;;;;;22740:5;22746:1;22740:8;;;;;;;:::i;:::-;;;;;;22704:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22694:56;;;;;;22677:73;;22867:4;22843:13;:21;22857:6;22843:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;22887:32;22898:10;22910:5;22916:1;22910:8;;;;;;;:::i;:::-;;;;;;22887:32;;;;;;;:::i;:::-;;;;;;;;22557:370;22465:462:::0;;:::o;14312:89::-;12493:13;:11;:13::i;:::-;14385:8:::1;14377:5;:16;;;;14312:89:::0;:::o;20949:282::-;21026:11;21072:13;:58;21113:4;21119:8;21096:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21086:43;;;;;;21072:58;;;;;;;;;;;;;;;;;;;;;21057:166;;;;21150:13;;;;;;;;;;;:62;;;;;21167:11;;;;;;;;;;;:29;;;21197:4;21203:8;21167:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21150:62;21057:166;21050:173;;20949:282;;;;:::o;14123:17::-;;;;:::o;14212:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;14409:111::-;12493:13;:11;:13::i;:::-;14472:7:::1;:5;:7::i;:::-;14464:25;;:48;14490:21;14464:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;14409:111::o:0;15109:132::-;15173:4;15197:14;:29;15212:13;15197:29;;;;;;;;;;;;;;;;;;;;;15190:36;;15109:132;;;:::o;13513:201::-;12493:13;:11;:13::i;:::-;13622:1:::1;13602:22;;:8;:22;;;;13594:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13678:28;13697:8;13678:18;:28::i;:::-;13513:201:::0;:::o;12772:132::-;12847:12;:10;:12::i;:::-;12836:23;;:7;:5;:7::i;:::-;:23;;;12828:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12772:132::o;13874:191::-;13948:16;13967:6;;;;;;;;;;;13948:25;;13993:8;13984:6;;:17;;;;;;;;;;;;;;;;;;14048:8;14017:40;;14038:8;14017:40;;;;;;;;;;;;13937:128;13874:191;:::o;11316:98::-;11369:7;11396:10;11389:17;;11316:98;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;477:229;547:5;588:3;579:6;574:3;570:16;566:26;563:113;;;595:79;;:::i;:::-;563:113;694:6;685:15;;477:229;;;;:::o;712:117::-;821:1;818;811:12;835:102;876:6;927:2;923:7;918:2;911:5;907:14;903:28;893:38;;835:102;;;:::o;943:180::-;991:77;988:1;981:88;1088:4;1085:1;1078:15;1112:4;1109:1;1102:15;1129:281;1212:27;1234:4;1212:27;:::i;:::-;1204:6;1200:40;1342:6;1330:10;1327:22;1306:18;1294:10;1291:34;1288:62;1285:88;;;1353:18;;:::i;:::-;1285:88;1393:10;1389:2;1382:22;1172:238;1129:281;;:::o;1416:129::-;1450:6;1477:20;;:::i;:::-;1467:30;;1506:33;1534:4;1526:6;1506:33;:::i;:::-;1416:129;;;:::o;1551:249::-;1626:4;1716:18;1708:6;1705:30;1702:56;;;1738:18;;:::i;:::-;1702:56;1788:4;1780:6;1776:17;1768:25;;1551:249;;;:::o;1806:117::-;1915:1;1912;1905:12;1929:77;1966:7;1995:5;1984:16;;1929:77;;;:::o;2012:122::-;2085:24;2103:5;2085:24;:::i;:::-;2078:5;2075:35;2065:63;;2124:1;2121;2114:12;2065:63;2012:122;:::o;2140:139::-;2186:5;2224:6;2211:20;2202:29;;2240:33;2267:5;2240:33;:::i;:::-;2140:139;;;;:::o;2303:643::-;2397:5;2422:79;2438:62;2493:6;2438:62;:::i;:::-;2422:79;:::i;:::-;2413:88;;2521:5;2574:4;2566:6;2562:17;2554:6;2550:30;2603:3;2595:6;2592:15;2589:122;;;2622:79;;:::i;:::-;2589:122;2737:6;2720:220;2754:6;2749:3;2746:15;2720:220;;;2829:3;2858:37;2891:3;2879:10;2858:37;:::i;:::-;2853:3;2846:50;2925:4;2920:3;2916:14;2909:21;;2796:144;2780:4;2775:3;2771:14;2764:21;;2720:220;;;2724:21;2403:543;;2303:643;;;;;:::o;2970:339::-;3039:5;3088:3;3081:4;3073:6;3069:17;3065:27;3055:122;;3096:79;;:::i;:::-;3055:122;3200:4;3222:81;3299:3;3291:6;3283;3222:81;:::i;:::-;3213:90;;3045:264;2970:339;;;;:::o;3315:570::-;3430:6;3438;3487:3;3475:9;3466:7;3462:23;3458:33;3455:120;;;3494:79;;:::i;:::-;3455:120;3614:1;3639:77;3708:7;3699:6;3688:9;3684:22;3639:77;:::i;:::-;3629:87;;3585:141;3765:3;3792:76;3860:7;3851:6;3840:9;3836:22;3792:76;:::i;:::-;3782:86;;3736:142;3315:570;;;;;:::o;3891:90::-;3925:7;3968:5;3961:13;3954:21;3943:32;;3891:90;;;:::o;3987:109::-;4068:21;4083:5;4068:21;:::i;:::-;4063:3;4056:34;3987:109;;:::o;4102:210::-;4189:4;4227:2;4216:9;4212:18;4204:26;;4240:65;4302:1;4291:9;4287:17;4278:6;4240:65;:::i;:::-;4102:210;;;;:::o;4318:311::-;4395:4;4485:18;4477:6;4474:30;4471:56;;;4507:18;;:::i;:::-;4471:56;4557:4;4549:6;4545:17;4537:25;;4617:4;4611;4607:15;4599:23;;4318:311;;;:::o;4652:710::-;4748:5;4773:81;4789:64;4846:6;4789:64;:::i;:::-;4773:81;:::i;:::-;4764:90;;4874:5;4903:6;4896:5;4889:21;4937:4;4930:5;4926:16;4919:23;;4990:4;4982:6;4978:17;4970:6;4966:30;5019:3;5011:6;5008:15;5005:122;;;5038:79;;:::i;:::-;5005:122;5153:6;5136:220;5170:6;5165:3;5162:15;5136:220;;;5245:3;5274:37;5307:3;5295:10;5274:37;:::i;:::-;5269:3;5262:50;5341:4;5336:3;5332:14;5325:21;;5212:144;5196:4;5191:3;5187:14;5180:21;;5136:220;;;5140:21;4754:608;;4652:710;;;;;:::o;5385:370::-;5456:5;5505:3;5498:4;5490:6;5486:17;5482:27;5472:122;;5513:79;;:::i;:::-;5472:122;5630:6;5617:20;5655:94;5745:3;5737:6;5730:4;5722:6;5718:17;5655:94;:::i;:::-;5646:103;;5462:293;5385:370;;;;:::o;5761:539::-;5845:6;5894:2;5882:9;5873:7;5869:23;5865:32;5862:119;;;5900:79;;:::i;:::-;5862:119;6048:1;6037:9;6033:17;6020:31;6078:18;6070:6;6067:30;6064:117;;;6100:79;;:::i;:::-;6064:117;6205:78;6275:7;6266:6;6255:9;6251:22;6205:78;:::i;:::-;6195:88;;5991:302;5761:539;;;;:::o;6306:329::-;6365:6;6414:2;6402:9;6393:7;6389:23;6385:32;6382:119;;;6420:79;;:::i;:::-;6382:119;6540:1;6565:53;6610:7;6601:6;6590:9;6586:22;6565:53;:::i;:::-;6555:63;;6511:117;6306:329;;;;:::o;6641:126::-;6678:7;6718:42;6711:5;6707:54;6696:65;;6641:126;;;:::o;6773:96::-;6810:7;6839:24;6857:5;6839:24;:::i;:::-;6828:35;;6773:96;;;:::o;6875:118::-;6962:24;6980:5;6962:24;:::i;:::-;6957:3;6950:37;6875:118;;:::o;6999:222::-;7092:4;7130:2;7119:9;7115:18;7107:26;;7143:71;7211:1;7200:9;7196:17;7187:6;7143:71;:::i;:::-;6999:222;;;;:::o;7245:249::-;7316:8;7347:6;7335:18;;7400:3;7392:4;7386;7382:15;7372:8;7368:30;7365:39;7362:126;;;7407:79;;:::i;:::-;7362:126;7245:249;;;;:::o;7500:574::-;7617:6;7625;7674:3;7662:9;7653:7;7649:23;7645:33;7642:120;;;7681:79;;:::i;:::-;7642:120;7801:1;7826:77;7895:7;7886:6;7875:9;7871:22;7826:77;:::i;:::-;7816:87;;7772:141;7952:3;7979:78;8049:7;8040:6;8029:9;8025:22;7979:78;:::i;:::-;7969:88;;7923:144;7500:574;;;;;:::o;8080:122::-;8153:24;8171:5;8153:24;:::i;:::-;8146:5;8143:35;8133:63;;8192:1;8189;8182:12;8133:63;8080:122;:::o;8208:139::-;8254:5;8292:6;8279:20;8270:29;;8308:33;8335:5;8308:33;:::i;:::-;8208:139;;;;:::o;8353:474::-;8421:6;8429;8478:2;8466:9;8457:7;8453:23;8449:32;8446:119;;;8484:79;;:::i;:::-;8446:119;8604:1;8629:53;8674:7;8665:6;8654:9;8650:22;8629:53;:::i;:::-;8619:63;;8575:117;8731:2;8757:53;8802:7;8793:6;8782:9;8778:22;8757:53;:::i;:::-;8747:63;;8702:118;8353:474;;;;;:::o;8833:118::-;8920:24;8938:5;8920:24;:::i;:::-;8915:3;8908:37;8833:118;;:::o;8957:222::-;9050:4;9088:2;9077:9;9073:18;9065:26;;9101:71;9169:1;9158:9;9154:17;9145:6;9101:71;:::i;:::-;8957:222;;;;:::o;9185:329::-;9244:6;9293:2;9281:9;9272:7;9268:23;9264:32;9261:119;;;9299:79;;:::i;:::-;9261:119;9419:1;9444:53;9489:7;9480:6;9469:9;9465:22;9444:53;:::i;:::-;9434:63;;9390:117;9185:329;;;;:::o;9520:180::-;9568:77;9565:1;9558:88;9665:4;9662:1;9655:15;9689:4;9686:1;9679:15;9706:116;9776:21;9791:5;9776:21;:::i;:::-;9769:5;9766:32;9756:60;;9812:1;9809;9802:12;9756:60;9706:116;:::o;9828:137::-;9882:5;9913:6;9907:13;9898:22;;9929:30;9953:5;9929:30;:::i;:::-;9828:137;;;;:::o;9971:345::-;10038:6;10087:2;10075:9;10066:7;10062:23;10058:32;10055:119;;;10093:79;;:::i;:::-;10055:119;10213:1;10238:61;10291:7;10282:6;10271:9;10267:22;10238:61;:::i;:::-;10228:71;;10184:125;9971:345;;;;:::o;10322:169::-;10406:11;10440:6;10435:3;10428:19;10480:4;10475:3;10471:14;10456:29;;10322:169;;;;:::o;10497:293::-;10637:34;10633:1;10625:6;10621:14;10614:58;10706:34;10701:2;10693:6;10689:15;10682:59;10775:7;10770:2;10762:6;10758:15;10751:32;10497:293;:::o;10796:366::-;10938:3;10959:67;11023:2;11018:3;10959:67;:::i;:::-;10952:74;;11035:93;11124:3;11035:93;:::i;:::-;11153:2;11148:3;11144:12;11137:19;;10796:366;;;:::o;11168:419::-;11334:4;11372:2;11361:9;11357:18;11349:26;;11421:9;11415:4;11411:20;11407:1;11396:9;11392:17;11385:47;11449:131;11575:4;11449:131;:::i;:::-;11441:139;;11168:419;;;:::o;11593:232::-;11733:34;11729:1;11721:6;11717:14;11710:58;11802:15;11797:2;11789:6;11785:15;11778:40;11593:232;:::o;11831:366::-;11973:3;11994:67;12058:2;12053:3;11994:67;:::i;:::-;11987:74;;12070:93;12159:3;12070:93;:::i;:::-;12188:2;12183:3;12179:12;12172:19;;11831:366;;;:::o;12203:419::-;12369:4;12407:2;12396:9;12392:18;12384:26;;12456:9;12450:4;12446:20;12442:1;12431:9;12427:17;12420:47;12484:131;12610:4;12484:131;:::i;:::-;12476:139;;12203:419;;;:::o;12628:181::-;12768:33;12764:1;12756:6;12752:14;12745:57;12628:181;:::o;12815:366::-;12957:3;12978:67;13042:2;13037:3;12978:67;:::i;:::-;12971:74;;13054:93;13143:3;13054:93;:::i;:::-;13172:2;13167:3;13163:12;13156:19;;12815:366;;;:::o;13187:419::-;13353:4;13391:2;13380:9;13376:18;13368:26;;13440:9;13434:4;13430:20;13426:1;13415:9;13411:17;13404:47;13468:131;13594:4;13468:131;:::i;:::-;13460:139;;13187:419;;;:::o;13612:110::-;13688:5;13713:3;13704:12;;13612:110;;;;:::o;13728:122::-;13780:5;13805:39;13840:2;13835:3;13831:12;13826:3;13805:39;:::i;:::-;13796:48;;13728:122;;;;:::o;13856:108::-;13933:24;13951:5;13933:24;:::i;:::-;13928:3;13921:37;13856:108;;:::o;14026:541::-;14159:4;14154:3;14150:14;14226:50;14270:4;14263:5;14259:16;14252:5;14226:50;:::i;:::-;14289:63;14346:4;14341:3;14337:14;14323:12;14289:63;:::i;:::-;14174:188;14424:50;14468:4;14461:5;14457:16;14450:5;14424:50;:::i;:::-;14487:63;14544:4;14539:3;14535:14;14521:12;14487:63;:::i;:::-;14372:188;14128:439;14026:541;;:::o;14573:111::-;14650:5;14675:3;14666:12;;14573:111;;;;:::o;14690:::-;14767:5;14792:3;14783:12;;14690:111;;;;:::o;14807:154::-;14891:6;14886:3;14881;14868:30;14953:1;14944:6;14939:3;14935:16;14928:27;14807:154;;;:::o;14999:160::-;15112:41;15148:4;15143:3;15136:5;15112:41;:::i;:::-;14999:160;;:::o;15221:689::-;15356:4;15351:3;15347:14;15423:75;15492:4;15485:5;15481:16;15474:5;15423:75;:::i;:::-;15511:111;15616:4;15611:3;15607:14;15593:12;15511:111;:::i;:::-;15371:261;15694:75;15763:4;15756:5;15752:16;15745:5;15694:75;:::i;:::-;15782:111;15887:4;15882:3;15878:14;15864:12;15782:111;:::i;:::-;15642:261;15325:585;15221:689;;:::o;15952:964::-;16095:6;16090:3;16086:16;16164:74;16232:4;16225:5;16221:16;16214:5;16164:74;:::i;:::-;16251:109;16354:4;16349:3;16345:14;16331:12;16251:109;:::i;:::-;16112:258;16432:75;16501:4;16494:5;16490:16;16483:5;16432:75;:::i;:::-;16520:111;16625:4;16620:3;16616:14;16602:12;16520:111;:::i;:::-;16380:261;16703:74;16771:4;16764:5;16760:16;16753:5;16703:74;:::i;:::-;16790:109;16893:4;16888:3;16884:14;16870:12;16790:109;:::i;:::-;16651:258;16064:852;15952:964;;:::o;16922:104::-;16987:6;17015:4;17005:14;;16922:104;;;:::o;17032:143::-;17129:11;17166:3;17151:18;;17032:143;;;;:::o;17181:98::-;17246:4;17269:3;17261:11;;17181:98;;;:::o;17285:179::-;17354:10;17375:46;17417:3;17409:6;17375:46;:::i;:::-;17453:4;17448:3;17444:14;17430:28;;17285:179;;;;:::o;17470:111::-;17538:4;17570;17565:3;17561:14;17553:22;;17470:111;;;:::o;17619:694::-;17755:52;17801:5;17755:52;:::i;:::-;17823:84;17900:6;17895:3;17823:84;:::i;:::-;17816:91;;17931:54;17979:5;17931:54;:::i;:::-;18008:7;18039:1;18024:282;18049:6;18046:1;18043:13;18024:282;;;18125:6;18119:13;18152:63;18211:3;18196:13;18152:63;:::i;:::-;18145:70;;18238:58;18289:6;18238:58;:::i;:::-;18228:68;;18084:222;18071:1;18068;18064:9;18059:14;;18024:282;;;18028:14;17731:582;;;17619:694;;:::o;18319:518::-;18532:4;18570:3;18559:9;18555:19;18547:27;;18584:117;18698:1;18687:9;18683:17;18674:6;18584:117;:::i;:::-;18711:119;18825:3;18814:9;18810:19;18801:6;18711:119;:::i;:::-;18319:518;;;;;:::o;18843:170::-;18983:22;18979:1;18971:6;18967:14;18960:46;18843:170;:::o;19019:366::-;19161:3;19182:67;19246:2;19241:3;19182:67;:::i;:::-;19175:74;;19258:93;19347:3;19258:93;:::i;:::-;19376:2;19371:3;19367:12;19360:19;;19019:366;;;:::o;19391:419::-;19557:4;19595:2;19584:9;19580:18;19572:26;;19644:9;19638:4;19634:20;19630:1;19619:9;19615:17;19608:47;19672:131;19798:4;19672:131;:::i;:::-;19664:139;;19391:419;;;:::o;19816:180::-;19864:77;19861:1;19854:88;19961:4;19958:1;19951:15;19985:4;19982:1;19975:15;20002:86;20037:7;20077:4;20070:5;20066:16;20055:27;;20002:86;;;:::o;20094:167::-;20131:3;20154:22;20170:5;20154:22;:::i;:::-;20145:31;;20198:4;20191:5;20188:15;20185:41;;;20206:18;;:::i;:::-;20185:41;20253:1;20246:5;20242:13;20235:20;;20094:167;;;:::o;20267:165::-;20407:17;20403:1;20395:6;20391:14;20384:41;20267:165;:::o;20438:366::-;20580:3;20601:67;20665:2;20660:3;20601:67;:::i;:::-;20594:74;;20677:93;20766:3;20677:93;:::i;:::-;20795:2;20790:3;20786:12;20779:19;;20438:366;;;:::o;20810:419::-;20976:4;21014:2;21003:9;20999:18;20991:26;;21063:9;21057:4;21053:20;21049:1;21038:9;21034:17;21027:47;21091:131;21217:4;21091:131;:::i;:::-;21083:139;;20810:419;;;:::o;21235:94::-;21268:8;21316:5;21312:2;21308:14;21287:35;;21235:94;;;:::o;21335:::-;21374:7;21403:20;21417:5;21403:20;:::i;:::-;21392:31;;21335:94;;;:::o;21435:157::-;21540:45;21560:24;21578:5;21560:24;:::i;:::-;21540:45;:::i;:::-;21535:3;21528:58;21435:157;;:::o;21598:79::-;21637:7;21666:5;21655:16;;21598:79;;;:::o;21683:157::-;21788:45;21808:24;21826:5;21808:24;:::i;:::-;21788:45;:::i;:::-;21783:3;21776:58;21683:157;;:::o;21846:397::-;21986:3;22001:75;22072:3;22063:6;22001:75;:::i;:::-;22101:2;22096:3;22092:12;22085:19;;22114:75;22185:3;22176:6;22114:75;:::i;:::-;22214:2;22209:3;22205:12;22198:19;;22234:3;22227:10;;21846:397;;;;;:::o;22249:332::-;22370:4;22408:2;22397:9;22393:18;22385:26;;22421:71;22489:1;22478:9;22474:17;22465:6;22421:71;:::i;:::-;22502:72;22570:2;22559:9;22555:18;22546:6;22502:72;:::i;:::-;22249:332;;;;;:::o;22587:100::-;22626:7;22655:26;22675:5;22655:26;:::i;:::-;22644:37;;22587:100;;;:::o;22693:157::-;22798:45;22818:24;22836:5;22818:24;:::i;:::-;22798:45;:::i;:::-;22793:3;22786:58;22693:157;;:::o;22856:397::-;22996:3;23011:75;23082:3;23073:6;23011:75;:::i;:::-;23111:2;23106:3;23102:12;23095:19;;23124:75;23195:3;23186:6;23124:75;:::i;:::-;23224:2;23219:3;23215:12;23208:19;;23244:3;23237:10;;22856:397;;;;;:::o;23259:225::-;23399:34;23395:1;23387:6;23383:14;23376:58;23468:8;23463:2;23455:6;23451:15;23444:33;23259:225;:::o;23490:366::-;23632:3;23653:67;23717:2;23712:3;23653:67;:::i;:::-;23646:74;;23729:93;23818:3;23729:93;:::i;:::-;23847:2;23842:3;23838:12;23831:19;;23490:366;;;:::o;23862:419::-;24028:4;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;23862:419;;;:::o;24287:182::-;24427:34;24423:1;24415:6;24411:14;24404:58;24287:182;:::o;24475:366::-;24617:3;24638:67;24702:2;24697:3;24638:67;:::i;:::-;24631:74;;24714:93;24803:3;24714:93;:::i;:::-;24832:2;24827:3;24823:12;24816:19;;24475:366;;;:::o;24847:419::-;25013:4;25051:2;25040:9;25036:18;25028:26;;25100:9;25094:4;25090:20;25086:1;25075:9;25071:17;25064:47;25128:131;25254:4;25128:131;:::i;:::-;25120:139;;24847:419;;;:::o
Swarm Source
ipfs://dc9d99ad4efc49bf67d59d33972a0d191e94df7a3d73e1f3679f7e87a8ce87a9
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.