From 6d760955891ef992103466e9f05906581d873a5e Mon Sep 17 00:00:00 2001 From: 8ball030 <8baller@station.codes> Date: Mon, 21 Jul 2025 14:34:43 +0100 Subject: [PATCH 1/3] updated-improvements-new-activity-checker --- .../agent_runner/agent_state/Cargo.toml | 16 - third_party/agent_runner/nix-shell.nix | 2 +- third_party/agent_runner/src-tauri/Cargo.lock | 2 +- .../src/components/types/src_tauri.ts | 2 +- .../src/lib/components/ExchangeMetrics.svelte | 2 +- .../src/lib/components/Metrics.svelte | 2 +- .../src/lib/components/Nodes.svelte | 110 +- .../src/lib/contracts/DerolasStaking.json | 2474 ++++++++++++----- .../src/lib/contracts/interface.ts | 116 +- third_party/agent_runner/tauri-shell.nix | 2 +- 10 files changed, 1854 insertions(+), 874 deletions(-) delete mode 100644 third_party/agent_runner/agent_state/Cargo.toml diff --git a/third_party/agent_runner/agent_state/Cargo.toml b/third_party/agent_runner/agent_state/Cargo.toml deleted file mode 100644 index 389fa74..0000000 --- a/third_party/agent_runner/agent_state/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "agent_state" -version = "0.1.0" -edition = "2021" -license = "SPECIFY A LICENSE BEFORE PUBLISHING" - -[dependencies] -bytes = "1.0" -chrono = { version = "0.4", default-features=false, features = ["serde"] } -futures-core = "0.3" -progenitor-client = "0.9.1" -reqwest = { version = "0.12", default-features=false, features = ["json", "stream"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -serde_urlencoded = "0.7" - diff --git a/third_party/agent_runner/nix-shell.nix b/third_party/agent_runner/nix-shell.nix index 34758e4..f8383e3 100644 --- a/third_party/agent_runner/nix-shell.nix +++ b/third_party/agent_runner/nix-shell.nix @@ -20,7 +20,7 @@ let gtk3 libsoup webkitgtk - appimagekit +# appimagekit librsvg cargo rustc diff --git a/third_party/agent_runner/src-tauri/Cargo.lock b/third_party/agent_runner/src-tauri/Cargo.lock index 3055027..1d27e2f 100644 --- a/third_party/agent_runner/src-tauri/Cargo.lock +++ b/third_party/agent_runner/src-tauri/Cargo.lock @@ -19,7 +19,7 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "agent_runner" -version = "0.1.24" +version = "0.1.25" dependencies = [ "base64 0.22.1", "bollard", diff --git a/third_party/agent_runner/src/components/types/src_tauri.ts b/third_party/agent_runner/src/components/types/src_tauri.ts index c97cdc0..26c3617 100644 --- a/third_party/agent_runner/src/components/types/src_tauri.ts +++ b/third_party/agent_runner/src/components/types/src_tauri.ts @@ -1,5 +1,5 @@ /* - Generated by typeshare 1.9.2 + Generated by typeshare 1.13.2 */ export enum AgentStatus { diff --git a/third_party/agent_runner/src/lib/components/ExchangeMetrics.svelte b/third_party/agent_runner/src/lib/components/ExchangeMetrics.svelte index 45d6f20..14b4435 100644 --- a/third_party/agent_runner/src/lib/components/ExchangeMetrics.svelte +++ b/third_party/agent_runner/src/lib/components/ExchangeMetrics.svelte @@ -208,7 +208,7 @@ export async function generateAlignedPriceMatrix() {
{currentDerolasVolume24h.toLocaleString('en-US', { style: 'currency', currency: 'USD' })} - +
diff --git a/third_party/agent_runner/src/lib/components/Metrics.svelte b/third_party/agent_runner/src/lib/components/Metrics.svelte index 7583fe7..e9b48d0 100644 --- a/third_party/agent_runner/src/lib/components/Metrics.svelte +++ b/third_party/agent_runner/src/lib/components/Metrics.svelte @@ -538,7 +538,7 @@ function pltData(data: any, chart: any) {
${currentFees24h.toFixed(2)} - +
diff --git a/third_party/agent_runner/src/lib/components/Nodes.svelte b/third_party/agent_runner/src/lib/components/Nodes.svelte index a267f61..33cb5a5 100644 --- a/third_party/agent_runner/src/lib/components/Nodes.svelte +++ b/third_party/agent_runner/src/lib/components/Nodes.svelte @@ -12,20 +12,20 @@ import * as Progress from "./ui/progress"; import * as Alert from "./ui/alert"; import * as Card from "$lib/components/ui/card"; -import { getVersion } from '@tauri-apps/api/app'; -import Separator from './ui/separator/separator.svelte'; -import { base} from 'viem/chains'; // or wherever your chain imports come from -import { claim, contribute, endEpoch, loadContracts, topUpOlas } from "$lib/contracts/interface"; - import { addChain } from 'viem/actions'; - import Metrics from './Metrics.svelte'; - import BalMetrics from './ExchangeMetrics.svelte'; + import { getVersion } from '@tauri-apps/api/app'; + import Separator from './ui/separator/separator.svelte'; + import { base} from 'viem/chains'; // or wherever your chain imports come from + import { claim, contribute, endRound, loadContracts, topUpOlas } from "$lib/contracts/interface"; + import { addChain } from 'viem/actions'; + import Metrics from './Metrics.svelte'; + import BalMetrics from './ExchangeMetrics.svelte'; let PUBLIC_WALLETCONNECT_ID = "189298bf7ea32b9f16f1369599ad0ad4" -let epochRewards = 0 +let roundRewards = 0 let incentiveBalance = 0 let data = {} let intervalId: number; @@ -33,11 +33,11 @@ let olasTopUp = 0; let percentCompleted = 0; -let epochNumber = 0; +let roundNumber = 0; let isRunningInTauri = false; let totalDonated = 0; -let epochLength = 100; // e.g., 100 blocks -let blocksRemaining = epochLength; +let roundLength = 90; // e.g., 100 blocks +let blocksRemaining = roundLength; let account: Address = "0x0000000000000000000000000000000000000000"; let animatedPercent = 0; let userCurrentShare = 0; @@ -48,7 +48,7 @@ let userContribution = 0; let userCurrentDonation = 0; let currentTab = 'contribute'; // or 'info' -let minimalDonation = 0.00001; // e.g., 0.1 ETH +let minimumDonation = 0.00001; // e.g., 0.1 ETH const SUPPORTED_CHAIN_ID = base.id; @@ -106,7 +106,7 @@ walletClient = result; return result; } -async function setUpWalletConnectBrowser(): Promise { +async function setUp(): Promise { if (!WalletConnectProvider) { WalletConnectProvider = (await import('@walletconnect/ethereum-provider')).EthereumProvider; } @@ -316,17 +316,17 @@ async function isTauri(): Promise { // console.log('Data loaded:', data); blocksRemaining = Number(data.blocksRemaining); totalDonated = Number(data.totalDonated); - epochNumber = Number(data.currentEpoch); - epochLength = Number(data.epochLength); - minimalDonation = Number(data.minimalDonation); - epochRewards = Number(data.epochRewards); + roundNumber = Number(data.currentRound); + roundLength = Number(data.roundLength); + minimumDonation = Number(data.minimumDonation) / 1e18; + roundRewards = Number(data.roundRewards); userCurrentShare = Number(data.userCurrentShare); userClaimable = Number(data.userClaimable); userCurrentDonation = Number(data.userCurrentDonation); canPlayGame = data.canPlayGame; incentiveBalance = Number(data.incentiveBalance); - percentCompleted = Math.floor((epochLength - blocksRemaining) / epochLength * 100); - animatedPercent = Math.floor((epochLength - blocksRemaining) / epochLength * 100); + percentCompleted = Math.floor((roundLength - blocksRemaining) / roundLength * 100); + animatedPercent = Math.floor((roundLength - blocksRemaining) / roundLength * 100); } // onDestroy(() => { @@ -416,18 +416,18 @@ async function isTauri(): Promise { {#if currentTab === 'contribute'} - Epochal Reward Split (ERS) + Roundal Reward Split (ERS) - Contribute ETH → Claim OLAS. Rewards distributed at epoch end. + Contribute ETH → Claim OLAS. Rewards distributed at round end.
- Epoch {epochNumber} + Round {roundNumber}
@@ -437,7 +437,7 @@ async function isTauri(): Promise {
- {(incentiveBalance / epochRewards).toFixed(0)} Epochs Remaining + {(blocksRemaining).toFixed(0)} Blocks Remaining
@@ -476,14 +476,14 @@ async function isTauri(): Promise {
{(totalDonated / 1e18).toFixed(6)} ETH
Minimum Donation
-
{(minimalDonation / 1e18).toFixed(6)} ETH
+
{(minimumDonation ).toFixed(6)} ETH
- + - Epoch Controls + Round Controls {#if connected} @@ -501,17 +501,17 @@ async function isTauri(): Promise { {#if blocksRemaining == 0} endEpoch(walletClient)} + on:click={() => endRound(walletClient)} disabled={!connected} > - End Epoch + End Round {/if} {#if userCurrentShare > 0 && blocksRemaining > 0} - Waiting for the epoch to contribute again! + Waiting for the round to contribute again! {/if} @@ -520,19 +520,19 @@ async function isTauri(): Promise { {#if connected && blocksRemaining > 0 && userCurrentShare == 0}
- {#if userContribution < minimalDonation / 1e18} + {#if userContribution < minimumDonation / 1e18} - Minimum {(minimalDonation / 1e18).toFixed(6)} ETH required + Minimum {(minimumDonation ).toFixed(6)} ETH required {/if} @@ -540,7 +540,7 @@ async function isTauri(): Promise { contribute(userContribution * 1e18, walletClient)} - disabled={userContribution < minimalDonation / 1e18 || blocksRemaining == 0 || userCurrentDonation > 0} + disabled={userContribution < minimumDonation / 1e18 || blocksRemaining == 0 || userCurrentDonation > 0} > Contribute {userContribution} ETH @@ -554,7 +554,7 @@ async function isTauri(): Promise {
- +
@@ -580,7 +580,7 @@ async function isTauri(): Promise { Current Share - {userCurrentShare / 1e18 * 100} % + {userCurrentShare / 1e16} %
@@ -590,11 +590,11 @@ async function isTauri(): Promise { - Epochal Reward Split (ERS) + Round Reward Split (RRS) - Contribute ETH → Claim OLAS. Rewards distributed at epoch end. + Contribute ETH → Claim OLAS. Rewards distributed at round end. @@ -617,25 +617,25 @@ async function isTauri(): Promise {
- +
- Epoch Rewards + Round Rewards
- {(epochRewards / 1e18).toFixed(2)} OLAS each epoch + {(roundRewards / 1e18).toFixed(2)} OLAS each round
- +
- Epoch Progress + Round Progress
- {blocksRemaining}/{epochLength} blocks + {blocksRemaining}/{roundLength} blocks
@@ -646,7 +646,7 @@ async function isTauri(): Promise { Minimum Donation
- {(minimalDonation / 1e18).toFixed(6)} ETH + {(minimumDonation ).toFixed(6)} ETH
@@ -654,7 +654,7 @@ async function isTauri(): Promise { - +
@@ -670,7 +670,7 @@ async function isTauri(): Promise {
  • - OLAS rewards: Distributed at the end of each epoch based on your pro-rata contribution to the donation pool. + OLAS rewards: Distributed at the end of each round based on your pro-rata contribution to the donation pool.

  • @@ -693,18 +693,18 @@ async function isTauri(): Promise {
  • - Prisoner's Dilemma: Each epoch, you can donate more to increase your share of rewards — but if everyone does this, rewards are diluted. + Prisoner's Dilemma: Each round, you can donate more to increase your share of rewards — but if everyone does this, rewards are diluted.

  • - Rewards Are Only Claimable for 1 Epoch! + Rewards Are Only Claimable for 1 Round!

    - If you do not claim your rewards within the current epoch, they will be donated to the pool and you will not receive them. + If you do not claim your rewards within the current round, they will be donated to the pool and you will not receive them.

    @@ -716,18 +716,18 @@ async function isTauri(): Promise { {#if connected }
    - {#if userContribution < minimalDonation / 1e18} + {#if userContribution < minimumDonation / 1e18} - Minimum {(epochRewards/ 1e18).toFixed(1)} OLAS required + Minimum {(roundRewards/ 1e18).toFixed(1)} OLAS required {/if} diff --git a/third_party/agent_runner/src/lib/contracts/DerolasStaking.json b/third_party/agent_runner/src/lib/contracts/DerolasStaking.json index 60679f1..6c9d559 100644 --- a/third_party/agent_runner/src/lib/contracts/DerolasStaking.json +++ b/third_party/agent_runner/src/lib/contracts/DerolasStaking.json @@ -1,1086 +1,2102 @@ { - "address": "0x35CAf83118d58504C179b50D538a095ac08Ebc8f", "abi": [ { + "type": "constructor", "inputs": [ { - "internalType": "address", - "name": "_owner", - "type": "address" + "name": "_minDonation", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_minimumDonation", - "type": "uint256" + "name": "_balancerRouter", + "type": "address", + "internalType": "address" }, { - "internalType": "address", - "name": "_balancerRouter", - "type": "address" + "name": "_balancerVaultAdmin", + "type": "address", + "internalType": "address" }, { - "internalType": "address", "name": "_poolId", - "type": "address" + "type": "address", + "internalType": "address" }, { - "internalType": "uint256", "name": "_assetsInPool", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_wethIndex", - "type": "uint256" + "name": "_incentiveTokenAddress", + "type": "address", + "internalType": "address" }, { - "internalType": "uint256", - "name": "_olasIndex", - "type": "uint256" + "name": "_incentiveTokenIndex", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "address", - "name": "_incentiveTokenAddress", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ + "name": "_wethIndex", + "type": "uint256", + "internalType": "uint256" + }, { - "internalType": "address", - "name": "target", - "type": "address" - } - ], - "name": "AddressEmptyCode", - "type": "error" - }, - { - "inputs": [ + "name": "_availableRewards", + "type": "uint256", + "internalType": "uint256" + }, { - "internalType": "address", - "name": "account", - "type": "address" + "name": "_roundLength", + "type": "uint256", + "internalType": "uint256" } ], - "name": "AddressInsufficientBalance", - "type": "error" + "stateMutability": "nonpayable" }, { + "type": "function", + "name": "MINIMUM_BALANCE_DONATION_AMOUNT", "inputs": [], - "name": "FailedInnerCall", - "type": "error" - }, - { - "inputs": [ + "outputs": [ { - "internalType": "address", - "name": "owner", - "type": "address" + "name": "", + "type": "uint256", + "internalType": "uint256" } ], - "name": "OwnableInvalidOwner", - "type": "error" + "stateMutability": "view" }, { - "inputs": [ + "type": "function", + "name": "assetsInPool", + "inputs": [], + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "name": "", + "type": "uint256", + "internalType": "uint256" } ], - "name": "OwnableUnauthorizedAccount", - "type": "error" + "stateMutability": "view" }, { + "type": "function", + "name": "balancerRouter", "inputs": [], - "name": "ReentrancyGuardReentrantCall", - "type": "error" - }, - { - "inputs": [ + "outputs": [ { - "internalType": "address", - "name": "token", - "type": "address" + "name": "", + "type": "address", + "internalType": "address" } ], - "name": "SafeERC20FailedOperation", - "type": "error" + "stateMutability": "view" }, { - "anonymous": false, - "inputs": [ + "type": "function", + "name": "balancerVaultAdmin", + "inputs": [], + "outputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "epochRewards", - "type": "uint256" + "name": "", + "type": "address", + "internalType": "address" } ], - "name": "AuctionEnded", - "type": "event" + "stateMutability": "view" }, { - "anonymous": false, + "type": "function", + "name": "changeOwner", "inputs": [ { - "indexed": true, - "internalType": "address", - "name": "donatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "name": "newOwner", + "type": "address", + "internalType": "address" } ], - "name": "DonationReceived", - "type": "event" + "outputs": [], + "stateMutability": "nonpayable" }, { - "anonymous": false, + "type": "function", + "name": "changeParams", "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EthDonatedToBalancer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "name": "newRoundRewards", + "type": "uint256", + "internalType": "uint256" + }, { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" + "name": "newRoundLength", + "type": "uint256", + "internalType": "uint256" }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" + "name": "minDonation", + "type": "uint256", + "internalType": "uint256" } ], - "name": "OwnershipTransferred", - "type": "event" + "outputs": [], + "stateMutability": "nonpayable" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "donatorAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "RewardsClaimed", - "type": "event" + "type": "function", + "name": "claim", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" }, { - "anonymous": false, + "type": "function", + "name": "claimable", "inputs": [ { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" + "name": "account", + "type": "address", + "internalType": "address" } ], - "name": "UnclaimedRewardsDonated", - "type": "event" - }, - { - "inputs": [], - "name": "assetsInPool", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "currentRound", "inputs": [], - "name": "balancerRouter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "claimAmount", - "type": "uint256" - } - ], - "name": "canPayTicket", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "donate", "inputs": [], - "name": "canPlayGame", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" + "outputs": [], + "stateMutability": "payable" }, { + "type": "function", + "name": "endRound", "inputs": [], - "name": "claim", "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "nonpayable" }, { + "type": "function", + "name": "epochDonationActivities", "inputs": [ { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "claimable", - "outputs": [ - { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentEpoch", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "donate", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "endEpoch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "estimateTicketPercentage", "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "donation", + "type": "uint256", + "internalType": "uint256" } ], - "name": "epochDonated", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "getAllocatedIncentives", "inputs": [], - "name": "epochLength", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "allocatedRewards", + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "getBlocksSinceRoundEnd", "inputs": [], - "name": "epochRewards", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "getCurrentShare", "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" + "name": "account", + "type": "address", + "internalType": "address" } ], - "name": "epochToClaimed", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "getGameState", "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" + "name": "user", + "type": "address", + "internalType": "address" } ], - "name": "epochToDonations", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "name": "state", + "type": "tuple", + "internalType": "struct GameState", + "components": [ + { + "name": "roundLength", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "currentRound", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roundEndBlock", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minimumDonation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blocksRemaining", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "roundRewards", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "totalDonated", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "totalClaimed", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "incentiveBalance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "userCurrentDonation", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "userCurrentShare", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "userClaimable", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "hasClaimed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "canPlayGame", + "type": "bool", + "internalType": "bool" + } + ] + } + ], + "stateMutability": "view" }, { + "type": "function", + "name": "getMultisigNonces", "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "multisig", + "type": "address", + "internalType": "address" } ], - "name": "epochToEndBlock", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "nonces", + "type": "uint256[]", + "internalType": "uint256[]" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [ + "type": "function", + "name": "getRemainingRoundLength", + "inputs": [], + "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "remainingRoundLength", + "type": "uint256", + "internalType": "uint256" } ], - "name": "epochToTotalDonated", + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoundProgress", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "donation", - "type": "uint256" - } - ], - "name": "estimateTicketPercentage", + "type": "function", + "name": "incentiveTokenAddress", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "forceAdvanceEpoch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "incentiveTokenIndex", "inputs": [], - "name": "getBlocksRemaining", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [], - "name": "getCurrentEpoch", - "outputs": [ + "type": "function", + "name": "isRatioPass", + "inputs": [ + { + "name": "curNonces", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "lastNonces", + "type": "uint256[]", + "internalType": "uint256[]" + }, { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "ratioPass", + "type": "bool", + "internalType": "bool" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [ + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ { - "internalType": "address", - "name": "_address", - "type": "address" + "name": "", + "type": "address", + "internalType": "address" } ], - "name": "getCurrentShare", + "stateMutability": "view" + }, + { + "type": "function", + "name": "paramsUpdateRequested", + "inputs": [], "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "bool", + "internalType": "bool" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "permit2", "inputs": [], - "name": "getEpochLength", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "poolId", "inputs": [], - "name": "getEpochRewards", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "roundPoints", "inputs": [ { - "internalType": "address", - "name": "user", - "type": "address" + "name": "", + "type": "uint256", + "internalType": "uint256" } ], - "name": "getGameState", "outputs": [ { - "internalType": "uint256", - "name": "_currentEpoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_epochLength", - "type": "uint256" + "name": "availableRewards", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_epochEndBlock", - "type": "uint256" + "name": "totalDonated", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_minimumDonation", - "type": "uint256" + "name": "totalClaimed", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_blocksRemaining", - "type": "uint256" + "name": "length", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_epochRewards", - "type": "uint256" + "name": "minDonation", + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", - "name": "_totalDonated", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_totalClaimed", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_incentiveBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_userCurrentDonation", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_userCurrentShare", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_userClaimable", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "_hasClaimed", - "type": "bool" - }, - { - "internalType": "bool", - "name": "_canPlayGame", - "type": "bool" + "name": "endBlock", + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [], - "name": "getTotalClaimed", - "outputs": [ + "type": "function", + "name": "roundToClaimed", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalDonated", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [], - "name": "getTotalUnclaimed", - "outputs": [ + "type": "function", + "name": "roundToDonations", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "address", + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "incentiveBalance", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [], - "name": "incentiveTokenAddress", - "outputs": [ + "type": "function", + "name": "topUpIncentiveBalance", + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "name": "amount", + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "outputs": [], + "stateMutability": "nonpayable" }, { + "type": "function", + "name": "wethIndex", "inputs": [], - "name": "maxDonatorsPerEpoch", "outputs": [ { - "internalType": "uint256", "name": "", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { + "type": "function", + "name": "withdrawIncentiveTokenBalance", "inputs": [], - "name": "minimumDonation", - "outputs": [ + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "AuctionEnded", + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "roundCounter", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "totalRoundDonations", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "totalRoundClaimed", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "availableRewards", + "type": "uint256", + "indexed": false, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "olasIndex", - "outputs": [ + "type": "event", + "name": "DonationReceived", + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "donatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "owner", - "outputs": [ + "type": "event", + "name": "EthDonatedToBalancer", + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "permit2", - "outputs": [ + "type": "event", + "name": "OwnerUpdated", + "inputs": [ { - "internalType": "contract IPermit2", - "name": "", - "type": "address" + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "poolId", - "outputs": [ + "type": "event", + "name": "ParamsUpdated", + "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" + "name": "nextRound", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "availableRewards", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "roundLength", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "minDonation", + "type": "uint256", + "indexed": false, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false }, { + "type": "event", + "name": "RewardsClaimed", "inputs": [ { - "internalType": "uint256", + "name": "donatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { "name": "amount", - "type": "uint256" + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "name": "topUpIncentiveBalance", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "totalClaimed", - "outputs": [ + "type": "event", + "name": "TopUpIncentiveReceived", + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "totalDonated", - "outputs": [ + "type": "event", + "name": "TopUpIncentiveWithdrawn", + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "stateMutability": "view", - "type": "function" + "anonymous": false }, { + "type": "event", + "name": "UnclaimedIncentiveTokensDonated", "inputs": [ { - "internalType": "address", - "name": "newOwner", - "type": "address" + "name": "amount", + "type": "uint256", + "indexed": true, + "internalType": "uint256" } ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "anonymous": false }, { - "inputs": [], - "name": "wethIndex", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "type": "error", + "name": "NoAvailableIncentiveBalance", + "inputs": [] }, { - "stateMutability": "payable", - "type": "receive" + "type": "error", + "name": "TokenTransferFailed", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] } ], - "transactionHash": "0xd032e641a68f2a071da973b0c707169d634540ff30348ad61151d8d308504c79", - "receipt": { - "to": null, - "from": "0x5D407A012071CB234CA1A965be9E47a3fCA5d704", - "contractAddress": "0x35CAf83118d58504C179b50D538a095ac08Ebc8f", - "transactionIndex": 125, - "gasUsed": "2001965", - "logsBloom": "0x00000000000000000000000240000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000001000000010000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000080000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7ead81b3db7a6bd64acaf36dd614bf8b6d3bb6cc0e709c19e61621986f7d6b8e", - "transactionHash": "0xd032e641a68f2a071da973b0c707169d634540ff30348ad61151d8d308504c79", - "logs": [ - { - "transactionIndex": 125, - "blockNumber": 31682991, - "transactionHash": "0xd032e641a68f2a071da973b0c707169d634540ff30348ad61151d8d308504c79", - "address": "0x35CAf83118d58504C179b50D538a095ac08Ebc8f", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000005d407a012071cb234ca1a965be9e47a3fca5d704" - ], - "data": "0x", - "logIndex": 431, - "blockHash": "0x7ead81b3db7a6bd64acaf36dd614bf8b6d3bb6cc0e709c19e61621986f7d6b8e" - } - ], - "blockNumber": 31682991, - "cumulativeGasUsed": "33125586", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5D407A012071CB234CA1A965be9E47a3fCA5d704", - 10000000000000, - "0x3f170631ed9821ca51a59d996ab095162438dc10", - "0x7b4c560f33a71a9f7a500af3c4c65b46fbbafdb7", - 8, - 1, - 3, - "0x54330d28ca3357f294334bdc454a032e7f353416" - ], - "numDeployments": 3, - "solcInputHash": "842d1ee649da66bb8083e389f94a16de", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minimumDonation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_balancerRouter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_poolId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_assetsInPool\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_wethIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_olasIndex\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_incentiveTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"epochRewards\",\"type\":\"uint256\"}],\"name\":\"AuctionEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"donatorAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DonationReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"EthDonatedToBalancer\",\"type\":\"event\"},{\"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\":true,\"internalType\":\"address\",\"name\":\"donatorAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RewardsClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UnclaimedRewardsDonated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"assetsInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balancerRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimAmount\",\"type\":\"uint256\"}],\"name\":\"canPayTicket\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canPlayGame\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"claimable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endEpoch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"epochDonated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"epochToClaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"epochToDonations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"epochToEndBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"epochToTotalDonated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"donation\",\"type\":\"uint256\"}],\"name\":\"estimateTicketPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceAdvanceEpoch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlocksRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getCurrentShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEpochLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEpochRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"getGameState\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochEndBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minimumDonation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_blocksRemaining\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_epochRewards\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_totalDonated\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_totalClaimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_incentiveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_userCurrentDonation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_userCurrentShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_userClaimable\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_hasClaimed\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_canPlayGame\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalClaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalDonated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalUnclaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"incentiveBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"incentiveTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxDonatorsPerEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minimumDonation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"olasIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"permit2\",\"outputs\":[{\"internalType\":\"contract IPermit2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"topUpIncentiveBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalClaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalDonated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wethIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AddressInsufficientBalance(address)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Staking.sol\":\"DerolasStaking\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Context} from \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initial owner is set to the address provided by the deployer. This can\\n * later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n /**\\n * @dev The caller account is not authorized to perform an operation.\\n */\\n error OwnableUnauthorizedAccount(address account);\\n\\n /**\\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\\n */\\n error OwnableInvalidOwner(address owner);\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\\n */\\n constructor(address initialOwner) {\\n if (initialOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(initialOwner);\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n if (owner() != _msgSender()) {\\n revert OwnableUnauthorizedAccount(_msgSender());\\n }\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n if (newOwner == address(0)) {\\n revert OwnableInvalidOwner(address(0));\\n }\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC20Permit} from \\\"../extensions/IERC20Permit.sol\\\";\\nimport {Address} from \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n /**\\n * @dev An operation with an ERC20 token failed.\\n */\\n error SafeERC20FailedOperation(address token);\\n\\n /**\\n * @dev Indicates a failed `decreaseAllowance` request.\\n */\\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n forceApprove(token, spender, oldAllowance + value);\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n * value, non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n unchecked {\\n uint256 currentAllowance = token.allowance(address(this), spender);\\n if (currentAllowance < requestedDecrease) {\\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n }\\n forceApprove(token, spender, currentAllowance - requestedDecrease);\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n * to be set to zero before setting it to a non-zero value, such as USDT.\\n */\\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data);\\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\\n revert SafeERC20FailedOperation(address(token));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\\n }\\n}\\n\",\"keccak256\":\"0x37bb49513c49c87c4642a891b13b63571bc87013dde806617aa1efb54605f386\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev The ETH balance of the account is not enough to perform the operation.\\n */\\n error AddressInsufficientBalance(address account);\\n\\n /**\\n * @dev There's no code at `target` (it is not a contract).\\n */\\n error AddressEmptyCode(address target);\\n\\n /**\\n * @dev A call to an address target failed. The target may have reverted.\\n */\\n error FailedInnerCall();\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n if (address(this).balance < amount) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n if (!success) {\\n revert FailedInnerCall();\\n }\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason or custom error, it is bubbled\\n * up by this function (like regular Solidity function calls). However, if\\n * the call reverted with no returned reason, this function reverts with a\\n * {FailedInnerCall} error.\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n if (address(this).balance < value) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\\n * unsuccessful call.\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata\\n ) internal view returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n // only check if target is a contract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n if (returndata.length == 0 && target.code.length == 0) {\\n revert AddressEmptyCode(target);\\n }\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n * revert reason or with a default {FailedInnerCall} error.\\n */\\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\\n */\\n function _revert(bytes memory returndata) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert FailedInnerCall();\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant NOT_ENTERED = 1;\\n uint256 private constant ENTERED = 2;\\n\\n uint256 private _status;\\n\\n /**\\n * @dev Unauthorized reentrant call.\\n */\\n error ReentrancyGuardReentrantCall();\\n\\n constructor() {\\n _status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be NOT_ENTERED\\n if (_status == ENTERED) {\\n revert ReentrancyGuardReentrantCall();\\n }\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xf980daa263b661ab8ddee7d4fd833c7da7e7995e2c359ff1f17e67e4112f2236\",\"license\":\"MIT\"},\"contracts/Staking.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IBalancerRouter {\\n function donate(\\n address pool,\\n uint256[] memory amountsIn,\\n bool wethIsEth,\\n bytes memory userData\\n ) external payable;\\n // get permit2\\n function getPermit2() external view returns (address);\\n}\\n\\ninterface IPermit2 {\\n function approve(address token, address spender, uint160 amount, uint48 expiration) external;\\n}\\n\\n\\ncontract DerolasStaking is ReentrancyGuard, Ownable {\\n using SafeERC20 for IERC20;\\n\\n\\n IPermit2 public immutable permit2;\\n\\n address public immutable balancerRouter;\\n address public immutable poolId;\\n uint256 public immutable assetsInPool;\\n uint256 public immutable wethIndex;\\n uint256 public immutable olasIndex;\\n address public immutable incentiveTokenAddress;\\n\\n uint256 public immutable minimumDonation;\\n uint256 public immutable epochRewards = 1e18; // 1 OLAS\\n uint256 public immutable epochLength = 90;\\n\\n uint256 public totalDonated;\\n uint256 public totalClaimed;\\n uint256 public currentEpoch = 0;\\n\\n uint256 public constant maxDonatorsPerEpoch = 88;\\n\\n mapping(uint256 => mapping(address => uint256)) public epochToDonations;\\n mapping(uint256 => mapping(address => uint256)) public epochToClaimed;\\n mapping(uint256 => uint256) public epochToTotalDonated;\\n mapping(uint256 => uint256) public epochToEndBlock;\\n mapping(uint256 => bool) public epochDonated;\\n\\n event DonationReceived(address indexed donatorAddress, uint256 indexed amount);\\n event AuctionEnded(uint256 indexed epochRewards);\\n event UnclaimedRewardsDonated(uint256 indexed amount);\\n event RewardsClaimed(address indexed donatorAddress, uint256 indexed amount);\\n event EthDonatedToBalancer(uint256 indexed amount);\\n\\n\\n receive() external payable {}\\n\\n function incentiveBalance() public view returns (uint256) {\\n return IERC20(incentiveTokenAddress).balanceOf(address(this));\\n }\\n\\n function canPlayGame() public view returns (bool) {\\n return incentiveBalance() >= epochRewards;\\n }\\n\\n function canPayTicket(uint256 claimAmount) public view returns (bool) {\\n return incentiveBalance() >= claimAmount;\\n }\\n\\n modifier onlyOncePerEpoch() {\\n require(block.number >= epochToEndBlock[currentEpoch], \\\"Epoch not over\\\");\\n _;\\n }\\n\\n modifier gameHasStarted() {\\n require(currentEpoch > 0, \\\"Game has not started yet\\\");\\n _;\\n }\\n\\n\\n function endEpoch() external onlyOncePerEpoch nonReentrant {\\n require(currentEpoch > 0, \\\"No epoch to end\\\");\\n require(block.number > epochToEndBlock[currentEpoch], \\\"Epoch not over\\\");\\n donateUnclaimedRewards();\\n donateEthContribution();\\n storeGame();\\n advanceEpoch();\\n emit AuctionEnded(epochRewards);\\n }\\n\\n\\n function storeGame() internal {\\n epochToTotalDonated[currentEpoch] = totalDonated;\\n }\\n\\n function advanceEpoch() internal {\\n currentEpoch += 1;\\n totalDonated = 0;\\n totalClaimed = 0;\\n epochToEndBlock[currentEpoch] = block.number + epochLength;\\n }\\n\\n function donateUnclaimedRewards() internal {\\n if (currentEpoch == 0) {\\n return;\\n }\\n uint256 epoch = currentEpoch - 1;\\n uint256 totalEpochDonations = epochToTotalDonated[epoch];\\n if (totalEpochDonations == 0) {\\n epochDonated[epoch] = true;\\n return;\\n }\\n\\n uint256 unclaimedAmount = epochRewards - totalClaimed;\\n if (unclaimedAmount == 0) {\\n epochDonated[epoch] = true;\\n return;\\n }\\n require(IERC20(incentiveTokenAddress).balanceOf(address(this)) >= unclaimedAmount, \\\"Not enough incentive balance to donate\\\");\\n\\n uint256[] memory amountsIn = new uint256[](assetsInPool);\\n amountsIn[olasIndex] = unclaimedAmount;\\n\\n IERC20 token = IERC20(incentiveTokenAddress);\\n token.approve(address(permit2), 0);\\n token.approve(address(permit2), unclaimedAmount);\\n permit2.approve(incentiveTokenAddress, balancerRouter, uint160(unclaimedAmount), uint48(block.timestamp + 1 days));\\n IBalancerRouter(balancerRouter).donate(poolId, amountsIn, true, \\\"\\\");\\n epochDonated[epoch] = true;\\n emit UnclaimedRewardsDonated(unclaimedAmount);\\n }\\n function donateEthContribution() internal {\\n // require(IERC20(incentiveTokenAddress).balanceOf(address(this)) >= unclaimedAmount, \\\"Not enough incentive balance to donate\\\");\\n // we instead check the whole balance of the contract\\n uint256 contributionAmount = address(this).balance;\\n if (contributionAmount == 0) {\\n return;\\n }\\n uint256[] memory amountsIn = new uint256[](assetsInPool);\\n amountsIn[wethIndex] = contributionAmount;\\n IBalancerRouter(balancerRouter).donate{value: contributionAmount}(poolId, amountsIn, true, \\\"\\\");\\n emit EthDonatedToBalancer(contributionAmount);\\n }\\n\\n\\n function claim() external nonReentrant {\\n require(currentEpoch > 0, \\\"No epoch to claim from\\\");\\n\\n uint256 claimEpoch = currentEpoch - 1;\\n require(epochToEndBlock[claimEpoch] > 0, \\\"Epoch not ended yet\\\");\\n require(block.number <= epochToEndBlock[claimEpoch] + (2 * epochLength), \\\"Claim window closed\\\");\\n require(epochToClaimed[claimEpoch][msg.sender] == 0, \\\"Already claimed\\\");\\n\\n uint256 donation = epochToDonations[claimEpoch][msg.sender];\\n require(donation > 0, \\\"No donation found\\\");\\n\\n uint256 totalEpochDonations = epochToTotalDonated[claimEpoch];\\n require(totalEpochDonations > 0, \\\"No donations this epoch\\\");\\n\\n uint256 amount = (donation * epochRewards) / totalEpochDonations;\\n require(amount > 0, \\\"Nothing to claim\\\");\\n require(canPayTicket(amount), \\\"Not enough OLAS rewards\\\");\\n\\n epochToClaimed[claimEpoch][msg.sender] = amount;\\n\\n IERC20(incentiveTokenAddress).transfer(msg.sender, amount);\\n\\n totalClaimed += amount;\\n emit RewardsClaimed(msg.sender, amount);\\n }\\n\\n function claimable(address _address) external view returns (uint256) {\\n if (currentEpoch == 0) {\\n return 0;\\n }\\n uint256 claimEpoch = currentEpoch - 1;\\n if (epochToClaimed[claimEpoch][_address] > 0) {\\n return 0;\\n }\\n\\n uint256 donation = epochToDonations[claimEpoch][_address];\\n uint256 totalEpochDonations = epochToTotalDonated[claimEpoch];\\n\\n if (donation == 0 || totalEpochDonations == 0) {\\n return 0;\\n }\\n\\n return (donation * epochRewards) / totalEpochDonations;\\n }\\n\\n function estimateTicketPercentage(uint256 donation) public view returns (uint256) {\\n require(donation >= minimumDonation, \\\"Minimum donation not met\\\");\\n require(canPlayGame(), \\\"Not enough OLAS rewards to play the game\\\");\\n\\n if (totalDonated == 0) {\\n return 1e18; // full share\\n }\\n\\n return (donation * 1e18) / totalDonated;\\n }\\n\\n function donate() external payable nonReentrant gameHasStarted {\\n require(msg.value >= minimumDonation, \\\"Donation amount is less than the minimum donation\\\");\\n require(canPlayGame(), \\\"Not enough OLAS rewards to play the game\\\");\\n require(epochToDonations[currentEpoch][msg.sender] == 0, \\\"Already donated this epoch\\\");\\n require(epochToTotalDonated[currentEpoch] < maxDonatorsPerEpoch, \\\"Max donators reached\\\");\\n\\n totalDonated += msg.value;\\n epochToDonations[currentEpoch][msg.sender] = msg.value;\\n\\n emit DonationReceived(msg.sender, msg.value);\\n }\\n\\n function topUpIncentiveBalance(uint256 amount) external {\\n require(amount > 0, \\\"Amount must be greater than 0\\\");\\n require(IERC20(incentiveTokenAddress).balanceOf(msg.sender) >= amount, \\\"Not enough OLAS rewards\\\");\\n require(IERC20(incentiveTokenAddress).allowance(msg.sender, address(this)) >= amount, \\\"Not enough allowance\\\");\\n\\n IERC20(incentiveTokenAddress).safeTransferFrom(msg.sender, address(this), amount);\\n }\\n\\n function getCurrentShare(address _address) public view returns (uint256) {\\n uint256 donation = epochToDonations[currentEpoch][_address];\\n if (donation == 0) {\\n return 0;\\n }\\n return (donation * 1e18) / totalDonated;\\n }\\n\\n function getBlocksRemaining() public view returns (uint256) {\\n if (currentEpoch == 0) {\\n return 0;\\n }\\n if (block.number >= epochToEndBlock[currentEpoch]) {\\n return 0;\\n }\\n uint256 blocksRemaining = epochToEndBlock[currentEpoch] - block.number;\\n return blocksRemaining;\\n }\\n\\n\\n function getTotalDonated() public view returns (uint256) {\\n return totalDonated;\\n }\\n\\n function getEpochRewards() public view returns (uint256) {\\n return epochRewards;\\n }\\n\\n function getCurrentEpoch() public view returns (uint256) {\\n return currentEpoch;\\n }\\n\\n function getTotalClaimed() public view returns (uint256) {\\n return totalClaimed;\\n }\\n\\n function getEpochLength() public view returns (uint256) {\\n return epochLength;\\n }\\n function getTotalUnclaimed() public view returns (uint256) {\\n if (currentEpoch == 0) {\\n return 0;\\n }\\n uint256 claimEpoch = currentEpoch - 1;\\n if (epochDonated[claimEpoch]) {\\n return 0;\\n }\\n uint256 totalEpochDonations = epochToTotalDonated[claimEpoch];\\n if (totalEpochDonations == 0) {\\n return 0;\\n }\\n return epochRewards - totalClaimed;\\n }\\n\\n function forceAdvanceEpoch() external onlyOwner {\\n storeGame();\\n advanceEpoch();\\n emit AuctionEnded(0);\\n }\\n\\n function getGameState(address user) external view returns (\\n uint256 _currentEpoch,\\n uint256 _epochLength,\\n uint256 _epochEndBlock,\\n uint256 _minimumDonation,\\n uint256 _blocksRemaining,\\n uint256 _epochRewards,\\n uint256 _totalDonated,\\n uint256 _totalClaimed,\\n uint256 _incentiveBalance,\\n uint256 _userCurrentDonation,\\n uint256 _userCurrentShare,\\n uint256 _userClaimable,\\n bool _hasClaimed,\\n bool _canPlayGame\\n ) {\\n _currentEpoch = currentEpoch;\\n _epochLength = epochLength;\\n _epochEndBlock = epochToEndBlock[currentEpoch];\\n _minimumDonation = minimumDonation;\\n _blocksRemaining = block.number >= _epochEndBlock ? 0 : (_epochEndBlock - block.number);\\n _epochRewards = epochRewards;\\n _totalDonated = totalDonated;\\n _totalClaimed = totalClaimed;\\n _incentiveBalance = IERC20(incentiveTokenAddress).balanceOf(address(this));\\n _userCurrentDonation = epochToDonations[currentEpoch][user];\\n _userCurrentShare = totalDonated == 0 ? 0 : (_userCurrentDonation * 1e18) / totalDonated;\\n \\n if (currentEpoch == 0) {\\n _userClaimable = 0;\\n _hasClaimed = false;\\n } else {\\n uint256 claimEpoch = currentEpoch - 1;\\n _hasClaimed = epochToClaimed[claimEpoch][user] > 0;\\n uint256 donation = epochToDonations[claimEpoch][user];\\n uint256 totalEpochDonations = epochToTotalDonated[claimEpoch];\\n if (donation == 0 || totalEpochDonations == 0 || _hasClaimed) {\\n _userClaimable = 0;\\n } else {\\n _userClaimable = (donation * epochRewards) / totalEpochDonations;\\n }\\n }\\n _canPlayGame = canPlayGame();\\n }\\n\\n\\n constructor(\\n address _owner,\\n uint256 _minimumDonation,\\n address _balancerRouter,\\n address _poolId,\\n uint256 _assetsInPool,\\n uint256 _wethIndex,\\n uint256 _olasIndex,\\n address _incentiveTokenAddress\\n ) Ownable(_owner) {\\n minimumDonation = _minimumDonation;\\n balancerRouter = _balancerRouter;\\n poolId = _poolId;\\n assetsInPool = _assetsInPool;\\n wethIndex = _wethIndex;\\n olasIndex = _olasIndex;\\n incentiveTokenAddress = _incentiveTokenAddress;\\n epochToEndBlock[currentEpoch] = block.number + epochLength;\\n permit2 = IPermit2(IBalancerRouter(_balancerRouter).getPermit2());\\n currentEpoch = 1;\\n epochToEndBlock[1] = block.number + epochLength;\\n \\n }\\n}\\n\",\"keccak256\":\"0xff5d76381701f007983ea0fbadc33d94f0089f9e998657554c82473b2647f390\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101c0604081815234620003245781906200248f803803809162000024828662000329565b8439610100938491810103126200032457620000408262000363565b60209182840151906200005581860162000363565b90620000646060870162000363565b9460808701519460a0880151906200008460e060c08b01519a0162000363565b60016000908155909590926001600160a01b0392831680156200030c57600180546001600160a01b03198116831790915584167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a361018098670de0b6b3a76400008a526101a09a605a8c5285600455610160998a528360a05260c05260e0528b52610120998a52610140958652605a4301804311620002f85783805260088552858420558451631bbf2e2360e01b81529084908290600490829086165afa908115620002ee578391620002ad575b50166080526001600455865143019182431162000299579060088492600183525220555194612116968762000379883960805187818161130801526118f4015260a05187818161117d015281816119c50152611c68015260c05187818161123f01528181611a290152611cb4015260e0518781816111c4015281816118a00152611c160152518681816109e10152611c4001525185818161084b01526118cb01525184818161057b01528181610a3801528181610f0c015281816112830152818161158f015261185a0152518381816102dd01528181610616015281816109780152611ecd01525182818161030f0152818161054c0152818161091f01528181610e83015281816113ba015281816114d90152818161181201528181611e2b01526120b70152518181816105ef01528181610df40152818161149e01526116a90152f35b634e487b7160e01b82526011600452602482fd5b90508381813d8311620002e6575b620002c7818362000329565b81010312620002e257620002db9062000363565b3862000155565b8280fd5b503d620002bb565b85513d85823e3d90fd5b634e487b7160e01b84526011600452602484fd5b8651631e4fbdf760e01b815260048101869052602490fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200034d57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620003245756fe60806040818152600480361015610021575b505050361561001f57600080fd5b005b600092833560e01c908162b3704414611439575080630b9663db1461133757806312261ee7146112f357806315a9c750146112b257806320263e871461126e5780633e0dc34e1461122a578063402914f51461120457806340add905146111e7578063415ad1d7146111ac57806349ec8b38146111685780634e71d92d14610da6578063533b3bfc14610d8957806357d775f8146107e95780636e0d8ccd14610d5d578063715018a614610d00578063736a83a1146107ca5780637667180814610816578063773f7a3a1461099b5780637941a06214610ce35780638515697a14610cc35780638598836214610c9c57806385de7ff614610a045780638c3e5a06146109c95780638da5cb5b146109a05780639453e78c1461099b57806396d8f4f3146109605780639971db2f14610944578063a5be619a146108fd578063b2cb3a9b146108d0578063b519fc1f1461086e578063b88140ae14610833578063b97dd9e214610816578063b99c13e0146107ee578063cfe8a73b146107e9578063d54ad2a1146107ca578063d56e3068146107ab578063d9d60b52146104f6578063e7bd55dc146104cf578063ed88c68e146102bf578063f2fde38b146102305763fdf2792403610011573461022c578160031936011261022c576020928291610209611455565b90358252600585528282206001600160a01b039091168252845220549051908152f35b8280fd5b503461022c57602036600319011261022c5761024a611470565b906102536114fc565b6001600160a01b039182169283156102a9575050600154826bffffffffffffffffffffffff60a01b821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b508260031936011261022c576102d3611642565b8054801561048c577f0000000000000000000000000000000000000000000000000000000000000000341061042f5761033561030d611574565b7f00000000000000000000000000000000000000000000000000000000000000001115611e6e565b808452602091600583528385203386528352838520546103ec578185526007835260588486205410156103b2575061036f34600254611665565b6002558352600581528183209033845252349082205534337f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c528380a36001815580f35b835162461bcd60e51b8152908101839052601460248201527313585e08191bdb985d1bdc9cc81c995858da195960621b6044820152606490fd5b835162461bcd60e51b8152908101839052601a60248201527f416c726561647920646f6e6174656420746869732065706f63680000000000006044820152606490fd5b506020608492519162461bcd60e51b8352820152603160248201527f446f6e6174696f6e20616d6f756e74206973206c657373207468616e207468656044820152701036b4b734b6bab6903237b730ba34b7b760791b6064820152fd5b506020606492519162461bcd60e51b8352820152601860248201527f47616d6520686173206e6f7420737461727465642079657400000000000000006044820152fd5b503461022c57602036600319011261022c5760209282913581526007845220549051908152f35b5091346107a857602091826003193601126107a457610513611470565b9184549283825260088552828220548043101560001461079557825b60025460035486516370a0823160e01b8152308b820152929091907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038b866024817f000000000000000000000000000000000000000000000000000000000000000085165afa95861561078b578996610758575b508a895260058c528989209716808952968b5288882054958361071b5788975b8b61067657506101c09c5088995b836105e3611574565b10159b81519d8e9182527f00000000000000000000000000000000000000000000000000000000000000009101528c01527f000000000000000000000000000000000000000000000000000000000000000060608c015260808b015260a08a015260c089015260e088015261010087015261012086015261014085015261016084015215156101808301526101a0820152f35b99986000198c018c8111610707576101c09e5060078e828452600681528d8d852090855281528c84205415159d838552600582528d852090855281528c84205492845252848b83205491801580156106ff575b80156106f8575b156106de57505050986105da565b6106f29350906106ed91611d32565b611d45565b986105da565b508d6106d0565b5082156106c9565b50634e487b7160e01b815260118e52602490fd5b670de0b6b3a7640000808802908882041488151715610744578461073e91611d45565b976105cc565b50634e487b7160e01b895260118d52602489fd5b9095508b81813d8311610784575b6107708183611552565b81010312610780575194386105ac565b8880fd5b503d610766565b8a513d8b823e3d90fd5b61079f43826116df565b61052f565b5080fd5b80fd5b5050346107a457816003193601126107a4576020906002549051908152f35b5050346107a457816003193601126107a4576020906003549051908152f35b611486565b503461022c57602036600319011261022c57602092503561080d611574565b10159051908152f35b503461022c578260031936011261022c5760209250549051908152f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b83346107a857806003193601126107a8576108876114fc565b6108a06002546004546000526007602052604060002055565b6108a8611688565b807f45806e512b1f4f10e33e8b3cb64d1d11d998d8c554a95e0841fc1c701278bd5d8180a280f35b5050346107a45760203660031901126107a4576020906108f66108f1611470565b611fdf565b9051908152f35b5050346107a457816003193601126107a45760209061091a611574565b9051907f000000000000000000000000000000000000000000000000000000000000000011158152f35b5050346107a457816003193601126107a4576020905160588152f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b6114c1565b5050346107a457816003193601126107a45760015490516001600160a01b039091168152602090f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b508290346107a45760208060031936011261022c578135938415610c5b5780516370a0823160e01b815233848201526024957f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316939182818981885afa8015610c205782908890610c2a575b610a8492501015611d65565b8251636eb1769f60e11b8152338682015230888201528281604481885afa908115610c20579082918891610beb575b5010610bb257825190828201906323b872dd60e01b8252338984015230604484015260648301526064825260a082019167ffffffffffffffff9281811084821117610ba057855251969796889182919082885af13d15610b93573d918211610b815790610b3f91845191610b3085601f19601f8401160184611552565b82523d898584013e5b85611f7c565b8051918215159283610b68575b505050610b57578480f35b51635274afe760e01b815291820152fd5b610b789350820181019101611760565b15868080610b4c565b634e487b7160e01b8852604186528688fd5b610b3f9150606090610b39565b634e487b7160e01b8952604188528989fd5b825162461bcd60e51b8152808601839052601481890152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606490fd5b809250848092503d8311610c19575b610c048183611552565b81010312610c155781905189610ab3565b8680fd5b503d610bfa565b84513d89823e3d90fd5b50508281813d8311610c54575b610c418183611552565b81010312610c155781610a849151610a78565b503d610c37565b5162461bcd60e51b815291820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260649150fd5b503461022c57602036600319011261022c5760209282913581526008845220549051908152f35b5091346107a85760203660031901126107a857506108f660209235611ecb565b5050346107a457816003193601126107a4576020906108f6612045565b83346107a857806003193601126107a857610d196114fc565b600180546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022c57602036600319011261022c578160209360ff923581526009855220541690519015158152f35b5050346107a457816003193601126107a4576020906108f6612075565b503461022c578260031936011261022c57610dbf611642565b805491821561112c576000198301928311611119578284526020916008835281852054156110e25783855260088352818520547f00000000000000000000000000000000000000000000000000000000000000006001600160ff1b03811681036110cf5790610e319160011b90611665565b431161109857838552600683528185203386528352818520546110655783855260058352818520338652835281852054801561102f578486526007845282862054908115610fec57906106ed610ea8927f000000000000000000000000000000000000000000000000000000000000000090611d32565b938415610fb75784610f0793928592610eca83610ec3611574565b1015611d65565b88526006835283882033808a52908452848920839055845163a9059cbb60e01b815291820190815260208101929092529384918291604090910190565b0381887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610fae5750610f80575b5050610f5181600354611665565b600355337ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe8380a36001815580f35b81610f9f92903d10610fa7575b610f978183611552565b810190611760565b503880610f43565b503d610f8d565b513d86823e3d90fd5b5082606492519162461bcd60e51b8352820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152fd5b835162461bcd60e51b8152808401869052601760248201527f4e6f20646f6e6174696f6e7320746869732065706f63680000000000000000006044820152606490fd5b5082606492519162461bcd60e51b83528201526011602482015270139bc8191bdb985d1a5bdb88199bdd5b99607a1b6044820152fd5b82606492519162461bcd60e51b8352820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152fd5b82606492519162461bcd60e51b8352820152601360248201527210db185a5b481dda5b991bddc818db1bdcd959606a1b6044820152fd5b634e487b7160e01b875260118352602487fd5b82606492519162461bcd60e51b83528201526013602482015272115c1bd8da081b9bdd08195b991959081e595d606a1b6044820152fd5b634e487b7160e01b845260118252602484fd5b906020606492519162461bcd60e51b835282015260166024820152754e6f2065706f636820746f20636c61696d2066726f6d60501b6044820152fd5b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346107a457816003193601126107a4576020906108f6611574565b5050346107a45760203660031901126107a4576020906108f6611225611470565b611db1565b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461022c578160031936011261022c5760209282916112d0611455565b90358252600685528282206001600160a01b039091168252845220549051908152f35b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461022c578260031936011261022c5780548352600860205261136082842054431015611605565b611368611642565b8054908115611404575082526008602052812054611387904311611605565b61138f6117dc565b611397611c08565b6113b06002546004546000526007602052604060002055565b6113b8611688565b7f00000000000000000000000000000000000000000000000000000000000000007f45806e512b1f4f10e33e8b3cb64d1d11d998d8c554a95e0841fc1c701278bd5d8280a26001815580f35b606490602084519162461bcd60e51b8352820152600f60248201526e139bc8195c1bd8da081d1bc8195b99608a1b6044820152fd5b8490346107a457816003193601126107a4576020906002548152f35b602435906001600160a01b038216820361146b57565b600080fd5b600435906001600160a01b038216820361146b57565b3461146b57600036600319011261146b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461146b57600036600319011261146b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b6001546001600160a01b0316330361151057565b60405163118cdaa760e01b8152336004820152602490fd5b67ffffffffffffffff811161153c57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761153c57604052565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156115f9576000916115cb575090565b906020823d82116115f1575b816115e460209383611552565b810103126107a857505190565b3d91506115d7565b6040513d6000823e3d90fd5b1561160c57565b60405162461bcd60e51b815260206004820152600e60248201526d22b837b1b4103737ba1037bb32b960911b6044820152606490fd5b600260005414611653576002600055565b604051633ee5aeb560e01b8152600490fd5b9190820180921161167257565b634e487b7160e01b600052601160045260246000fd5b600454600181018091116116725780600455600060025560006003556116ce7f000000000000000000000000000000000000000000000000000000000000000043611665565b906000526008602052604060002055565b9190820391821161167257565b67ffffffffffffffff811161153c5760051b60200190565b9061170e826116ec565b61171b6040519182611552565b828152809261172c601f19916116ec565b0190602036910137565b805182101561174a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9081602091031261146b5751801515810361146b5790565b6001600160a01b0390911681526080602080830182905283519183018290529260a0830192919084019060005b858282106117c85750505050600160408201526060818303910152600081520190565b8351865294850194909201916001016117a5565b600480546000908015611c03576000198101908111611bf0578082526020600781526040918284205415611bdb576118366003547f00000000000000000000000000000000000000000000000000000000000000006116df565b948515611bc45783516370a0823160e01b815230818301526001600160a01b0391907f00000000000000000000000000000000000000000000000000000000000000008316908581602481855afa908115611ace579089918991611b8f575b5010611b3d576118c47f0000000000000000000000000000000000000000000000000000000000000000611704565b92886118f07f000000000000000000000000000000000000000000000000000000000000000086611736565b52807f00000000000000000000000000000000000000000000000000000000000000001691888851888160448163095ea7b360e01b95868252898b830152806024830152875af18015611b3357611975928a928e92611b16575b508b519081526001600160a01b03871688820190815260208101929092529283918291604090910190565b03818d865af18015611b0c57611aef575b5062015180420192834211611adc57803b15611ad8579160848a92838d97969565ffffffffffff8d5197889687956387517c4560e01b87528b870152807f0000000000000000000000000000000000000000000000000000000000000000169b8c60248801521660448601521660648401525af18015611ace57611abb575b50813b15610c1557918691611a509383885180968195829463bf6ee3fd60e01b84527f0000000000000000000000000000000000000000000000000000000000000000908401611778565b03925af18015611ab157611a99575b508352600990528120805460ff191660011790557f1209e1080cd3a83981de8feb8856cd78637291d5929a806202ca79415225c4289080a2565b611aa38591611528565b611aad5738611a5f565b8380fd5b84513d87823e3d90fd5b611ac790979197611528565b9538611a05565b87513d8a823e3d90fd5b8980fd5b634e487b7160e01b8a526011855260248afd5b611b0590883d8a11610fa757610f978183611552565b5038611986565b89513d8c823e3d90fd5b611b2c90843d8611610fa757610f978183611552565b503861194a565b8a513d8d823e3d90fd5b855162461bcd60e51b8152808301869052602660248201527f4e6f7420656e6f75676820696e63656e746976652062616c616e636520746f20604482015265646f6e61746560d01b6064820152608490fd5b809250878092503d8311611bbd575b611ba88183611552565b81010312611bb95788905138611895565b8780fd5b503d611b9e565b508352600990529020805460ff1916600117905550565b50600990529020805460ff1916600117905550565b506011602492634e487b7160e01b835252fd5b505050565b4760008115611d2e57611c3a7f0000000000000000000000000000000000000000000000000000000000000000611704565b82611c657f000000000000000000000000000000000000000000000000000000000000000083611736565b527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561022c57611cdc8492849260405194858094819363bf6ee3fd60e01b83527f000000000000000000000000000000000000000000000000000000000000000060048401611778565b03925af18015611d2357907f6a105f72bec70df8ca4968fb6316bfbbcc1a488a733ebae3f6088e81652226f39291611d14575b5080a2565b611d1d90611528565b38611d0f565b6040513d84823e3d90fd5b5050565b8181029291811591840414171561167257565b8115611d4f570490565b634e487b7160e01b600052601260045260246000fd5b15611d6c57565b60405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f756768204f4c415320726577617264730000000000000000006044820152606490fd5b600454908115611e67576000198201918211611672576000908282526006602052604082209060018060a01b0316908183526020526040822054611e61578282526005602052604082209082526020526040812054918152600760205260408120549082158015611e59575b611e5357506106ed611e50927f000000000000000000000000000000000000000000000000000000000000000090611d32565b90565b91505090565b508115611e1d565b50905090565b5050600090565b15611e7557565b60405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f756768204f4c4153207265776172647320746f20706c6179206044820152677468652067616d6560c01b6064820152608490fd5b7f00000000000000000000000000000000000000000000000000000000000000008110611f3757611efd61030d611574565b6002548015611f2957670de0b6b3a76400009182810292818404149015171561167257611e5091611d45565b5050670de0b6b3a764000090565b60405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d20646f6e6174696f6e206e6f74206d657400000000000000006044820152606490fd5b90611fa35750805115611f9157805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580611fd6575b611fb4575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611fac565b6004549060009182526005602052604082209060018060a01b03168252602052604081205490811561204057670de0b6b3a76400008083029283040361202c5750600254611e5091611d45565b634e487b7160e01b81526011600452602490fd5b905090565b600454801561206f5760005260086020526040600020548043101561206f57611e509043906116df565b50600090565b600454801561206f57600019810190811161167257600052600960205260ff604060002054166120db576007602052604060002054156120db57611e506003547f00000000000000000000000000000000000000000000000000000000000000006116df565b60009056fea26469706673582212206b4c6c38b8676caacab5c1e8cad510c5e059eeb374d5abc421e8968f9328839364736f6c63430008140033", - "deployedBytecode": "0x60806040818152600480361015610021575b505050361561001f57600080fd5b005b600092833560e01c908162b3704414611439575080630b9663db1461133757806312261ee7146112f357806315a9c750146112b257806320263e871461126e5780633e0dc34e1461122a578063402914f51461120457806340add905146111e7578063415ad1d7146111ac57806349ec8b38146111685780634e71d92d14610da6578063533b3bfc14610d8957806357d775f8146107e95780636e0d8ccd14610d5d578063715018a614610d00578063736a83a1146107ca5780637667180814610816578063773f7a3a1461099b5780637941a06214610ce35780638515697a14610cc35780638598836214610c9c57806385de7ff614610a045780638c3e5a06146109c95780638da5cb5b146109a05780639453e78c1461099b57806396d8f4f3146109605780639971db2f14610944578063a5be619a146108fd578063b2cb3a9b146108d0578063b519fc1f1461086e578063b88140ae14610833578063b97dd9e214610816578063b99c13e0146107ee578063cfe8a73b146107e9578063d54ad2a1146107ca578063d56e3068146107ab578063d9d60b52146104f6578063e7bd55dc146104cf578063ed88c68e146102bf578063f2fde38b146102305763fdf2792403610011573461022c578160031936011261022c576020928291610209611455565b90358252600585528282206001600160a01b039091168252845220549051908152f35b8280fd5b503461022c57602036600319011261022c5761024a611470565b906102536114fc565b6001600160a01b039182169283156102a9575050600154826bffffffffffffffffffffffff60a01b821617600155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b508260031936011261022c576102d3611642565b8054801561048c577f0000000000000000000000000000000000000000000000000000000000000000341061042f5761033561030d611574565b7f00000000000000000000000000000000000000000000000000000000000000001115611e6e565b808452602091600583528385203386528352838520546103ec578185526007835260588486205410156103b2575061036f34600254611665565b6002558352600581528183209033845252349082205534337f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c528380a36001815580f35b835162461bcd60e51b8152908101839052601460248201527313585e08191bdb985d1bdc9cc81c995858da195960621b6044820152606490fd5b835162461bcd60e51b8152908101839052601a60248201527f416c726561647920646f6e6174656420746869732065706f63680000000000006044820152606490fd5b506020608492519162461bcd60e51b8352820152603160248201527f446f6e6174696f6e20616d6f756e74206973206c657373207468616e207468656044820152701036b4b734b6bab6903237b730ba34b7b760791b6064820152fd5b506020606492519162461bcd60e51b8352820152601860248201527f47616d6520686173206e6f7420737461727465642079657400000000000000006044820152fd5b503461022c57602036600319011261022c5760209282913581526007845220549051908152f35b5091346107a857602091826003193601126107a457610513611470565b9184549283825260088552828220548043101560001461079557825b60025460035486516370a0823160e01b8152308b820152929091907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038b866024817f000000000000000000000000000000000000000000000000000000000000000085165afa95861561078b578996610758575b508a895260058c528989209716808952968b5288882054958361071b5788975b8b61067657506101c09c5088995b836105e3611574565b10159b81519d8e9182527f00000000000000000000000000000000000000000000000000000000000000009101528c01527f000000000000000000000000000000000000000000000000000000000000000060608c015260808b015260a08a015260c089015260e088015261010087015261012086015261014085015261016084015215156101808301526101a0820152f35b99986000198c018c8111610707576101c09e5060078e828452600681528d8d852090855281528c84205415159d838552600582528d852090855281528c84205492845252848b83205491801580156106ff575b80156106f8575b156106de57505050986105da565b6106f29350906106ed91611d32565b611d45565b986105da565b508d6106d0565b5082156106c9565b50634e487b7160e01b815260118e52602490fd5b670de0b6b3a7640000808802908882041488151715610744578461073e91611d45565b976105cc565b50634e487b7160e01b895260118d52602489fd5b9095508b81813d8311610784575b6107708183611552565b81010312610780575194386105ac565b8880fd5b503d610766565b8a513d8b823e3d90fd5b61079f43826116df565b61052f565b5080fd5b80fd5b5050346107a457816003193601126107a4576020906002549051908152f35b5050346107a457816003193601126107a4576020906003549051908152f35b611486565b503461022c57602036600319011261022c57602092503561080d611574565b10159051908152f35b503461022c578260031936011261022c5760209250549051908152f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b83346107a857806003193601126107a8576108876114fc565b6108a06002546004546000526007602052604060002055565b6108a8611688565b807f45806e512b1f4f10e33e8b3cb64d1d11d998d8c554a95e0841fc1c701278bd5d8180a280f35b5050346107a45760203660031901126107a4576020906108f66108f1611470565b611fdf565b9051908152f35b5050346107a457816003193601126107a45760209061091a611574565b9051907f000000000000000000000000000000000000000000000000000000000000000011158152f35b5050346107a457816003193601126107a4576020905160588152f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b6114c1565b5050346107a457816003193601126107a45760015490516001600160a01b039091168152602090f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b508290346107a45760208060031936011261022c578135938415610c5b5780516370a0823160e01b815233848201526024957f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316939182818981885afa8015610c205782908890610c2a575b610a8492501015611d65565b8251636eb1769f60e11b8152338682015230888201528281604481885afa908115610c20579082918891610beb575b5010610bb257825190828201906323b872dd60e01b8252338984015230604484015260648301526064825260a082019167ffffffffffffffff9281811084821117610ba057855251969796889182919082885af13d15610b93573d918211610b815790610b3f91845191610b3085601f19601f8401160184611552565b82523d898584013e5b85611f7c565b8051918215159283610b68575b505050610b57578480f35b51635274afe760e01b815291820152fd5b610b789350820181019101611760565b15868080610b4c565b634e487b7160e01b8852604186528688fd5b610b3f9150606090610b39565b634e487b7160e01b8952604188528989fd5b825162461bcd60e51b8152808601839052601481890152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606490fd5b809250848092503d8311610c19575b610c048183611552565b81010312610c155781905189610ab3565b8680fd5b503d610bfa565b84513d89823e3d90fd5b50508281813d8311610c54575b610c418183611552565b81010312610c155781610a849151610a78565b503d610c37565b5162461bcd60e51b815291820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260649150fd5b503461022c57602036600319011261022c5760209282913581526008845220549051908152f35b5091346107a85760203660031901126107a857506108f660209235611ecb565b5050346107a457816003193601126107a4576020906108f6612045565b83346107a857806003193601126107a857610d196114fc565b600180546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022c57602036600319011261022c578160209360ff923581526009855220541690519015158152f35b5050346107a457816003193601126107a4576020906108f6612075565b503461022c578260031936011261022c57610dbf611642565b805491821561112c576000198301928311611119578284526020916008835281852054156110e25783855260088352818520547f00000000000000000000000000000000000000000000000000000000000000006001600160ff1b03811681036110cf5790610e319160011b90611665565b431161109857838552600683528185203386528352818520546110655783855260058352818520338652835281852054801561102f578486526007845282862054908115610fec57906106ed610ea8927f000000000000000000000000000000000000000000000000000000000000000090611d32565b938415610fb75784610f0793928592610eca83610ec3611574565b1015611d65565b88526006835283882033808a52908452848920839055845163a9059cbb60e01b815291820190815260208101929092529384918291604090910190565b0381887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610fae5750610f80575b5050610f5181600354611665565b600355337ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe8380a36001815580f35b81610f9f92903d10610fa7575b610f978183611552565b810190611760565b503880610f43565b503d610f8d565b513d86823e3d90fd5b5082606492519162461bcd60e51b8352820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152fd5b835162461bcd60e51b8152808401869052601760248201527f4e6f20646f6e6174696f6e7320746869732065706f63680000000000000000006044820152606490fd5b5082606492519162461bcd60e51b83528201526011602482015270139bc8191bdb985d1a5bdb88199bdd5b99607a1b6044820152fd5b82606492519162461bcd60e51b8352820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152fd5b82606492519162461bcd60e51b8352820152601360248201527210db185a5b481dda5b991bddc818db1bdcd959606a1b6044820152fd5b634e487b7160e01b875260118352602487fd5b82606492519162461bcd60e51b83528201526013602482015272115c1bd8da081b9bdd08195b991959081e595d606a1b6044820152fd5b634e487b7160e01b845260118252602484fd5b906020606492519162461bcd60e51b835282015260166024820152754e6f2065706f636820746f20636c61696d2066726f6d60501b6044820152fd5b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346107a457816003193601126107a457602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346107a457816003193601126107a4576020906108f6611574565b5050346107a45760203660031901126107a4576020906108f6611225611470565b611db1565b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461022c578160031936011261022c5760209282916112d0611455565b90358252600685528282206001600160a01b039091168252845220549051908152f35b5050346107a457816003193601126107a457517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461022c578260031936011261022c5780548352600860205261136082842054431015611605565b611368611642565b8054908115611404575082526008602052812054611387904311611605565b61138f6117dc565b611397611c08565b6113b06002546004546000526007602052604060002055565b6113b8611688565b7f00000000000000000000000000000000000000000000000000000000000000007f45806e512b1f4f10e33e8b3cb64d1d11d998d8c554a95e0841fc1c701278bd5d8280a26001815580f35b606490602084519162461bcd60e51b8352820152600f60248201526e139bc8195c1bd8da081d1bc8195b99608a1b6044820152fd5b8490346107a457816003193601126107a4576020906002548152f35b602435906001600160a01b038216820361146b57565b600080fd5b600435906001600160a01b038216820361146b57565b3461146b57600036600319011261146b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461146b57600036600319011261146b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b6001546001600160a01b0316330361151057565b60405163118cdaa760e01b8152336004820152602490fd5b67ffffffffffffffff811161153c57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761153c57604052565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156115f9576000916115cb575090565b906020823d82116115f1575b816115e460209383611552565b810103126107a857505190565b3d91506115d7565b6040513d6000823e3d90fd5b1561160c57565b60405162461bcd60e51b815260206004820152600e60248201526d22b837b1b4103737ba1037bb32b960911b6044820152606490fd5b600260005414611653576002600055565b604051633ee5aeb560e01b8152600490fd5b9190820180921161167257565b634e487b7160e01b600052601160045260246000fd5b600454600181018091116116725780600455600060025560006003556116ce7f000000000000000000000000000000000000000000000000000000000000000043611665565b906000526008602052604060002055565b9190820391821161167257565b67ffffffffffffffff811161153c5760051b60200190565b9061170e826116ec565b61171b6040519182611552565b828152809261172c601f19916116ec565b0190602036910137565b805182101561174a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9081602091031261146b5751801515810361146b5790565b6001600160a01b0390911681526080602080830182905283519183018290529260a0830192919084019060005b858282106117c85750505050600160408201526060818303910152600081520190565b8351865294850194909201916001016117a5565b600480546000908015611c03576000198101908111611bf0578082526020600781526040918284205415611bdb576118366003547f00000000000000000000000000000000000000000000000000000000000000006116df565b948515611bc45783516370a0823160e01b815230818301526001600160a01b0391907f00000000000000000000000000000000000000000000000000000000000000008316908581602481855afa908115611ace579089918991611b8f575b5010611b3d576118c47f0000000000000000000000000000000000000000000000000000000000000000611704565b92886118f07f000000000000000000000000000000000000000000000000000000000000000086611736565b52807f00000000000000000000000000000000000000000000000000000000000000001691888851888160448163095ea7b360e01b95868252898b830152806024830152875af18015611b3357611975928a928e92611b16575b508b519081526001600160a01b03871688820190815260208101929092529283918291604090910190565b03818d865af18015611b0c57611aef575b5062015180420192834211611adc57803b15611ad8579160848a92838d97969565ffffffffffff8d5197889687956387517c4560e01b87528b870152807f0000000000000000000000000000000000000000000000000000000000000000169b8c60248801521660448601521660648401525af18015611ace57611abb575b50813b15610c1557918691611a509383885180968195829463bf6ee3fd60e01b84527f0000000000000000000000000000000000000000000000000000000000000000908401611778565b03925af18015611ab157611a99575b508352600990528120805460ff191660011790557f1209e1080cd3a83981de8feb8856cd78637291d5929a806202ca79415225c4289080a2565b611aa38591611528565b611aad5738611a5f565b8380fd5b84513d87823e3d90fd5b611ac790979197611528565b9538611a05565b87513d8a823e3d90fd5b8980fd5b634e487b7160e01b8a526011855260248afd5b611b0590883d8a11610fa757610f978183611552565b5038611986565b89513d8c823e3d90fd5b611b2c90843d8611610fa757610f978183611552565b503861194a565b8a513d8d823e3d90fd5b855162461bcd60e51b8152808301869052602660248201527f4e6f7420656e6f75676820696e63656e746976652062616c616e636520746f20604482015265646f6e61746560d01b6064820152608490fd5b809250878092503d8311611bbd575b611ba88183611552565b81010312611bb95788905138611895565b8780fd5b503d611b9e565b508352600990529020805460ff1916600117905550565b50600990529020805460ff1916600117905550565b506011602492634e487b7160e01b835252fd5b505050565b4760008115611d2e57611c3a7f0000000000000000000000000000000000000000000000000000000000000000611704565b82611c657f000000000000000000000000000000000000000000000000000000000000000083611736565b527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561022c57611cdc8492849260405194858094819363bf6ee3fd60e01b83527f000000000000000000000000000000000000000000000000000000000000000060048401611778565b03925af18015611d2357907f6a105f72bec70df8ca4968fb6316bfbbcc1a488a733ebae3f6088e81652226f39291611d14575b5080a2565b611d1d90611528565b38611d0f565b6040513d84823e3d90fd5b5050565b8181029291811591840414171561167257565b8115611d4f570490565b634e487b7160e01b600052601260045260246000fd5b15611d6c57565b60405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f756768204f4c415320726577617264730000000000000000006044820152606490fd5b600454908115611e67576000198201918211611672576000908282526006602052604082209060018060a01b0316908183526020526040822054611e61578282526005602052604082209082526020526040812054918152600760205260408120549082158015611e59575b611e5357506106ed611e50927f000000000000000000000000000000000000000000000000000000000000000090611d32565b90565b91505090565b508115611e1d565b50905090565b5050600090565b15611e7557565b60405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f756768204f4c4153207265776172647320746f20706c6179206044820152677468652067616d6560c01b6064820152608490fd5b7f00000000000000000000000000000000000000000000000000000000000000008110611f3757611efd61030d611574565b6002548015611f2957670de0b6b3a76400009182810292818404149015171561167257611e5091611d45565b5050670de0b6b3a764000090565b60405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d20646f6e6174696f6e206e6f74206d657400000000000000006044820152606490fd5b90611fa35750805115611f9157805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580611fd6575b611fb4575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611fac565b6004549060009182526005602052604082209060018060a01b03168252602052604081205490811561204057670de0b6b3a76400008083029283040361202c5750600254611e5091611d45565b634e487b7160e01b81526011600452602490fd5b905090565b600454801561206f5760005260086020526040600020548043101561206f57611e509043906116df565b50600090565b600454801561206f57600019810190811161167257600052600960205260ff604060002054166120db576007602052604060002054156120db57611e506003547f00000000000000000000000000000000000000000000000000000000000000006116df565b60009056fea26469706673582212206b4c6c38b8676caacab5c1e8cad510c5e059eeb374d5abc421e8968f9328839364736f6c63430008140033", - "devdoc": { - "errors": { - "AddressEmptyCode(address)": [ - { - "details": "There's no code at `target` (it is not a contract)." + "bytecode": "0x6101a0604052620f424060805260015f819055600255348015610020575f5ffd5b506040516130a13803806130a183398101604081905261003f91610215565b6001600160a01b03808a16610120528881166101408190528882166101605260a08890529086166101005260c085905260e084905260408051630716585d60e51b8152905163e2cb0ba0916004808201926020929091908290030181865afa1580156100ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d191906102a4565b60808181525050886001600160a01b0316631bbf2e236040518163ffffffff1660e01b8152600401602060405180830381865afa158015610114573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013891906102bb565b6001600160a01b03166101805260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b919091557f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017e555050507f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017f9490945550505f80525050437f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746c155600180546001600160a01b031916331790556102db565b80516001600160a01b0381168114610210575f5ffd5b919050565b5f5f5f5f5f5f5f5f5f5f6101408b8d03121561022f575f5ffd5b8a51995061023f60208c016101fa565b985061024d60408c016101fa565b975061025b60608c016101fa565b60808c0151909750955061027160a08c016101fa565b60c08c015160e08d01516101008e0151610120909e01519c9f9b9e50999c989b979a919990989097909650945092505050565b5f602082840312156102b4575f5ffd5b5051919050565b5f602082840312156102cb575f5ffd5b6102d4826101fa565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051612cb96103e85f395f8181610231015281816121f1015281816122c7015261237801525f8181610351015281816124ee01526126b401525f61068a01525f8181610407015281816123c0015281816124bf015261268501525f81816102b801528181610b0e01528181610d1701528181610dce01528181611171015281816113430152818161191a01528181611d460152818161221f015281816122f6015261239f01525f8181610514015261260e01525f81816102eb015261217a01525f81816103a30152818161211301526125a701525f818161031e015281816120dc015261257b0152612cb95ff3fe6080604052600436106101f5575f3560e01c80638515697a11610117578063b2cb3a9b116100ac578063c9a97ec81161007c578063d9d60b5211610062578063d9d60b52146106f7578063ed88c68e14610723578063f0cf14f41461072b575f5ffd5b8063c9a97ec8146106ac578063d564c4bf146106cb575f5ffd5b8063b2cb3a9b146105cb578063b99ab0ad146105ea578063bb85204214610665578063bc5df1aa14610679575f5ffd5b80638da5cb5b116100e75780638da5cb5b146105365780638f1f6bc7146105625780639c89ae3814610598578063a6f9dae1146105ac575f5ffd5b80638515697a146104b157806385de7ff6146104d05780638a19c8bc146104ef5780638c3e5a0614610503575f5ffd5b8063415ad1d71161018d5780634e71d92d1161015d5780634e71d92d1461045f57806360c1328614610475578063678c2c3e14610489578063749aa2d91461049d575f5ffd5b8063415ad1d714610392578063417da65a146103c557806349ec8b38146103f65780634d6180ae14610429575f5ffd5b8063318bf475116101c8578063318bf475146102da57806337b197901461030d5780633e0dc34e14610340578063402914f514610373575f5ffd5b8063118f4348146101f957806312261ee714610220578063184023a51461027857806320263e87146102a7575b5f5ffd5b348015610204575f5ffd5b5061020d610756565b6040519081526020015b60405180910390f35b34801561022b575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610217565b348015610283575f5ffd5b50610297610292366004612913565b610789565b6040519015158152602001610217565b3480156102b2575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e5575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610318575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561034b575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b34801561037e575f5ffd5b5061020d61038d3660046129a9565b6107cf565b34801561039d575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d0575f5ffd5b506001546102979074010000000000000000000000000000000000000000900460ff1681565b348015610401575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b348015610434575f5ffd5b5061020d6104433660046129c2565b600360209081525f928352604080842090915290825290205481565b34801561046a575f5ffd5b506104736108aa565b005b348015610480575f5ffd5b50610473610b6b565b348015610494575f5ffd5b5061020d610e3d565b3480156104a8575f5ffd5b50610473610ea1565b3480156104bc575f5ffd5b5061020d6104cb3660046129ec565b6110b8565b3480156104db575f5ffd5b506104736104ea3660046129ec565b6112d5565b3480156104fa575f5ffd5b5061020d5f5481565b34801561050e575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610541575f5ffd5b506001546102539073ffffffffffffffffffffffffffffffffffffffff1681565b34801561056d575f5ffd5b5061020d61057c3660046129c2565b600460209081525f928352604080842090915290825290205481565b3480156105a3575f5ffd5b5061020d611397565b3480156105b7575f5ffd5b506104736105c63660046129a9565b6113fb565b3480156105d6575f5ffd5b5061020d6105e53660046129a9565b611567565b3480156105f5575f5ffd5b506106386106043660046129ec565b600560208190525f918252604090912080546001820154600283015460038401546004850154949095015492949193909286565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610217565b348015610670575f5ffd5b5061020d6115cb565b348015610684575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b7575f5ffd5b506104736106c6366004612a03565b611644565b3480156106d6575f5ffd5b506106ea6106e53660046129a9565b61177c565b6040516102179190612a66565b348015610702575f5ffd5b506107166107113660046129a9565b6117e6565b6040516102179190612a78565b610473611b7b565b348015610736575f5ffd5b5061020d6107453660046129a9565b60066020525f908152604090205481565b5f60055f60015f546107689190612b59565b81526020019081526020015f2060050154436107849190612b59565b905090565b5f825f8151811061079c5761079c612b72565b6020026020010151845f815181106107b6576107b6612b72565b602002602001015111156107c8575060015b9392505050565b5f5f60015f546107df9190612b59565b5f81815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684528252808320548484526005909252909120600101549192509081158061082c575080155b1561083b57505f949350505050565b5f83815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054801561087b57505f95945050505050565b5f8481526005602052604081205483906108959086612b9f565b61089f9190612bb6565b979650505050505050565b60025460011461091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e63794775617264000000000000000000000000000000000060448201526064015b60405180910390fd5b600280555f805461092e90600190612b59565b5f81815260036020908152604080832033808552908352818420548585526005845282852060010154600485528386209286529190935292205492935091156109d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610912565b5f8211610a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f20646f6e6174696f6e20666f756e640000000000000000000000000000006044820152606401610912565b5f838152600560205260408120548290610a569085612b9f565b610a609190612bb6565b90505f8111610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006044820152606401610912565b5f8481526004602090815260408083203384528252808320849055868352600590915281206002018054839290610b03908490612bee565b90915550610b3490507f00000000000000000000000000000000000000000000000000000000000000003383611fd6565b604051819033907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe905f90a3505060016002555050565b600254600114610bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280819055505f3073ffffffffffffffffffffffffffffffffffffffff1663bb8520426040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4c9190612c01565b60015490915073ffffffffffffffffffffffffffffffffffffffff163314610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610d5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d809190612c01565b610d8a9190612b59565b9050805f03610dc5576040517f933ffd0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154610e0a907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff1683611fd6565b60405181907fa0439bca775b7f749b09bd6b113c2498947cc75a6cd313b08284dd6da6db71aa905f90a250506001600255565b5f805481600581610e4f600185612b59565b81526020019081526020015f206005015443610e6b9190612b59565b5f83815260056020526040902060030154909150808210610e8f575f935050505090565b610e998282612b59565b935050505090565b600254600114610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280555f805490610f20600183612b59565b5f8381526005602081905260408083206003015484845292200154919250610f4791612bee565b4311610faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f526f756e64206e6f74206f7665720000000000000000000000000000000000006044820152606401610912565b610fb8816120a8565b610fc0612578565b5f610fcc836001612bee565b60015490915074010000000000000000000000000000000000000000900460ff16611023575f838152600560205260408082208054848452919092209081556003808301549082015560049182015491015561104c565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555b5f8381526005602081815260408084204393810193909355848455858452808420600201549387905260018301549254905190815286917f6cd5fa5a40ecd594f53649fa439e8f39cb2abf70e69eb744d79b8553c7d19788910160405180910390a45050600160025550565b5f805480825260056020526040822060040154831015611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d696e696d756d20646f6e6174696f6e206e6f74206d657400000000000000006044820152606401610912565b5f81815260056020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156111cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef9190612c01565b101561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4e6f7420656e6f756768207265776172647320746f20706c617920746865206760448201527f616d6500000000000000000000000000000000000000000000000000000000006064820152608401610912565b5f81815260056020526040812060010154908190036112a75750670de0b6b3a76400009392505050565b6112b18482612bee565b6112c385670de0b6b3a7640000612b9f565b6112cd9190612bb6565b949350505050565b5f811161133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610912565b61136a7f000000000000000000000000000000000000000000000000000000000000000033308461273d565b60405181907f084165e47a829e3a6faacb01bbc2c4773f890d5fba948b3d2ab5ffb003f2434f905f90a250565b5f8054816005816113a9600185612b59565b81526020019081526020015f2060050154436113c59190612b59565b5f83815260056020526040902060030154909150808211156113e5578091505b806113f1836064612b9f565b610e999190612bb6565b60015473ffffffffffffffffffffffffffffffffffffffff16331461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b73ffffffffffffffffffffffffffffffffffffffff81166114f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610912565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b5f805480825260036020908152604080842073ffffffffffffffffffffffffffffffffffffffff861685529091528220548083036115a857505f9392505050565b5f828152600560205260409020600101546112c382670de0b6b3a7640000612b9f565b5f8054816115da600183612b59565b5f818152600560205260409020600101549091501561160e575f8181526005602052604090205461160b9084612bee565b92505b5f828152600560205260409020600101541561163f575f8281526005602052604090205461163c9084612bee565b92505b505090565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b5f80546116d3906001612bee565b5f8181526005602090815260409182902087815560038101879055600401859055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055815187815290810186905290810184905290915081907f12a7025c39c132ef283c80c5db2fc1a564c96bf8fc3ca7af8e3cd63842c3a3499060600160405180910390a250505050565b6040805160018082528183019092526060916020808301908036833750505073ffffffffffffffffffffffffffffffffffffffff83165f908152600660205260408120548251929350918391906117d5576117d5612b72565b602002602001018181525050919050565b61184e604051806101c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581525090565b5f805480825260056020818152604084206003810154865290850183905260048101546060860152805460a086015260018082015460c0870152600282015460e08701529293909290919082906118a59086612b59565b81526020019081526020015f206005015490508160030154816118c89190612bee565b604085018190524310156118ec574384604001516118e69190612b59565b60808501525b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611974573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119989190612c01565b6101008501525f83815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529252918290205461012087015290517fb2cb3a9b0000000000000000000000000000000000000000000000000000000081526004810191909152309063b2cb3a9b90602401602060405180830381865afa158015611a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4c9190612c01565b6101408501525f611a5e600185612b59565b5f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845282528083205415156101808a0152838352600591829052909120015490915015611b3e576040517f402914f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87166004820152309063402914f590602401602060405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b379190612c01565b6101608601525b610120850151158015611b5a57508460a0015185610100015110155b8015611b695750846040015143105b15156101a08601525092949350505050565b600254600114611be7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280555f80548082526005602052604090912060040154341015611c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f446f6e6174696f6e20616d6f756e74206973206c657373207468616e2074686560448201527f206d696e696d756d20646f6e6174696f6e0000000000000000000000000000006064820152608401610912565b5f3073ffffffffffffffffffffffffffffffffffffffff1663bb8520426040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfc9190612c01565b5f83815260056020526040902054909150611d18908290612bee565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611da0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc49190612c01565b1015611e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4e6f7420656e6f756768207265776172647320746f20706c617920746865206760448201527f616d6500000000000000000000000000000000000000000000000000000000006064820152608401610912565b5f82815260036020908152604080832033845290915290205415611ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f416c726561647920646f6e61746564207468697320726f756e640000000000006044820152606401610912565b5f611edb610e3d565b11611f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f526f756e642068617320656e64656400000000000000000000000000000000006044820152606401610912565b5f8281526005602052604081206001018054349290611f62908490612bee565b90915550505f8281526003602090815260408083203384528252808320349081905560069092528220805491929091611f9c908490612bee565b9091555050604051349033907f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52905f90a350506001600255565b5f6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff84166004528260245260205f60445f5f895af13d15601f3d1160015f511416171691505f6060528060405250806120a2576040517fabae3d6d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301523060248301528416604482015260648101839052608401610912565b50505050565b5f818152600560205260408120600281015490546120c69190612b59565b5f838152600560205260409020600101549091507f0000000000000000000000000000000000000000000000000000000000000000821080612106575080155b1561211057505050565b5f7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff81111561214a5761214a61282c565b604051908082528060200260200182016040528015612173578160200160208202803683370190505b50905082817f0000000000000000000000000000000000000000000000000000000000000000815181106121a9576121a9612b72565b60209081029190910101526040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301525f60248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015612265573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122899190612c18565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561233c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190612c18565b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166387517c457f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866123ed4262015180612bee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015292841660248401529216604482015265ffffffffffff90911660648201526084015f604051808303815f87803b15801561246e575f5ffd5b505af1158015612480573d5f5f3e3d5ffd5b50506040517fbf6ee3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016925063bf6ee3fd915061251b907f0000000000000000000000000000000000000000000000000000000000000000908590600190600401612c37565b5f604051808303815f87803b158015612532575f5ffd5b505af1158015612544573d5f5f3e3d5ffd5b50506040518592507ff2092fa360386c48bdcf4bbd9eb0512e6288744a8664acf38aead698368bb19291505f90a250505050565b477f00000000000000000000000000000000000000000000000000000000000000008110156125a45750565b5f7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8111156125de576125de61282c565b604051908082528060200260200182016040528015612607578160200160208202803683370190505b50905081817f00000000000000000000000000000000000000000000000000000000000000008151811061263d5761263d612b72565b60209081029190910101526040517fbf6ee3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bf6ee3fd9084906126e1907f0000000000000000000000000000000000000000000000000000000000000000908690600190600401612c37565b5f604051808303818588803b1580156126f8575f5ffd5b505af115801561270a573d5f5f3e3d5ffd5b50506040518593507f6a105f72bec70df8ca4968fb6316bfbbcc1a488a733ebae3f6088e81652226f392505f9150a25050565b5f6040517f23b872dd000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff851660045273ffffffffffffffffffffffffffffffffffffffff84166024528260445260205f60645f5f8a5af13d15601f3d1160015f511416171691505f606052806040525080612825576040517fabae3d6d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483015280861660248301528416604482015260648101839052608401610912565b5050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612868575f5ffd5b813567ffffffffffffffff8111156128825761288261282c565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff821117156128cd576128cd61282c565b6040529182526020818501810192908101868411156128ea575f5ffd5b6020860192505b838310156129095782358152602092830192016128f1565b5095945050505050565b5f5f5f60608486031215612925575f5ffd5b833567ffffffffffffffff81111561293b575f5ffd5b61294786828701612859565b935050602084013567ffffffffffffffff811115612963575f5ffd5b61296f86828701612859565b93969395505050506040919091013590565b803573ffffffffffffffffffffffffffffffffffffffff811681146129a4575f5ffd5b919050565b5f602082840312156129b9575f5ffd5b6107c882612981565b5f5f604083850312156129d3575f5ffd5b823591506129e360208401612981565b90509250929050565b5f602082840312156129fc575f5ffd5b5035919050565b5f5f5f60608486031215612a15575f5ffd5b505081359360208301359350604090920135919050565b5f8151808452602084019350602083015f5b82811015612a5c578151865260209586019590910190600101612a3e565b5093949350505050565b602081525f6107c86020830184612a2c565b5f6101c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100830151610100830152610120830151610120830152610140830151610140830152610160830151610160830152610180830151612b0f61018084018215159052565b506101a0830151612b256101a084018215159052565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115612b6c57612b6c612b2c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417612b6c57612b6c612b2c565b5f82612be9577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115612b6c57612b6c612b2c565b5f60208284031215612c11575f5ffd5b5051919050565b5f60208284031215612c28575f5ffd5b815180151581146107c8575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152608060208201525f612c656080830185612a2c565b9215156040830152508082036060909101525f81526020019291505056fea264697066735822122095d1521c23ac2cc5c0ddc16570b634e53b45cd7ba9e663b764a9c4a9f3629b7f64736f6c634300081e0033", + "deployedBytecode": { + "object": "0x6080604052600436106101f5575f3560e01c80638515697a11610117578063b2cb3a9b116100ac578063c9a97ec81161007c578063d9d60b5211610062578063d9d60b52146106f7578063ed88c68e14610723578063f0cf14f41461072b575f5ffd5b8063c9a97ec8146106ac578063d564c4bf146106cb575f5ffd5b8063b2cb3a9b146105cb578063b99ab0ad146105ea578063bb85204214610665578063bc5df1aa14610679575f5ffd5b80638da5cb5b116100e75780638da5cb5b146105365780638f1f6bc7146105625780639c89ae3814610598578063a6f9dae1146105ac575f5ffd5b80638515697a146104b157806385de7ff6146104d05780638a19c8bc146104ef5780638c3e5a0614610503575f5ffd5b8063415ad1d71161018d5780634e71d92d1161015d5780634e71d92d1461045f57806360c1328614610475578063678c2c3e14610489578063749aa2d91461049d575f5ffd5b8063415ad1d714610392578063417da65a146103c557806349ec8b38146103f65780634d6180ae14610429575f5ffd5b8063318bf475116101c8578063318bf475146102da57806337b197901461030d5780633e0dc34e14610340578063402914f514610373575f5ffd5b8063118f4348146101f957806312261ee714610220578063184023a51461027857806320263e87146102a7575b5f5ffd5b348015610204575f5ffd5b5061020d610756565b6040519081526020015b60405180910390f35b34801561022b575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610217565b348015610283575f5ffd5b50610297610292366004612913565b610789565b6040519015158152602001610217565b3480156102b2575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e5575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610318575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561034b575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b34801561037e575f5ffd5b5061020d61038d3660046129a9565b6107cf565b34801561039d575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d0575f5ffd5b506001546102979074010000000000000000000000000000000000000000900460ff1681565b348015610401575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b348015610434575f5ffd5b5061020d6104433660046129c2565b600360209081525f928352604080842090915290825290205481565b34801561046a575f5ffd5b506104736108aa565b005b348015610480575f5ffd5b50610473610b6b565b348015610494575f5ffd5b5061020d610e3d565b3480156104a8575f5ffd5b50610473610ea1565b3480156104bc575f5ffd5b5061020d6104cb3660046129ec565b6110b8565b3480156104db575f5ffd5b506104736104ea3660046129ec565b6112d5565b3480156104fa575f5ffd5b5061020d5f5481565b34801561050e575f5ffd5b5061020d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610541575f5ffd5b506001546102539073ffffffffffffffffffffffffffffffffffffffff1681565b34801561056d575f5ffd5b5061020d61057c3660046129c2565b600460209081525f928352604080842090915290825290205481565b3480156105a3575f5ffd5b5061020d611397565b3480156105b7575f5ffd5b506104736105c63660046129a9565b6113fb565b3480156105d6575f5ffd5b5061020d6105e53660046129a9565b611567565b3480156105f5575f5ffd5b506106386106043660046129ec565b600560208190525f918252604090912080546001820154600283015460038401546004850154949095015492949193909286565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610217565b348015610670575f5ffd5b5061020d6115cb565b348015610684575f5ffd5b506102537f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b7575f5ffd5b506104736106c6366004612a03565b611644565b3480156106d6575f5ffd5b506106ea6106e53660046129a9565b61177c565b6040516102179190612a66565b348015610702575f5ffd5b506107166107113660046129a9565b6117e6565b6040516102179190612a78565b610473611b7b565b348015610736575f5ffd5b5061020d6107453660046129a9565b60066020525f908152604090205481565b5f60055f60015f546107689190612b59565b81526020019081526020015f2060050154436107849190612b59565b905090565b5f825f8151811061079c5761079c612b72565b6020026020010151845f815181106107b6576107b6612b72565b602002602001015111156107c8575060015b9392505050565b5f5f60015f546107df9190612b59565b5f81815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684528252808320548484526005909252909120600101549192509081158061082c575080155b1561083b57505f949350505050565b5f83815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054801561087b57505f95945050505050565b5f8481526005602052604081205483906108959086612b9f565b61089f9190612bb6565b979650505050505050565b60025460011461091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e63794775617264000000000000000000000000000000000060448201526064015b60405180910390fd5b600280555f805461092e90600190612b59565b5f81815260036020908152604080832033808552908352818420548585526005845282852060010154600485528386209286529190935292205492935091156109d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610912565b5f8211610a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f20646f6e6174696f6e20666f756e640000000000000000000000000000006044820152606401610912565b5f838152600560205260408120548290610a569085612b9f565b610a609190612bb6565b90505f8111610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d000000000000000000000000000000006044820152606401610912565b5f8481526004602090815260408083203384528252808320849055868352600590915281206002018054839290610b03908490612bee565b90915550610b3490507f00000000000000000000000000000000000000000000000000000000000000003383611fd6565b604051819033907ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe905f90a3505060016002555050565b600254600114610bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280819055505f3073ffffffffffffffffffffffffffffffffffffffff1663bb8520426040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4c9190612c01565b60015490915073ffffffffffffffffffffffffffffffffffffffff163314610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610d5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d809190612c01565b610d8a9190612b59565b9050805f03610dc5576040517f933ffd0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154610e0a907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff1683611fd6565b60405181907fa0439bca775b7f749b09bd6b113c2498947cc75a6cd313b08284dd6da6db71aa905f90a250506001600255565b5f805481600581610e4f600185612b59565b81526020019081526020015f206005015443610e6b9190612b59565b5f83815260056020526040902060030154909150808210610e8f575f935050505090565b610e998282612b59565b935050505090565b600254600114610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280555f805490610f20600183612b59565b5f8381526005602081905260408083206003015484845292200154919250610f4791612bee565b4311610faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f526f756e64206e6f74206f7665720000000000000000000000000000000000006044820152606401610912565b610fb8816120a8565b610fc0612578565b5f610fcc836001612bee565b60015490915074010000000000000000000000000000000000000000900460ff16611023575f838152600560205260408082208054848452919092209081556003808301549082015560049182015491015561104c565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555b5f8381526005602081815260408084204393810193909355848455858452808420600201549387905260018301549254905190815286917f6cd5fa5a40ecd594f53649fa439e8f39cb2abf70e69eb744d79b8553c7d19788910160405180910390a45050600160025550565b5f805480825260056020526040822060040154831015611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d696e696d756d20646f6e6174696f6e206e6f74206d657400000000000000006044820152606401610912565b5f81815260056020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156111cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef9190612c01565b101561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4e6f7420656e6f756768207265776172647320746f20706c617920746865206760448201527f616d6500000000000000000000000000000000000000000000000000000000006064820152608401610912565b5f81815260056020526040812060010154908190036112a75750670de0b6b3a76400009392505050565b6112b18482612bee565b6112c385670de0b6b3a7640000612b9f565b6112cd9190612bb6565b949350505050565b5f811161133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610912565b61136a7f000000000000000000000000000000000000000000000000000000000000000033308461273d565b60405181907f084165e47a829e3a6faacb01bbc2c4773f890d5fba948b3d2ab5ffb003f2434f905f90a250565b5f8054816005816113a9600185612b59565b81526020019081526020015f2060050154436113c59190612b59565b5f83815260056020526040902060030154909150808211156113e5578091505b806113f1836064612b9f565b610e999190612bb6565b60015473ffffffffffffffffffffffffffffffffffffffff16331461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b73ffffffffffffffffffffffffffffffffffffffff81166114f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610912565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b905f90a250565b5f805480825260036020908152604080842073ffffffffffffffffffffffffffffffffffffffff861685529091528220548083036115a857505f9392505050565b5f828152600560205260409020600101546112c382670de0b6b3a7640000612b9f565b5f8054816115da600183612b59565b5f818152600560205260409020600101549091501561160e575f8181526005602052604090205461160b9084612bee565b92505b5f828152600560205260409020600101541561163f575f8281526005602052604090205461163c9084612bee565b92505b505090565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e617574686f72697a6564206163636f756e740000000000000000000000006044820152606401610912565b5f80546116d3906001612bee565b5f8181526005602090815260409182902087815560038101879055600401859055600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055815187815290810186905290810184905290915081907f12a7025c39c132ef283c80c5db2fc1a564c96bf8fc3ca7af8e3cd63842c3a3499060600160405180910390a250505050565b6040805160018082528183019092526060916020808301908036833750505073ffffffffffffffffffffffffffffffffffffffff83165f908152600660205260408120548251929350918391906117d5576117d5612b72565b602002602001018181525050919050565b61184e604051806101c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581525090565b5f805480825260056020818152604084206003810154865290850183905260048101546060860152805460a086015260018082015460c0870152600282015460e08701529293909290919082906118a59086612b59565b81526020019081526020015f206005015490508160030154816118c89190612bee565b604085018190524310156118ec574384604001516118e69190612b59565b60808501525b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611974573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119989190612c01565b6101008501525f83815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529252918290205461012087015290517fb2cb3a9b0000000000000000000000000000000000000000000000000000000081526004810191909152309063b2cb3a9b90602401602060405180830381865afa158015611a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4c9190612c01565b6101408501525f611a5e600185612b59565b5f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845282528083205415156101808a0152838352600591829052909120015490915015611b3e576040517f402914f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87166004820152309063402914f590602401602060405180830381865afa158015611b13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b379190612c01565b6101608601525b610120850151158015611b5a57508460a0015185610100015110155b8015611b695750846040015143105b15156101a08601525092949350505050565b600254600114611be7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5265656e7472616e6379477561726400000000000000000000000000000000006044820152606401610912565b600280555f80548082526005602052604090912060040154341015611c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f446f6e6174696f6e20616d6f756e74206973206c657373207468616e2074686560448201527f206d696e696d756d20646f6e6174696f6e0000000000000000000000000000006064820152608401610912565b5f3073ffffffffffffffffffffffffffffffffffffffff1663bb8520426040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfc9190612c01565b5f83815260056020526040902054909150611d18908290612bee565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611da0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc49190612c01565b1015611e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4e6f7420656e6f756768207265776172647320746f20706c617920746865206760448201527f616d6500000000000000000000000000000000000000000000000000000000006064820152608401610912565b5f82815260036020908152604080832033845290915290205415611ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f416c726561647920646f6e61746564207468697320726f756e640000000000006044820152606401610912565b5f611edb610e3d565b11611f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f526f756e642068617320656e64656400000000000000000000000000000000006044820152606401610912565b5f8281526005602052604081206001018054349290611f62908490612bee565b90915550505f8281526003602090815260408083203384528252808320349081905560069092528220805491929091611f9c908490612bee565b9091555050604051349033907f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52905f90a350506001600255565b5f6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff84166004528260245260205f60445f5f895af13d15601f3d1160015f511416171691505f6060528060405250806120a2576040517fabae3d6d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301523060248301528416604482015260648101839052608401610912565b50505050565b5f818152600560205260408120600281015490546120c69190612b59565b5f838152600560205260409020600101549091507f0000000000000000000000000000000000000000000000000000000000000000821080612106575080155b1561211057505050565b5f7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff81111561214a5761214a61282c565b604051908082528060200260200182016040528015612173578160200160208202803683370190505b50905082817f0000000000000000000000000000000000000000000000000000000000000000815181106121a9576121a9612b72565b60209081029190910101526040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301525f60248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015612265573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122899190612c18565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561233c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190612c18565b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166387517c457f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866123ed4262015180612bee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015292841660248401529216604482015265ffffffffffff90911660648201526084015f604051808303815f87803b15801561246e575f5ffd5b505af1158015612480573d5f5f3e3d5ffd5b50506040517fbf6ee3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016925063bf6ee3fd915061251b907f0000000000000000000000000000000000000000000000000000000000000000908590600190600401612c37565b5f604051808303815f87803b158015612532575f5ffd5b505af1158015612544573d5f5f3e3d5ffd5b50506040518592507ff2092fa360386c48bdcf4bbd9eb0512e6288744a8664acf38aead698368bb19291505f90a250505050565b477f00000000000000000000000000000000000000000000000000000000000000008110156125a45750565b5f7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8111156125de576125de61282c565b604051908082528060200260200182016040528015612607578160200160208202803683370190505b50905081817f00000000000000000000000000000000000000000000000000000000000000008151811061263d5761263d612b72565b60209081029190910101526040517fbf6ee3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bf6ee3fd9084906126e1907f0000000000000000000000000000000000000000000000000000000000000000908690600190600401612c37565b5f604051808303818588803b1580156126f8575f5ffd5b505af115801561270a573d5f5f3e3d5ffd5b50506040518593507f6a105f72bec70df8ca4968fb6316bfbbcc1a488a733ebae3f6088e81652226f392505f9150a25050565b5f6040517f23b872dd000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff851660045273ffffffffffffffffffffffffffffffffffffffff84166024528260445260205f60645f5f8a5af13d15601f3d1160015f511416171691505f606052806040525080612825576040517fabae3d6d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483015280861660248301528416604482015260648101839052608401610912565b5050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612868575f5ffd5b813567ffffffffffffffff8111156128825761288261282c565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff821117156128cd576128cd61282c565b6040529182526020818501810192908101868411156128ea575f5ffd5b6020860192505b838310156129095782358152602092830192016128f1565b5095945050505050565b5f5f5f60608486031215612925575f5ffd5b833567ffffffffffffffff81111561293b575f5ffd5b61294786828701612859565b935050602084013567ffffffffffffffff811115612963575f5ffd5b61296f86828701612859565b93969395505050506040919091013590565b803573ffffffffffffffffffffffffffffffffffffffff811681146129a4575f5ffd5b919050565b5f602082840312156129b9575f5ffd5b6107c882612981565b5f5f604083850312156129d3575f5ffd5b823591506129e360208401612981565b90509250929050565b5f602082840312156129fc575f5ffd5b5035919050565b5f5f5f60608486031215612a15575f5ffd5b505081359360208301359350604090920135919050565b5f8151808452602084019350602083015f5b82811015612a5c578151865260209586019590910190600101612a3e565b5093949350505050565b602081525f6107c86020830184612a2c565b5f6101c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100830151610100830152610120830151610120830152610140830151610140830152610160830151610160830152610180830151612b0f61018084018215159052565b506101a0830151612b256101a084018215159052565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115612b6c57612b6c612b2c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417612b6c57612b6c612b2c565b5f82612be9577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115612b6c57612b6c612b2c565b5f60208284031215612c11575f5ffd5b5051919050565b5f60208284031215612c28575f5ffd5b815180151581146107c8575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152608060208201525f612c656080830185612a2c565b9215156040830152508082036060909101525f81526020019291505056fea264697066735822122095d1521c23ac2cc5c0ddc16570b634e53b45cd7ba9e663b764a9c4a9f3629b7f64736f6c634300081e0033", + "sourceMap": "1571:17240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13712:143;;;;;;;;;;;;;:::i;:::-;;;160:25:6;;;148:2;133:18;13712:143:0;;;;;;;;3085:32;;;;;;;;;;;;;;;;;;372:42:6;360:55;;;342:74;;330:2;315:18;3085:32:0;196:226:6;18548:261:0;;;;;;;;;;-1:-1:-1;18548:261:0;;;;;:::i;:::-;;:::i;:::-;;;2604:14:6;;2597:22;2579:41;;2567:2;2552:18;18548:261:0;2439:187:6;2803:46:0;;;;;;;;;;;;;;;2644:44;;;;;;;;;;;;;;;2475:68;;;;;;;;;;;;;;;3025:31;;;;;;;;;;;;;;;10340:639;;;;;;;;;;-1:-1:-1;10340:639:0;;;;;:::i;:::-;;:::i;2572:37::-;;;;;;;;;;;;;;;3274:33;;;;;;;;;;-1:-1:-1;3274:33:0;;;;;;;;;;;2886:39;;;;;;;;;;;;;;;3438:71;;;;;;;;;;-1:-1:-1;3438:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8272:851;;;;;;;;;;;;;:::i;:::-;;16521:694;;;;;;;;;;;;;:::i;13973:459::-;;;;;;;;;;;;;:::i;7051:1149::-;;;;;;;;;;;;;:::i;11103:646::-;;;;;;;;;;-1:-1:-1;11103:646:0;;;;;:::i;:::-;;:::i;12890:271::-;;;;;;;;;;-1:-1:-1;12890:271:0;;;;;:::i;:::-;;:::i;3145:31::-;;;;;;;;;;;;;;;;2732:34;;;;;;;;;;;;;;;3212:20;;;;;;;;;;-1:-1:-1;3212:20:0;;;;;;;;3581:69;;;;;;;;;;-1:-1:-1;3581:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14504:435;;;;;;;;;;;;;:::i;9222:286::-;;;;;;;;;;-1:-1:-1;9222:286:0;;;;;:::i;:::-;;:::i;13271:343::-;;;;;;;;;;-1:-1:-1;13271:343:0;;;;;:::i;:::-;;:::i;3696:49::-;;;;;;;;;;-1:-1:-1;3696:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3846:25:6;;;3902:2;3887:18;;3880:34;;;;3930:18;;;3923:34;;;;3988:2;3973:18;;3966:34;4031:3;4016:19;;4009:35;4075:3;4060:19;;4053:35;3833:3;3818:19;3696:49:0;3559:535:6;17312:451:0;;;;;;;;;;;;;:::i;2961:43::-;;;;;;;;;;;;;;;9700:522;;;;;;;;;;-1:-1:-1;9700:522:0;;;;;:::i;:::-;;:::i;17910:198::-;;;;;;;;;;-1:-1:-1;17910:198:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15013:1344::-;;;;;;;;;;-1:-1:-1;15013:1344:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11801:1003::-;;;:::i;3795:58::-;;;;;;;;;;-1:-1:-1;3795:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;13712:143;13769:7;13810:11;:29;13837:1;13822:12;;:16;;;;:::i;:::-;13810:29;;;;;;;;;;;:38;;;13795:12;:53;;;;:::i;:::-;13788:60;;13712:143;:::o;18548:261::-;18698:14;18747:10;18758:1;18747:13;;;;;;;;:::i;:::-;;;;;;;18732:9;18742:1;18732:12;;;;;;;;:::i;:::-;;;;;;;:28;18728:75;;;-1:-1:-1;18788:4:0;18728:75;18548:261;;;;;:::o;10340:639::-;10399:7;10418:18;10454:1;10439:12;;:16;;;;:::i;:::-;10465;10484:28;;;:16;:28;;;;;;;;:37;;;;;;;;;;;10561:23;;;:11;:23;;;;;;:36;;;10418:37;;-1:-1:-1;10484:37:0;10612:13;;;:41;;-1:-1:-1;10629:24:0;;10612:41;10608:80;;;-1:-1:-1;10676:1:0;;10340:639;-1:-1:-1;;;;10340:639:0:o;10608:80::-;10728:21;10752:26;;;:14;:26;;;;;;;;:35;;;;;;;;;;;10801:17;;10797:31;;-1:-1:-1;10827:1:0;;10340:639;-1:-1:-1;;;;;10340:639:0:o;10797:31::-;10857:14;10886:23;;;:11;:23;;;;;:40;10930:19;;10875:51;;:8;:51;:::i;:::-;10874:75;;;;:::i;:::-;10857:92;10340:639;-1:-1:-1;;;;;;;10340:639:0:o;8272:851::-;8316:7;;8327:1;8316:12;8308:40;;;;;;;7613:2:6;8308:40:0;;;7595:21:6;7652:2;7632:18;;;7625:30;7691:17;7671:18;;;7664:45;7726:18;;8308:40:0;;;;;;;;;8368:1;8358:11;;8380:18;8401:12;;:16;;8416:1;;8401:16;:::i;:::-;8427;8446:28;;;:16;:28;;;;;;;;8475:10;8446:40;;;;;;;;;;8526:23;;;:11;:23;;;;;:36;;;8581:14;:26;;;;;:38;;;;;;;;;;8380:37;;-1:-1:-1;8446:40:0;8581:43;8573:71;;;;;;;7957:2:6;8573:71:0;;;7939:21:6;7996:2;7976:18;;;7969:30;8035:17;8015:18;;;8008:45;8070:18;;8573:71:0;7755:339:6;8573:71:0;8673:1;8662:8;:12;8654:42;;;;;;;8301:2:6;8654:42:0;;;8283:21:6;8340:2;8320:18;;;8313:30;8379:19;8359:18;;;8352:47;8416:18;;8654:42:0;8099:341:6;8654:42:0;8707:14;8736:23;;;:11;:23;;;;;:40;8780:19;;8725:51;;:8;:51;:::i;:::-;8724:75;;;;:::i;:::-;8707:92;;8826:1;8817:6;:10;8809:39;;;;;;;8647:2:6;8809:39:0;;;8629:21:6;8686:2;8666:18;;;8659:30;8725:18;8705;;;8698:46;8761:18;;8809:39:0;8445:340:6;8809:39:0;8859:26;;;;:14;:26;;;;;;;;8886:10;8859:38;;;;;;;:47;;;8916:23;;;:11;:23;;;;;:36;;:46;;8900:6;;8859:26;8916:46;;8900:6;;8916:46;:::i;:::-;;;;-1:-1:-1;8973:71:0;;-1:-1:-1;9002:21:0;9025:10;9037:6;8973:28;:71::i;:::-;9060:34;;9087:6;;9075:10;;9060:34;;;;;-1:-1:-1;;9115:1:0;9105:7;:11;-1:-1:-1;;8272:851:0:o;16521:694::-;16589:7;;16600:1;16589:12;16581:40;;;;;;;7613:2:6;16581:40:0;;;7595:21:6;7652:2;7632:18;;;7625:30;7691:17;7671:18;;;7664:45;7726:18;;16581:40:0;7411:339:6;16581:40:0;16641:1;16631:7;:11;;;;16743:24;16770:4;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16832:5;;16743:56;;-1:-1:-1;16832:5:0;;16818:10;:19;16810:52;;;;;;;9311:2:6;16810:52:0;;;9293:21:6;9350:2;9330:18;;;9323:30;9389:22;9369:18;;;9362:50;9429:18;;16810:52:0;9109:344:6;16810:52:0;16899:54;;;;;16947:4;16899:54;;;342:74:6;16872:24:0;;16956:16;;16899:39;16906:21;16899:39;;;;315:18:6;;16899:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;16872:100;;16986:16;17006:1;16986:21;16982:63;;17016:29;;;;;;;;;;;;;;16982:63;17107:5;;17055:76;;17084:21;;17107:5;;17114:16;17055:28;:76::i;:::-;17146:41;;17170:16;;17146:41;;;;;-1:-1:-1;;17207:1:0;17197:7;:11;16521:694::o;13973:459::-;14029:28;14088:12;;14029:28;14155:11;14029:28;14167:12;14178:1;14088:12;14167;:::i;:::-;14155:25;;;;;;;;;;;:34;;;14140:12;:49;;;;:::i;:::-;14199:22;14224:21;;;:11;:21;;;;;:28;;;14110:79;;-1:-1:-1;14266:37:0;;;14262:95;;14326:1;14319:8;;;;;13973:459;:::o;14262:95::-;14389:36;14406:19;14389:14;:36;:::i;:::-;14366:59;;14059:373;;;13973:459;:::o;7051:1149::-;7126:7;;7137:1;7126:12;7118:40;;;;;;;7613:2:6;7118:40:0;;;7595:21:6;7652:2;7632:18;;;7625:30;7691:17;7671:18;;;7664:45;7726:18;;7118:40:0;7411:339:6;7118:40:0;7178:1;7168:11;;7190:16;7209:12;;;7252;7263:1;7209:12;7252;:::i;:::-;7332:21;;;;:11;:21;;;;;;;;:28;;;7297:23;;;;;:32;;7231:33;;-1:-1:-1;7297:63:0;;;:::i;:::-;7282:12;:78;7274:105;;;;;;;9660:2:6;7274:105:0;;;9642:21:6;9699:2;9679:18;;;9672:30;9738:16;9718:18;;;9711:44;9772:18;;7274:105:0;9458:338:6;7274:105:0;7390:43;7422:10;7390:31;:43::i;:::-;7443:24;:22;:24::i;:::-;7478:17;7498:12;:8;7509:1;7498:12;:::i;:::-;7526:21;;7478:32;;-1:-1:-1;7526:21:0;;;;;7521:351;;7605:21;;;;:11;:21;;;;;;:38;;7563:22;;;;;;;:80;;;7689:28;;;;;7657:29;;;:60;7768:33;;;;;7731:34;;:70;7521:351;;;7832:21;:29;;;;;;7521:351;7882:21;;;;:11;:21;;;;;;;;7915:12;7882:30;;;:45;;;;7937:24;;;8073:23;;;;;;:36;;;8025:21;;;;:34;;;;8123:38;;7977:194;;160:25:6;;;7882:21:0;;7977:194;;133:18:6;7977:194:0;;;;;;;-1:-1:-1;;8192:1:0;8182:7;:11;-1:-1:-1;7051:1149:0:o;11103:646::-;11178:7;11216:12;;11258:21;;;:11;:21;;;;;:33;;;11246:45;;;11238:82;;;;;;;10003:2:6;11238:82:0;;;9985:21:6;10042:2;10022:18;;;10015:30;10081:26;10061:18;;;10054:54;10125:18;;11238:82:0;9801:348:6;11238:82:0;11409:21;;;;:11;:21;;;;;;;:38;11351:54;;;;;11399:4;11351:54;;;342:74:6;11358:21:0;11351:39;;;;;315:18:6;;11351:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:96;;11330:178;;;;;;;10356:2:6;11330:178:0;;;10338:21:6;10395:2;10375:18;;;10368:30;10434:34;10414:18;;;10407:62;10505:5;10485:18;;;10478:33;10528:19;;11330:178:0;10154:399:6;11330:178:0;11519:27;11549:21;;;:11;:21;;;;;:34;;;;11597:24;;;11593:80;;-1:-1:-1;11644:4:0;;11103:646;-1:-1:-1;;;11103:646:0:o;11593:80::-;11711:30;11733:8;11711:19;:30;:::i;:::-;11691:15;:8;11702:4;11691:15;:::i;:::-;11690:52;;;;:::i;:::-;11683:59;11103:646;-1:-1:-1;;;;11103:646:0:o;12890:271::-;12973:1;12964:6;:10;12956:52;;;;;;;10760:2:6;12956:52:0;;;10742:21:6;10799:2;10779:18;;;10772:30;10838:31;10818:18;;;10811:59;10887:18;;12956:52:0;10558:353:6;12956:52:0;13018:90;13051:21;13074:10;13094:4;13101:6;13018:32;:90::i;:::-;13124:30;;13147:6;;13124:30;;;;;12890:271;:::o;14504:435::-;14555:7;14593:12;;14555:7;14660:11;14555:7;14672:12;14683:1;14593:12;14672;:::i;:::-;14660:25;;;;;;;;;;;:34;;;14645:12;:49;;;;:::i;:::-;14705:22;14730:21;;;:11;:21;;;;;:28;;;14615:79;;-1:-1:-1;14772:36:0;;;14768:103;;;14846:14;14824:36;;14768:103;14918:14;14889:25;:19;14911:3;14889:25;:::i;:::-;14888:44;;;;:::i;9222:286::-;9350:5;;;;9336:10;:19;9328:52;;;;;;;9311:2:6;9328:52:0;;;9293:21:6;9350:2;9330:18;;;9323:30;9389:22;9369:18;;;9362:50;9429:18;;9328:52:0;9109:344:6;9328:52:0;9398:22;;;9390:47;;;;;;;11118:2:6;9390:47:0;;;11100:21:6;11157:2;11137:18;;;11130:30;11196:14;11176:18;;;11169:42;11228:18;;9390:47:0;10916:336:6;9390:47:0;9448:5;:16;;;;;;;;;;;;;9479:22;;;;-1:-1:-1;;9479:22:0;9222:286;:::o;13271:343::-;13336:7;13374:12;;13415:26;;;:16;:26;;;;;;;;:35;;;;;;;;;;;13464:13;;;13460:77;;-1:-1:-1;13500:1:0;;13271:343;-1:-1:-1;;;13271:343:0:o;13460:77::-;13573:21;;;;:11;:21;;;;;:34;;;13554:15;:8;13565:4;13554:15;:::i;17312:451::-;17369:24;17424:12;;17369:24;17467:12;17478:1;17424:12;17467;:::i;:::-;17533:1;17494:23;;;:11;:23;;;;;:36;;;17446:33;;-1:-1:-1;17494:40:0;17490:131;;17570:23;;;;:11;:23;;;;;:40;17550:60;;;;:::i;:::-;;;17490:131;17671:1;17634:21;;;:11;:21;;;;;:34;;;:38;17630:127;;17708:21;;;;:11;:21;;;;;:38;17688:58;;;;:::i;:::-;;;17630:127;17395:368;;17312:451;:::o;9700:522::-;9833:5;;;;9819:10;:19;9811:52;;;;;;;9311:2:6;9811:52:0;;;9293:21:6;9350:2;9330:18;;;9323:30;9389:22;9369:18;;;9362:50;9429:18;;9811:52:0;9109:344:6;9811:52:0;9874:17;9894:12;;:16;;9909:1;9894:16;:::i;:::-;9920:22;;;;:11;:22;;;;;;;;;:57;;;9987:29;;;:46;;;10043:34;;:48;;;10125:4;10101:28;;;;;;;;10145:70;;11459:25:6;;;11500:18;;;11493:34;;;11543:18;;;11536:34;;;9920:22:0;;-1:-1:-1;9920:22:0;;10145:70;;11447:2:6;11432:18;10145:70:0;;;;;;;9801:421;9700:522;;;:::o;17910:198::-;18030:16;;;18044:1;18030:16;;;;;;;;;17986:23;;18030:16;;;;;;;;;-1:-1:-1;;;18068:33:0;;;;;;;:23;:33;;;;;;18056:9;;;;-1:-1:-1;18068:33:0;18056:9;;18068:33;18056:9;;;;:::i;:::-;;;;;;:45;;;;;17910:198;;;:::o;15013:1344::-;15072:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15072:22:0;15106:16;15125:12;;15171:21;;;:11;:21;;;;;;;15223:9;;;;15203:29;;15242:18;;;:29;;;15305:14;;;;15281:21;;;:38;15350:19;;15329:18;;;:40;15400:15;;;;;15379:18;;;:36;15446:15;;;;15425:18;;;:36;15125:12;;15171:21;;15106:16;;15171:11;15106:16;;15505:12;;15125;15505;:::i;:::-;15493:25;;;;;;;;;;;:34;;;15472:55;;15572:2;:9;;;15559:10;:22;;;;:::i;:::-;15537:19;;;:44;;;15596:12;:34;15592:123;;;15692:12;15670:5;:19;;;:34;;;;:::i;:::-;15646:21;;;:58;15592:123;15750:54;;;;;15798:4;15750:54;;;342:74:6;15757:21:0;15750:39;;;;;315:18:6;;15750:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15725:22;;;:79;15842:26;;;;:16;:26;;;;;;;;:32;;;;;;;;;;;;;15814:25;;;:60;15909:26;;;;;;;;342:74:6;;;;15909:4:0;;:20;;315:18:6;;15909:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15884:22;;;:51;15946:18;15967:12;15978:1;15967:8;:12;:::i;:::-;16043:1;16008:26;;;:14;:26;;;;;;;;:32;;;;;;;;;;;:36;;15989:16;;;:55;16059:23;;;:11;:23;;;;;;;:32;;15946:33;;-1:-1:-1;16059:36:0;16055:109;;16133:20;;;;;372:42:6;360:55;;16133:20:0;;;342:74:6;16133:4:0;;:14;;315:18:6;;16133:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16111:19;;;:42;16055:109;16208:25;;;;:30;:78;;;;;16268:5;:18;;;16242:5;:22;;;:44;;16208:78;:132;;;;;16321:5;:19;;;16306:12;:34;16208:132;16174:176;;:17;;;:176;-1:-1:-1;16174:5:0;;15013:1344;-1:-1:-1;;;;15013:1344:0:o;11801:1003::-;11882:7;;11893:1;11882:12;11874:40;;;;;;;7613:2:6;11874:40:0;;;7595:21:6;7652:2;7632:18;;;7625:30;7691:17;7671:18;;;7664:45;7726:18;;11874:40:0;7411:339:6;11874:40:0;11934:1;11924:11;;11946:16;11965:12;;12008:21;;;:11;:21;;;;;;:33;;;11995:9;:46;;11987:108;;;;;;;11783:2:6;11987:108:0;;;11765:21:6;11822:2;11802:18;;;11795:30;11861:34;11841:18;;;11834:62;11932:19;11912:18;;;11905:47;11969:19;;11987:108:0;11581:413:6;11987:108:0;12105:24;12132:4;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12266:21;;;;:11;:21;;;;;:38;12105:56;;-1:-1:-1;12266:57:0;;12105:56;;12266:57;:::i;:::-;12192:54;;;;;12240:4;12192:54;;;342:74:6;12199:21:0;12192:39;;;;;315:18:6;;12192:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:131;;12171:213;;;;;;;10356:2:6;12171:213:0;;;10338:21:6;10395:2;10375:18;;;10368:30;10434:34;10414:18;;;10407:62;10505:5;10485:18;;;10478:33;10528:19;;12171:213:0;10154:399:6;12171:213:0;12403:26;;;;:16;:26;;;;;;;;12430:10;12403:38;;;;;;;;:43;12395:82;;;;;;;12201:2:6;12395:82:0;;;12183:21:6;12240:2;12220:18;;;12213:30;12279:28;12259:18;;;12252:56;12325:18;;12395:82:0;11999:350:6;12395:82:0;12523:1;12495:25;:23;:25::i;:::-;:29;12487:57;;;;;;;12556:2:6;12487:57:0;;;12538:21:6;12595:2;12575:18;;;12568:30;12634:17;12614:18;;;12607:45;12669:18;;12487:57:0;12354:339:6;12487:57:0;12555:21;;;;:11;:21;;;;;:34;;:47;;12593:9;;12555:21;:47;;12593:9;;12555:47;:::i;:::-;;;;-1:-1:-1;;12612:26:0;;;;:16;:26;;;;;;;;12639:10;12612:38;;;;;;;12653:9;12612:50;;;;12672:23;:35;;;;;:48;;12653:9;;12672:35;;:48;;12653:9;;12672:48;:::i;:::-;;;;-1:-1:-1;;12736:39:0;;12765:9;;12753:10;;12736:39;;;;;-1:-1:-1;;12796:1:0;12786:7;:11;11801:1003::o;3729:1598:5:-;3813:12;4021:4;4015:11;4147:66;4144:1;4137:77;4245:42;4241:2;4237:51;4234:1;4227:62;4342:6;4338:2;4331:18;5054:2;5051:1;5047:2;5044:1;5041;5034:5;5027;5022:35;4693:16;4686:24;4680:2;4662:16;4659:24;4655:1;4651;4645:8;4642:15;4638:46;4635:76;4423:652;4396:679;;5102:1;5096:4;5089:15;5164:10;5158:4;5151:24;;5227:7;5222:99;;5257:53;;;;;12959:42:6;12947:55;;;5257:53:5;;;12929:74:6;5292:4:5;13019:18:6;;;13012:83;13131:55;;13111:18;;;13104:83;13203:18;;;13196:34;;;12901:19;;5257:53:5;12698:538:6;5222:99:5;3803:1524;3729:1598;;;:::o;5444:947:0:-;5524:23;5593;;;:11;:23;;;;;:36;;;;5550:40;;:79;;5593:36;5550:79;:::i;:::-;5639:27;5669:23;;;:11;:23;;;;;:36;;;5524:105;;-1:-1:-1;5737:31:0;5719:49;;;:77;;-1:-1:-1;5772:24:0;;5719:77;5715:114;;;5812:7;;5444:947;:::o;5715:114::-;5839:26;5882:12;5868:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5868:27:0;;5839:56;;5938:15;5905:9;5915:19;5905:30;;;;;;;;:::i;:::-;;;;;;;;;;:48;5964:49;;;;;:37;6002:7;13441:55:6;;5964:49:0;;;13423:74:6;-1:-1:-1;13513:18:6;;;13506:34;5971:21:0;5964:37;;;;13396:18:6;;5964:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6023:63:0;;;;;:37;6061:7;13441:55:6;;6023:63:0;;;13423:74:6;13513:18;;;13506:34;;;6030:21:0;6023:37;;;;13396:18:6;;6023:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6096:25:0;6105:7;6096:25;;6135:21;6158:14;6182:15;6207:24;:15;6225:6;6207:24;:::i;:::-;6096:146;;;;;;;;;;14394:42:6;14382:55;;;6096:146:0;;;14364:74:6;14474:55;;;14454:18;;;14447:83;14566:55;;14546:18;;;14539:83;14670:14;14658:27;;;14638:18;;;14631:55;14336:19;;6096:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6253:67:0;;;;;:38;6269:14;6253:38;;-1:-1:-1;6253:38:0;;-1:-1:-1;6253:67:0;;6292:6;;6300:9;;6311:4;;6253:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6336:48:0;;6368:15;;-1:-1:-1;6336:48:0;;-1:-1:-1;6336:48:0;;;5514:877;;;5444:947;:::o;6443:574::-;6614:21;6670:31;6649:52;;6645:89;;;6717:7;6443:574::o;6645:89::-;6744:26;6787:12;6773:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6773:27:0;;6744:56;;6833:18;6810:9;6820;6810:20;;;;;;;;:::i;:::-;;;;;;;;;;:41;6861:94;;;;;:38;6877:14;6861:38;;;;6907:18;;6861:94;;6927:6;;6935:9;;6946:4;;6861:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6970:40:0;;6991:18;;-1:-1:-1;6970:40:0;;-1:-1:-1;6970:40:0;;-1:-1:-1;6970:40:0;6486:531;;6443:574::o;1289:1718:5:-;1391:12;1599:4;1593:11;1725:66;1722:1;1715:77;1825:42;1819:4;1815:53;1812:1;1805:64;1932:42;1928:2;1924:51;1920:2;1913:63;2029:6;2025:2;2018:18;2743:2;2740:1;2735:3;2732:1;2729;2722:5;2715;2710:36;2380:16;2373:24;2367:2;2349:16;2346:24;2342:1;2338;2332:8;2329:15;2325:46;2322:76;2110:654;2083:681;;2791:1;2785:4;2778:15;2853:10;2847:4;2840:24;;2916:7;2911:90;;2946:44;;;;;12959:42:6;12947:55;;;2946:44:5;;;12929:74:6;13039:55;;;13019:18;;;13012:83;13131:55;;13111:18;;;13104:83;13203:18;;;13196:34;;;12901:19;;2946:44:5;12698:538:6;2911:90:5;1381:1626;1289:1718;;;;:::o;427:184:6:-;479:77;476:1;469:88;576:4;573:1;566:15;600:4;597:1;590:15;616:1013;670:5;723:3;716:4;708:6;704:17;700:27;690:55;;741:1;738;731:12;690:55;781:6;768:20;811:18;803:6;800:30;797:56;;;833:18;;:::i;:::-;879:6;876:1;872:14;915:2;909:9;974:66;969:2;965;961:11;957:84;949:6;945:97;1108:6;1096:10;1093:22;1072:18;1060:10;1057:34;1054:62;1051:88;;;1119:18;;:::i;:::-;1155:2;1148:22;1205;;;1255:4;1287:15;;;1283:26;;;1205:22;1243:17;;1321:15;;;1318:35;;;1349:1;1346;1339:12;1318:35;1385:4;1377:6;1373:17;1362:28;;1399:200;1415:6;1410:3;1407:15;1399:200;;;1507:17;;1537:18;;1584:4;1432:14;;;;1575;1399:200;;;-1:-1:-1;1617:6:6;616:1013;-1:-1:-1;;;;;616:1013:6:o;1634:704::-;1761:6;1769;1777;1830:2;1818:9;1809:7;1805:23;1801:32;1798:52;;;1846:1;1843;1836:12;1798:52;1886:9;1873:23;1919:18;1911:6;1908:30;1905:50;;;1951:1;1948;1941:12;1905:50;1974:61;2027:7;2018:6;2007:9;2003:22;1974:61;:::i;:::-;1964:71;;;2088:2;2077:9;2073:18;2060:32;2117:18;2107:8;2104:32;2101:52;;;2149:1;2146;2139:12;2101:52;2172:63;2227:7;2216:8;2205:9;2201:24;2172:63;:::i;:::-;1634:704;;2162:73;;-1:-1:-1;;;;2304:2:6;2289:18;;;;2276:32;;1634:704::o;2631:196::-;2699:20;;2759:42;2748:54;;2738:65;;2728:93;;2817:1;2814;2807:12;2728:93;2631:196;;;:::o;2832:186::-;2891:6;2944:2;2932:9;2923:7;2919:23;2915:32;2912:52;;;2960:1;2957;2950:12;2912:52;2983:29;3002:9;2983:29;:::i;3023:300::-;3091:6;3099;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3213:23;;;-1:-1:-1;3279:38:6;3313:2;3298:18;;3279:38;:::i;:::-;3269:48;;3023:300;;;;;:::o;3328:226::-;3387:6;3440:2;3428:9;3419:7;3415:23;3411:32;3408:52;;;3456:1;3453;3446:12;3408:52;-1:-1:-1;3501:23:6;;3328:226;-1:-1:-1;3328:226:6:o;4099:466::-;4176:6;4184;4192;4245:2;4233:9;4224:7;4220:23;4216:32;4213:52;;;4261:1;4258;4251:12;4213:52;-1:-1:-1;;4306:23:6;;;4426:2;4411:18;;4398:32;;-1:-1:-1;4529:2:6;4514:18;;;4501:32;;4099:466;-1:-1:-1;4099:466:6:o;4570:420::-;4623:3;4661:5;4655:12;4688:6;4683:3;4676:19;4720:4;4715:3;4711:14;4704:21;;4759:4;4752:5;4748:16;4782:1;4792:173;4806:6;4803:1;4800:13;4792:173;;;4867:13;;4855:26;;4910:4;4901:14;;;;4938:17;;;;4828:1;4821:9;4792:173;;;-1:-1:-1;4981:3:6;;4570:420;-1:-1:-1;;;;4570:420:6:o;4995:261::-;5174:2;5163:9;5156:21;5137:4;5194:56;5246:2;5235:9;5231:18;5223:6;5194:56;:::i;5261:1182::-;5403:4;5445:3;5434:9;5430:19;5422:27;;5482:6;5476:13;5465:9;5458:32;5546:4;5538:6;5534:17;5528:24;5521:4;5510:9;5506:20;5499:54;5609:4;5601:6;5597:17;5591:24;5584:4;5573:9;5569:20;5562:54;5672:4;5664:6;5660:17;5654:24;5647:4;5636:9;5632:20;5625:54;5735:4;5727:6;5723:17;5717:24;5710:4;5699:9;5695:20;5688:54;5798:4;5790:6;5786:17;5780:24;5773:4;5762:9;5758:20;5751:54;5861:4;5853:6;5849:17;5843:24;5836:4;5825:9;5821:20;5814:54;5924:4;5916:6;5912:17;5906:24;5899:4;5888:9;5884:20;5877:54;5989:6;5981;5977:19;5971:26;5962:6;5951:9;5947:22;5940:58;6056:6;6048;6044:19;6038:26;6029:6;6018:9;6014:22;6007:58;6123:6;6115;6111:19;6105:26;6096:6;6085:9;6081:22;6074:58;6190:6;6182;6178:19;6172:26;6163:6;6152:9;6148:22;6141:58;6246:6;6238;6234:19;6228:26;6263:53;6308:6;6297:9;6293:22;6279:12;2413:13;2406:21;2394:34;;2343:91;6263:53;;6365:6;6357;6353:19;6347:26;6382:55;6429:6;6418:9;6414:22;6398:14;2413:13;2406:21;2394:34;;2343:91;6382:55;;5261:1182;;;;:::o;6448:184::-;6500:77;6497:1;6490:88;6597:4;6594:1;6587:15;6621:4;6618:1;6611:15;6637:128;6704:9;;;6725:11;;;6722:37;;;6739:18;;:::i;:::-;6637:128;;;;:::o;6770:184::-;6822:77;6819:1;6812:88;6919:4;6916:1;6909:15;6943:4;6940:1;6933:15;6959:168;7032:9;;;7063;;7080:15;;;7074:22;;7060:37;7050:71;;7101:18;;:::i;7132:274::-;7172:1;7198;7188:189;;7233:77;7230:1;7223:88;7334:4;7331:1;7324:15;7362:4;7359:1;7352:15;7188:189;-1:-1:-1;7391:9:6;;7132:274::o;8790:125::-;8855:9;;;8876:10;;;8873:36;;;8889:18;;:::i;8920:184::-;8990:6;9043:2;9031:9;9022:7;9018:23;9014:32;9011:52;;;9059:1;9056;9049:12;9011:52;-1:-1:-1;9082:16:6;;8920:184;-1:-1:-1;8920:184:6:o;13551:277::-;13618:6;13671:2;13659:9;13650:7;13646:23;13642:32;13639:52;;;13687:1;13684;13677:12;13639:52;13719:9;13713:16;13772:5;13765:13;13758:21;13751:5;13748:32;13738:60;;13794:1;13791;13784:12;14697:687;15038:42;15030:6;15026:55;15015:9;15008:74;15118:3;15113:2;15102:9;15098:18;15091:31;14989:4;15145:57;15197:3;15186:9;15182:19;15174:6;15145:57;:::i;:::-;15245:14;;15238:22;15233:2;15218:18;;15211:50;-1:-1:-1;15297:22:6;;;15292:2;15277:18;;;15270:50;-1:-1:-1;15329:17:6;;15375:2;15363:15;;14697:687;-1:-1:-1;;14697:687:6:o", + "linkReferences": {}, + "immutableReferences": { + "113": [ + { + "start": 798, + "length": 32 + }, + { + "start": 8412, + "length": 32 + }, + { + "start": 9595, + "length": 32 } ], - "AddressInsufficientBalance(address)": [ + "115": [ + { + "start": 931, + "length": 32 + }, { - "details": "The ETH balance of the account is not enough to perform the operation." + "start": 8467, + "length": 32 + }, + { + "start": 9639, + "length": 32 } ], - "FailedInnerCall()": [ + "117": [ + { + "start": 747, + "length": 32 + }, { - "details": "A call to an address target failed. The target may have reverted." + "start": 8570, + "length": 32 } ], - "OwnableInvalidOwner(address)": [ + "119": [ { - "details": "The owner is not a valid owner account. (eg. `address(0)`)" + "start": 1300, + "length": 32 + }, + { + "start": 9742, + "length": 32 } ], - "OwnableUnauthorizedAccount(address)": [ + "121": [ + { + "start": 696, + "length": 32 + }, { - "details": "The caller account is not authorized to perform an operation." + "start": 2830, + "length": 32 + }, + { + "start": 3351, + "length": 32 + }, + { + "start": 3534, + "length": 32 + }, + { + "start": 4465, + "length": 32 + }, + { + "start": 4931, + "length": 32 + }, + { + "start": 6426, + "length": 32 + }, + { + "start": 7494, + "length": 32 + }, + { + "start": 8735, + "length": 32 + }, + { + "start": 8950, + "length": 32 + }, + { + "start": 9119, + "length": 32 } ], - "ReentrancyGuardReentrantCall()": [ + "123": [ + { + "start": 1031, + "length": 32 + }, + { + "start": 9152, + "length": 32 + }, + { + "start": 9407, + "length": 32 + }, + { + "start": 9861, + "length": 32 + } + ], + "125": [ + { + "start": 1674, + "length": 32 + } + ], + "127": [ + { + "start": 849, + "length": 32 + }, + { + "start": 9454, + "length": 32 + }, { - "details": "Unauthorized reentrant call." + "start": 9908, + "length": 32 } ], - "SafeERC20FailedOperation(address)": [ + "129": [ + { + "start": 561, + "length": 32 + }, + { + "start": 8689, + "length": 32 + }, + { + "start": 8903, + "length": 32 + }, { - "details": "An operation with an ERC20 token failed." + "start": 9080, + "length": 32 } ] + } + }, + "methodIdentifiers": { + "MINIMUM_BALANCE_DONATION_AMOUNT()": "37b19790", + "assetsInPool()": "415ad1d7", + "balancerRouter()": "49ec8b38", + "balancerVaultAdmin()": "bc5df1aa", + "changeOwner(address)": "a6f9dae1", + "changeParams(uint256,uint256,uint256)": "c9a97ec8", + "claim()": "4e71d92d", + "claimable(address)": "402914f5", + "currentRound()": "8a19c8bc", + "donate()": "ed88c68e", + "endRound()": "749aa2d9", + "epochDonationActivities(address)": "f0cf14f4", + "estimateTicketPercentage(uint256)": "8515697a", + "getAllocatedIncentives()": "bb852042", + "getBlocksSinceRoundEnd()": "118f4348", + "getCurrentShare(address)": "b2cb3a9b", + "getGameState(address)": "d9d60b52", + "getMultisigNonces(address)": "d564c4bf", + "getRemainingRoundLength()": "678c2c3e", + "getRoundProgress()": "9c89ae38", + "incentiveTokenAddress()": "20263e87", + "incentiveTokenIndex()": "318bf475", + "isRatioPass(uint256[],uint256[],uint256)": "184023a5", + "owner()": "8da5cb5b", + "paramsUpdateRequested()": "417da65a", + "permit2()": "12261ee7", + "poolId()": "3e0dc34e", + "roundPoints(uint256)": "b99ab0ad", + "roundToClaimed(uint256,address)": "8f1f6bc7", + "roundToDonations(uint256,address)": "4d6180ae", + "topUpIncentiveBalance(uint256)": "85de7ff6", + "wethIndex()": "8c3e5a06", + "withdrawIncentiveTokenBalance()": "60c13286" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minDonation\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_balancerRouter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_balancerVaultAdmin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_poolId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_assetsInPool\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_incentiveTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_incentiveTokenIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_wethIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_availableRewards\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_roundLength\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"NoAvailableIncentiveBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundCounter\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"totalRoundDonations\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"totalRoundClaimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"availableRewards\",\"type\":\"uint256\"}],\"name\":\"AuctionEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"donatorAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DonationReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"EthDonatedToBalancer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nextRound\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"availableRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"roundLength\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minDonation\",\"type\":\"uint256\"}],\"name\":\"ParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"donatorAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RewardsClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TopUpIncentiveReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TopUpIncentiveWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UnclaimedIncentiveTokensDonated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINIMUM_BALANCE_DONATION_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"assetsInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balancerRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balancerVaultAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newRoundRewards\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRoundLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minDonation\",\"type\":\"uint256\"}],\"name\":\"changeParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"claimable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endRound\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"epochDonationActivities\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"donation\",\"type\":\"uint256\"}],\"name\":\"estimateTicketPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllocatedIncentives\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"allocatedRewards\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlocksSinceRoundEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"getGameState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"roundLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"currentRound\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roundEndBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimumDonation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blocksRemaining\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"roundRewards\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalDonated\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalClaimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"incentiveBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userCurrentDonation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userCurrentShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userClaimable\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"hasClaimed\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"canPlayGame\",\"type\":\"bool\"}],\"internalType\":\"struct GameState\",\"name\":\"state\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"multisig\",\"type\":\"address\"}],\"name\":\"getMultisigNonces\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nonces\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRemainingRoundLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remainingRoundLength\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoundProgress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"incentiveTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"incentiveTokenIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"curNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"lastNonces\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"isRatioPass\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ratioPass\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paramsUpdateRequested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"permit2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"roundPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"availableRewards\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalDonated\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalClaimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minDonation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"roundToClaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"roundToDonations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"topUpIncentiveBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wethIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawIncentiveTokenBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract handles the auction mechanism, donation collection, and reward distribution\",\"errors\":{\"TokenTransferFailed(address,address,address,uint256)\":[{\"details\":\"Failure of a token transfer.\",\"params\":{\"from\":\"Address `from`.\",\"to\":\"Address `to`.\",\"token\":\"Address of a token.\",\"value\":\"Value.\"}}]},\"kind\":\"dev\",\"methods\":{\"changeOwner(address)\":{\"details\":\"Changes contract owner address.\",\"params\":{\"newOwner\":\"Address of a new owner.\"}},\"changeParams(uint256,uint256,uint256)\":{\"details\":\"Changes round parameters.\",\"params\":{\"minDonation\":\"New minimum donation.\",\"newRoundLength\":\"New round length.\",\"newRoundRewards\":\"New round rewards.\"}},\"claim()\":{\"details\":\"Claims donation based rewards for the previous round\"},\"claimable(address)\":{\"details\":\"Gets claimable rewards.\",\"params\":{\"account\":\"Account address.\"},\"returns\":{\"_0\":\"Claimable rewards.\"}},\"constructor\":{\"details\":\"DerolasStaking constructor.\",\"params\":{\"_assetsInPool\":\"Assets in pool.\",\"_availableRewards\":\"Available rewards.\",\"_balancerRouter\":\"Balancer router address.\",\"_incentiveTokenAddress\":\"Incentive token address.\",\"_incentiveTokenIndex\":\"Incentive token index.\",\"_minDonation\":\"Minimum round donation.\",\"_poolId\":\"Pool ID.\",\"_roundLength\":\"Round length.\"}},\"donate()\":{\"details\":\"Donates to the auction contract.\"},\"endRound()\":{\"details\":\"Ends an round.\"},\"estimateTicketPercentage(uint256)\":{\"details\":\"Estimates ticket percentage.\",\"params\":{\"donation\":\"Donation amount.\"},\"returns\":{\"_0\":\"Ticket percentage.\"}},\"getAllocatedIncentives()\":{\"details\":\"gets allocated Incentives\",\"returns\":{\"allocatedRewards\":\"Allocated rewards.\"}},\"getBlocksSinceRoundEnd()\":{\"details\":\"Gets blocks since last round end.\",\"returns\":{\"_0\":\"Blocks since last round end.\"}},\"getCurrentShare(address)\":{\"details\":\"Gets current share.\",\"params\":{\"account\":\"Account address.\"},\"returns\":{\"_0\":\"Current share.\"}},\"getGameState(address)\":{\"params\":{\"user\":\"User address.\"},\"returns\":{\"state\":\"game state.\"}},\"getMultisigNonces(address)\":{\"details\":\"Gets service multisig nonces.\",\"params\":{\"multisig\":\"Service multisig address.\"},\"returns\":{\"nonces\":\"Current donations value.\"}},\"getRemainingRoundLength()\":{\"details\":\"Gets remaining round length progress.\",\"returns\":{\"remainingRoundLength\":\"Remaining round length.\"}},\"getRoundProgress()\":{\"details\":\"Gets round progress.\",\"returns\":{\"_0\":\"Round progress.\"}},\"isRatioPass(uint256[],uint256[],uint256)\":{\"details\":\"Checks if the service multisig liveness ratio passes the defined liveness threshold.\",\"params\":{\"curNonces\":\"Current service multisig set of a single nonce.\",\"lastNonces\":\"Last service multisig set of a single nonce.\"},\"returns\":{\"ratioPass\":\"True, if the liveness ratio passes the check.\"}},\"topUpIncentiveBalance(uint256)\":{\"details\":\"Top ups incentive balance.\",\"params\":{\"amount\":\"Amount to top up.\"}},\"withdrawIncentiveTokenBalance()\":{\"details\":\"withdraws the incentive token balance.\"}},\"title\":\"Derolas Auction Contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isRatioPass(uint256[],uint256[],uint256)\":{\"notice\":\"The ratio pass is true if there was a difference in donations between previous and current checkpoints.\"},\"withdrawIncentiveTokenBalance()\":{\"notice\":\"This function allows the owner to withdraw the incentive token balance from the contract.\"}},\"notice\":\"Main contract for managing rounds, donations, and rewards\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/DerolasAuction.sol\":\"DerolasAuction\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":ds-test/=lib/solmate/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"src/DerolasAuction.sol\":{\"keccak256\":\"0x80b14305f23008d1a251da4e0c801ac5d1e1dd08de5c40c087e1949a110be4f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://028ff803f5f6f985d7f826dc731d0d7e61389ce5729dd4e1312e4c0dd0528f83\",\"dweb:/ipfs/QmdLgxLWuDgBzz3SxYzfk2zwUGdfnpRHv6X64rDnCTTWfp\"]},\"src/interfaces/IBalancerRouter.sol\":{\"keccak256\":\"0x347f9767364e5ccf817c6bbe1bacd1e039bf69ea327e5563af4ca860e48249cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://157122f383059870d9de5e591349749c521cfbfc5bd795cae37138b7b2bc0f0d\",\"dweb:/ipfs/QmdoV9U7byYp77uAuWLpZ1o6Vv4PV9ir4PD8R9UCywQLWQ\"]},\"src/interfaces/IBalancerVaultAdmin.sol\":{\"keccak256\":\"0x3ab22825c6a43aefd66d23930ae0645122574975badad121344b6c7c13388e66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f96a0329570f2c3c76e7c90667aea5cb4279349eb02f97fc6da6ca8b84ab03e0\",\"dweb:/ipfs/QmYhKo9amzFBJ6uw8onFZp5re9oBf6htzUEHHvdfraBuDn\"]},\"src/interfaces/IPermit2.sol\":{\"keccak256\":\"0x4602e2af611a4344f4bf7c5f3d01b6275fb99cecb81b6ed1c9955e1c0b32421e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://505479a91ca709f92d6a5216a28195718fb107d8acd7929691c45d7f3fd6d4c4\",\"dweb:/ipfs/QmY1GUdZaEVgYarQ5PfDsQaY1XLGEQT9GXbAcJ3kikJGa6\"]},\"src/interfaces/IToken.sol\":{\"keccak256\":\"0xd542bd3694c5f1b457452bb78d3b86d6716ce37a4bbda3dc011392ca5e1402e2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://38b570854869d6ba91d4077972a15b7cd11b8cd73d98731cc359099c69e2cac9\",\"dweb:/ipfs/QmYgxTV6C6HGS1bKrsADKQj3JwUGUNyvypXy86zTxDoAL4\"]},\"src/libraries/SafeTransferLib.sol\":{\"keccak256\":\"0xbdd1fa3a3838c8b2a8a5f67b64d9500d70bd7a8f12729268843cbf5d0caac829\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6d30dc49cdef0231df7146801b126d928dfc6fe48d1df0cded8f4818e57da72\",\"dweb:/ipfs/QmUUQNUi2pSXsWJSuQoBvS8rLV9bcUgp1BBvN43eu6f5tN\"]}},\"version\":1}", + "metadata": { + "compiler": { + "version": "0.8.30+commit.73712a01" }, - "kind": "dev", - "methods": { - "owner()": { - "details": "Returns the address of the current owner." - }, - "renounceOwnership()": { - "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minDonation", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_balancerRouter", + "type": "address" + }, + { + "internalType": "address", + "name": "_balancerVaultAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "_poolId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_assetsInPool", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_incentiveTokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_incentiveTokenIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_wethIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_availableRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_roundLength", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "type": "error", + "name": "NoAvailableIncentiveBalance" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "type": "error", + "name": "TokenTransferFailed" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "roundCounter", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "totalRoundDonations", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "totalRoundClaimed", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "availableRewards", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "AuctionEnded", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "donatorAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "DonationReceived", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "EthDonatedToBalancer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnerUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "nextRound", + "type": "uint256", + "indexed": true + }, + { + "internalType": "uint256", + "name": "availableRewards", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "roundLength", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "minDonation", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "ParamsUpdated", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "donatorAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "RewardsClaimed", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "TopUpIncentiveReceived", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "TopUpIncentiveWithdrawn", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "UnclaimedIncentiveTokensDonated", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "MINIMUM_BALANCE_DONATION_AMOUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "assetsInPool", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "balancerRouter", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "balancerVaultAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "changeOwner" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newRoundRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newRoundLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minDonation", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "changeParams" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "claim" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "claimable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "currentRound", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "payable", + "type": "function", + "name": "donate" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "endRound" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "epochDonationActivities", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "donation", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "estimateTicketPercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getAllocatedIncentives", + "outputs": [ + { + "internalType": "uint256", + "name": "allocatedRewards", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getBlocksSinceRoundEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getCurrentShare", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getGameState", + "outputs": [ + { + "internalType": "struct GameState", + "name": "state", + "type": "tuple", + "components": [ + { + "internalType": "uint256", + "name": "roundLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentRound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "roundEndBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumDonation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blocksRemaining", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "roundRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDonated", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalClaimed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "incentiveBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "userCurrentDonation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "userCurrentShare", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "userClaimable", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "hasClaimed", + "type": "bool" + }, + { + "internalType": "bool", + "name": "canPlayGame", + "type": "bool" + } + ] + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "multisig", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getMultisigNonces", + "outputs": [ + { + "internalType": "uint256[]", + "name": "nonces", + "type": "uint256[]" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRemainingRoundLength", + "outputs": [ + { + "internalType": "uint256", + "name": "remainingRoundLength", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRoundProgress", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "incentiveTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "incentiveTokenIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "curNonces", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "lastNonces", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isRatioPass", + "outputs": [ + { + "internalType": "bool", + "name": "ratioPass", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "paramsUpdateRequested", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "permit2", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "poolId", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "roundPoints", + "outputs": [ + { + "internalType": "uint256", + "name": "availableRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDonated", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalClaimed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minDonation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "roundToClaimed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "roundToDonations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "topUpIncentiveBalance" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "wethIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdrawIncentiveTokenBalance" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "changeOwner(address)": { + "details": "Changes contract owner address.", + "params": { + "newOwner": "Address of a new owner." + } + }, + "changeParams(uint256,uint256,uint256)": { + "details": "Changes round parameters.", + "params": { + "minDonation": "New minimum donation.", + "newRoundLength": "New round length.", + "newRoundRewards": "New round rewards." + } + }, + "claim()": { + "details": "Claims donation based rewards for the previous round" + }, + "claimable(address)": { + "details": "Gets claimable rewards.", + "params": { + "account": "Account address." + }, + "returns": { + "_0": "Claimable rewards." + } + }, + "constructor": { + "details": "DerolasStaking constructor.", + "params": { + "_assetsInPool": "Assets in pool.", + "_availableRewards": "Available rewards.", + "_balancerRouter": "Balancer router address.", + "_incentiveTokenAddress": "Incentive token address.", + "_incentiveTokenIndex": "Incentive token index.", + "_minDonation": "Minimum round donation.", + "_poolId": "Pool ID.", + "_roundLength": "Round length." + } + }, + "donate()": { + "details": "Donates to the auction contract." + }, + "endRound()": { + "details": "Ends an round." + }, + "estimateTicketPercentage(uint256)": { + "details": "Estimates ticket percentage.", + "params": { + "donation": "Donation amount." + }, + "returns": { + "_0": "Ticket percentage." + } + }, + "getAllocatedIncentives()": { + "details": "gets allocated Incentives", + "returns": { + "allocatedRewards": "Allocated rewards." + } + }, + "getBlocksSinceRoundEnd()": { + "details": "Gets blocks since last round end.", + "returns": { + "_0": "Blocks since last round end." + } + }, + "getCurrentShare(address)": { + "details": "Gets current share.", + "params": { + "account": "Account address." + }, + "returns": { + "_0": "Current share." + } + }, + "getGameState(address)": { + "params": { + "user": "User address." + }, + "returns": { + "state": "game state." + } + }, + "getMultisigNonces(address)": { + "details": "Gets service multisig nonces.", + "params": { + "multisig": "Service multisig address." + }, + "returns": { + "nonces": "Current donations value." + } + }, + "getRemainingRoundLength()": { + "details": "Gets remaining round length progress.", + "returns": { + "remainingRoundLength": "Remaining round length." + } + }, + "getRoundProgress()": { + "details": "Gets round progress.", + "returns": { + "_0": "Round progress." + } + }, + "isRatioPass(uint256[],uint256[],uint256)": { + "details": "Checks if the service multisig liveness ratio passes the defined liveness threshold.", + "params": { + "curNonces": "Current service multisig set of a single nonce.", + "lastNonces": "Last service multisig set of a single nonce." + }, + "returns": { + "ratioPass": "True, if the liveness ratio passes the check." + } + }, + "topUpIncentiveBalance(uint256)": { + "details": "Top ups incentive balance.", + "params": { + "amount": "Amount to top up." + } + }, + "withdrawIncentiveTokenBalance()": { + "details": "withdraws the incentive token balance." + } + }, + "version": 1 }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + "userdoc": { + "kind": "user", + "methods": { + "isRatioPass(uint256[],uint256[],uint256)": { + "notice": "The ratio pass is true if there was a difference in donations between previous and current checkpoints." + }, + "withdrawIncentiveTokenBalance()": { + "notice": "This function allows the owner to withdraw the incentive token balance from the contract." + } + }, + "version": 1 } }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 845, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "_status", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 8, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "_owner", - "offset": 0, - "slot": "1", - "type": "t_address" - }, - { - "astId": 972, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "totalDonated", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 974, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "totalClaimed", - "offset": 0, - "slot": "3", - "type": "t_uint256" - }, - { - "astId": 977, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "currentEpoch", - "offset": 0, - "slot": "4", - "type": "t_uint256" + "settings": { + "remappings": [ + "ds-test/=lib/solmate/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "solmate/=lib/solmate/src/" + ], + "optimizer": { + "enabled": true, + "runs": 1000000 }, - { - "astId": 986, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "epochToDonations", - "offset": 0, - "slot": "5", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" + "metadata": { + "bytecodeHash": "ipfs" }, - { - "astId": 992, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "epochToClaimed", - "offset": 0, - "slot": "6", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" + "compilationTarget": { + "src/DerolasAuction.sol": "DerolasAuction" }, - { - "astId": 996, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "epochToTotalDonated", - "offset": 0, - "slot": "7", - "type": "t_mapping(t_uint256,t_uint256)" - }, - { - "astId": 1000, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "epochToEndBlock", - "offset": 0, - "slot": "8", - "type": "t_mapping(t_uint256,t_uint256)" - }, - { - "astId": 1004, - "contract": "contracts/Staking.sol:DerolasStaking", - "label": "epochDonated", - "offset": 0, - "slot": "9", - "type": "t_mapping(t_uint256,t_bool)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" + "evmVersion": "prague", + "libraries": {} + }, + "sources": { + "src/DerolasAuction.sol": { + "keccak256": "0x80b14305f23008d1a251da4e0c801ac5d1e1dd08de5c40c087e1949a110be4f0", + "urls": [ + "bzz-raw://028ff803f5f6f985d7f826dc731d0d7e61389ce5729dd4e1312e4c0dd0528f83", + "dweb:/ipfs/QmdLgxLWuDgBzz3SxYzfk2zwUGdfnpRHv6X64rDnCTTWfp" + ], + "license": "MIT" }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" + "src/interfaces/IBalancerRouter.sol": { + "keccak256": "0x347f9767364e5ccf817c6bbe1bacd1e039bf69ea327e5563af4ca860e48249cc", + "urls": [ + "bzz-raw://157122f383059870d9de5e591349749c521cfbfc5bd795cae37138b7b2bc0f0d", + "dweb:/ipfs/QmdoV9U7byYp77uAuWLpZ1o6Vv4PV9ir4PD8R9UCywQLWQ" + ], + "license": "MIT" }, - "t_mapping(t_uint256,t_bool)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bool)", - "numberOfBytes": "32", - "value": "t_bool" + "src/interfaces/IBalancerVaultAdmin.sol": { + "keccak256": "0x3ab22825c6a43aefd66d23930ae0645122574975badad121344b6c7c13388e66", + "urls": [ + "bzz-raw://f96a0329570f2c3c76e7c90667aea5cb4279349eb02f97fc6da6ca8b84ab03e0", + "dweb:/ipfs/QmYhKo9amzFBJ6uw8onFZp5re9oBf6htzUEHHvdfraBuDn" + ], + "license": "MIT" }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" + "src/interfaces/IPermit2.sol": { + "keccak256": "0x4602e2af611a4344f4bf7c5f3d01b6275fb99cecb81b6ed1c9955e1c0b32421e", + "urls": [ + "bzz-raw://505479a91ca709f92d6a5216a28195718fb107d8acd7929691c45d7f3fd6d4c4", + "dweb:/ipfs/QmY1GUdZaEVgYarQ5PfDsQaY1XLGEQT9GXbAcJ3kikJGa6" + ], + "license": "MIT" }, - "t_mapping(t_uint256,t_uint256)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" + "src/interfaces/IToken.sol": { + "keccak256": "0xd542bd3694c5f1b457452bb78d3b86d6716ce37a4bbda3dc011392ca5e1402e2", + "urls": [ + "bzz-raw://38b570854869d6ba91d4077972a15b7cd11b8cd73d98731cc359099c69e2cac9", + "dweb:/ipfs/QmYgxTV6C6HGS1bKrsADKQj3JwUGUNyvypXy86zTxDoAL4" + ], + "license": "MIT" }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" + "src/libraries/SafeTransferLib.sol": { + "keccak256": "0xbdd1fa3a3838c8b2a8a5f67b64d9500d70bd7a8f12729268843cbf5d0caac829", + "urls": [ + "bzz-raw://c6d30dc49cdef0231df7146801b126d928dfc6fe48d1df0cded8f4818e57da72", + "dweb:/ipfs/QmUUQNUi2pSXsWJSuQoBvS8rLV9bcUgp1BBvN43eu6f5tN" + ], + "license": "MIT" } - } - } -} \ No newline at end of file + }, + "version": 1 + }, + "id": 0, + "address": "0xa6D763592f02699de751d03d7Cb41388D3572909" +} diff --git a/third_party/agent_runner/src/lib/contracts/interface.ts b/third_party/agent_runner/src/lib/contracts/interface.ts index c65c6f8..d05068f 100644 --- a/third_party/agent_runner/src/lib/contracts/interface.ts +++ b/third_party/agent_runner/src/lib/contracts/interface.ts @@ -1,8 +1,8 @@ let FunctionNames = { canPlayGame : 'canPlayGame', - epochLength : 'getEpochLength', - getEpochProgress : 'getEpochProgress', + roundLength : 'getRoundLength', + getRoundProgress : 'getRoundProgress', getTotalContributions : 'getTotalDonated', getTotalRewards : 'getTotalRewards', getUserContributions : 'getUserContributions', @@ -10,10 +10,10 @@ getBlockRemaining : 'getBlocksRemaining', minimumDonation : 'minimumDonation', topUpIncentives : 'topUpIncentiveBalance', - endEpoch : 'endEpoch', + endRound : 'endRound', getIncentiveBalance : 'currentIncentiveBalance', - getEpochRewards : 'getEpochRewards', - getCurrentEpoch : 'getCurrentEpoch', + getRoundRewards : 'getRoundRewards', + getCurrentRound : 'getCurrentRound', donate: 'donate', claim: 'claim', }; @@ -26,14 +26,16 @@ import { base, } from 'viem/chains'; // or wherever your chain imports come from import { createConfig, http } from '@wagmi/core' import { createClient, createWalletClient } from 'viem' import { toast } from 'svelte-sonner'; + const derolasAbi = DerolasStakingJson; -let percentCompleted: number = 0; +const BASE_RPC_URL = "https://base.llamarpc.com"; + const configWrite = createConfig({ chains: [base, base], transports: { - [base.id]: http("https://base.llamarpc.com"), + [base.id]: http(BASE_RPC_URL), }, }) @@ -48,7 +50,7 @@ let OLAS_TOKEN_ADDRESS: `0x${string}` = "0x54330d28ca3357f294334bdc454a032e7f353 async function topUpOlas(topUpAmount: number) { console.log('Topping up OLAS...'); // Logic to top up OLAS - console.log('Epoch Rewards:', topUpAmount); + console.log('Round Rewards:', topUpAmount); const _accounts = await (window as any).ethereum.request({ method: 'eth_requestAccounts' }); const _account = _accounts[0]; console.log('Account:', _account); @@ -118,15 +120,15 @@ async function topUpOlas(topUpAmount: number) { -async function endEpoch(walletClient: any) { - console.log('Ending epoch...'); +async function endRound(walletClient: any) { + console.log('Ending round...'); const accounts = await walletClient.getAddresses(); console.log(accounts); const tx = await writeContract(walletClient, { abi: derolasAbi.abi, address: DEPLOYED_CONTRACT_ADDRESS, - functionName: 'endEpoch', + functionName: 'endRound', args: [], account: accounts[0], chain: base, @@ -177,7 +179,7 @@ async function loadContracts(userAddress: `0x${string}`) { const _config = createConfig({ chains: [base], client({ chain }) { - return createClient({ chain, transport: http("https://base.drpc.org") }) + return createClient({ chain, transport: http(BASE_RPC_URL) }) }, }); @@ -188,63 +190,41 @@ async function loadContracts(userAddress: `0x${string}`) { abi: derolasAbi.abi, functionName: "getGameState", args: [userAddress], - }) as [ - bigint, // epochLength - bigint, // currentEpoch - bigint, // epochEndBlock - bigint, // minimalDonation - bigint, // blocksRemaining - bigint, // epochRewards - bigint, // totalDonated - bigint, // totalClaimed - bigint, // incentiveBalance - bigint, // userCurrentDonation - bigint, // userCurrentShare - bigint, // userClaimable - boolean, // hasClaimed - boolean // canPlayGame - ]; - - const [ - currentEpoch, - epochLength, - epochEndBlock, - minimalDonation, - blocksRemaining, - epochRewards, - totalDonated, - totalClaimed, - incentiveBalance, - userCurrentDonation, - userCurrentShare, - userClaimable, - hasClaimed, - canPlayGame, - ] = gameState; - + }) as { + blocksRemaining: bigint; + canPlayGame: boolean; + currentRound: bigint; + hasClaimed: boolean; + incentiveBalance: bigint; + minimumDonation: bigint; + roundEndBlock: bigint; + roundLength: bigint; + roundRewards: bigint; + totalClaimed: bigint; + totalDonated: bigint; + userClaimable: bigint; + userCurrentDonation: bigint; + userCurrentShare: bigint; + }; - // console.log('Game state:', gameState); - - - let state = { - epochLength: Number(epochLength), - currentEpoch: Number(currentEpoch), - epochEndBlock: Number(epochEndBlock), - minimalDonation: Number(minimalDonation), - blocksRemaining: Number(blocksRemaining), - epochRewards: Number(epochRewards), - totalDonated: Number(totalDonated), - totalClaimed: Number(totalClaimed), - incentiveBalance: Number(incentiveBalance), - userCurrentDonation: Number(userCurrentDonation), - userCurrentShare: Number(userCurrentShare), // 1e18 = 100% - userClaimable: Number(userClaimable), - hasClaimed: Boolean(hasClaimed), - canPlayGame: Boolean(canPlayGame), - percentCompleted, + console.log('Game State:', gameState); + return { + blocksRemaining: Number(gameState.blocksRemaining), + canPlayGame: Boolean(gameState.canPlayGame), + currentRound: Number(gameState.currentRound), + hasClaimed: Boolean(gameState.hasClaimed), + incentiveBalance: Number(gameState.incentiveBalance), + minimumDonation: Number(gameState.minimumDonation), + roundEndBlock: Number(gameState.roundEndBlock), + roundLength: Number(gameState.roundLength), + roundRewards: Number(gameState.roundRewards), + totalClaimed: Number(gameState.totalClaimed), + totalDonated: Number(gameState.totalDonated), + userClaimable: Number(gameState.userClaimable), + userCurrentDonation: Number(gameState.userCurrentDonation), + userCurrentShare: Number(gameState.userCurrentShare), }; - // console.log('Game state:', state); - return state; + } @@ -252,7 +232,7 @@ async function loadContracts(userAddress: `0x${string}`) { export { loadContracts, topUpOlas, - endEpoch, + endRound, contribute, claim, FunctionNames, diff --git a/third_party/agent_runner/tauri-shell.nix b/third_party/agent_runner/tauri-shell.nix index b7c5007..c3bd586 100644 --- a/third_party/agent_runner/tauri-shell.nix +++ b/third_party/agent_runner/tauri-shell.nix @@ -9,7 +9,7 @@ pkgs.mkShell { xdg-utils fuse appimage-run - appimagekit + # appimagekit jdk # rust tools rustup From 17c2319da70c967be857c634aa81592260fcf07c Mon Sep 17 00:00:00 2001 From: 8ball030 <8baller@station.codes> Date: Mon, 21 Jul 2025 15:23:26 +0100 Subject: [PATCH 2/3] feat:ensure-updated-contract --- third_party/agent_runner/src/lib/contracts/DerolasStaking.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/agent_runner/src/lib/contracts/DerolasStaking.json b/third_party/agent_runner/src/lib/contracts/DerolasStaking.json index 6c9d559..ceb21b9 100644 --- a/third_party/agent_runner/src/lib/contracts/DerolasStaking.json +++ b/third_party/agent_runner/src/lib/contracts/DerolasStaking.json @@ -2098,5 +2098,5 @@ "version": 1 }, "id": 0, - "address": "0xa6D763592f02699de751d03d7Cb41388D3572909" + "address": "0x2216ebB7f5f983b1D15713F90556edd56EB88DeE" } From 5c427f5a461addd5d20b2e589d801fc6118500af Mon Sep 17 00:00:00 2001 From: 8ball030 <8baller@station.codes> Date: Mon, 28 Jul 2025 20:37:19 +0100 Subject: [PATCH 3/3] feat:added-more-charts --- .../src/lib/components/Metrics.svelte | 99 ++++++++++++++++--- 1 file changed, 88 insertions(+), 11 deletions(-) diff --git a/third_party/agent_runner/src/lib/components/Metrics.svelte b/third_party/agent_runner/src/lib/components/Metrics.svelte index e9b48d0..391f0e0 100644 --- a/third_party/agent_runner/src/lib/components/Metrics.svelte +++ b/third_party/agent_runner/src/lib/components/Metrics.svelte @@ -1,5 +1,5 @@