From 5a4d3398415bc1030b0783c868d91d3baad55d79 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 15:28:56 -0300 Subject: [PATCH 1/7] Home page --- packages/nextjs/app/page.tsx | 316 +++++++++++++++++++++----- packages/nextjs/app/zpass/page.tsx | 257 --------------------- packages/nextjs/components/Header.tsx | 20 +- packages/nextjs/public/priest.jpg | Bin 0 -> 181486 bytes 4 files changed, 263 insertions(+), 330 deletions(-) delete mode 100644 packages/nextjs/app/zpass/page.tsx create mode 100644 packages/nextjs/public/priest.jpg diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index b91c22f..b70e7d7 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -1,70 +1,274 @@ "use client"; -import Link from "next/link"; -import type { NextPage } from "next"; -import { useAccount } from "wagmi"; -import { BugAntIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; -import { Address } from "~~/components/scaffold-eth"; +import { useState } from "react"; +import { FrogSpec } from "@frogcrypto/shared"; +import { ParcnetAPI, Zapp, connect } from "@parcnet-js/app-connector"; +import { gpcPreVerify } from "@pcd/gpc"; +import { ProtoPODGPC } from "@pcd/gpcircuits"; +import { POD, PODEntries } from "@pcd/pod"; +import { PartialDeep } from "type-fest"; +import { useAccount, useSignMessage } from "wagmi"; +import { getParsedError, notification } from "~~/utils/scaffold-eth"; +import { replacer } from "~~/utils/scaffold-eth/common"; +import { TokensBalances } from "~~/components/TokensBalances"; +import { RainbowKitCustomConnectButton } from "~~/components/scaffold-eth"; -const Home: NextPage = () => { +export interface PODData { + entries: PODEntries; + signature: string; + signerPublicKey: string; +} + +export function podToPODData(pod: POD): PODData { + return { + entries: pod.content.asEntries(), + signature: pod.signature, + signerPublicKey: pod.signerPublicKey, + }; +} + +type ForgCryptToType = PartialDeep; + +const entriesToProve: ForgCryptToType = { + beauty: { + type: "int", + }, + jump: { + type: "int", + }, + speed: { + type: "int", + }, + frogId: { + type: "int", + }, + name: { + type: "string", + }, + biome: { + type: "int", + }, + owner: { + type: "cryptographic", + }, + intelligence: { + type: "int", + }, + rarity: { + type: "int", + }, + description: { + type: "string", + }, + temperament: { + type: "int", + }, +}; + +// TODO: Remove console logs +const myZapp: Zapp = { + name: "Frog Bank", + permissions: { + READ_POD: { collections: ["FrogCrypto (alpha)"] }, + INSERT_POD: { collections: ["FrogCrypto (alpha)"] }, + REQUEST_PROOF: { collections: ["FrogCrypto (alpha)"] }, + }, +}; + +const Home = () => { const { address: connectedAddress } = useAccount(); + const [z, setZ] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [story, setStory] = useState(null); + const [squeezedFrogName, setSqueezedFrogName] = useState(null); + + const { signMessageAsync } = useSignMessage(); + + const handleAuth = async () => { + try { + if (!connectedAddress) return notification.error("Please connect your address"); + + const element = document.getElementById("zpass-app-connector") as HTMLElement; + + if (!element) { + console.log("Unable to find app connector element"); + notification.error("Oops! Something went wrong"); + return; + } + + console.log("The element was found", element); + const clientUrl = "https://staging.zupass.org"; + + setIsLoading(true); + const zCon = await connect(myZapp, element, clientUrl); + setZ(zCon); + setIsLoading(false); + + notification.success("Authentication successful!"); + } catch (e) { + console.log("error", e); + setIsLoading(false); + notification.error("Authentication failed"); + } + }; + + const handleSqueeze = async () => { + try { + if (!z) return notification.error("Please authenticate first"); + setIsLoading(true); + setStory(null); // Reset story when starting new squeeze + + const result = await z.gpc.prove({ + request: { + pods: { + FROGCRYPTO: { + pod: { + entries: entriesToProve, + }, + revealed: { + beauty: true, + jump: true, + speed: true, + frogId: true, + name: true, + biome: true, + owner: true, + intelligence: true, + rarity: true, + description: true, + temperament: true, + }, + }, + }, + }, + }); + + if (result.success) { + const boundConfig = result.boundConfig; + console.log("The bound config is:", boundConfig); + const revealedClaims = result.revealedClaims; + const circuit = gpcPreVerify(boundConfig, revealedClaims); + const pubSignals = ProtoPODGPC.makePublicSignals(circuit.circuitPublicInputs, circuit.circuitOutputs); + + console.log("The pubSignals are:", pubSignals); + const frogStats = revealedClaims.pods.FROGCRYPTO?.entries; + console.log("The frogStats are:", frogStats); + const frogName = frogStats?.name.value; + + const beauty = frogStats?.beauty.value as any as bigint; + const biome = frogStats?.biome.value as any as bigint; + const intelligence = frogStats?.intelligence.value as any as bigint; + const jump = frogStats?.jump.value as any as bigint; + const speed = frogStats?.speed.value as any as bigint; + const rarity = frogStats?.rarity.value as any as bigint; + const owner = frogStats?.owner.value as any as bigint; + const description = frogStats?.description.value as any as string; + const temperament = frogStats?.temperament.value as any as bigint; + const frogId = frogStats?.frogId.value as any as bigint; + + notification.info("Squeezing your Frog..."); + const signature = await signMessageAsync({ + message: `I own ${frogName}`, + }); + + // Send data to backend + const response = await fetch("/api/squeeze", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify( + { + proof: { + pi_a: result.proof.pi_a.slice(0, -1), + pi_b: result.proof.pi_b.slice(0, -1), + pi_c: result.proof.pi_c.slice(0, -1), + pubSignals: pubSignals, + }, + frogStats: { + beauty: beauty.toString(), + biome: biome.toString(), + intelligence: intelligence.toString(), + jump: jump.toString(), + speed: speed.toString(), + rarity: rarity.toString(), + owner: owner.toString(), + name: frogName, + description, + temperament: temperament.toString(), + frogId: frogId.toString(), + }, + signature, + address: connectedAddress, + }, + replacer, + ), + }); + const data = await response.json(); + + if (!response.ok) { + throw new Error(data.error); + } + + console.log("The data is", data); + setStory(data.story); + setSqueezedFrogName(frogName as string); + notification.success(`Successfully squeezed Frog: ${frogName}`); + } + } catch (e) { + const errorMessage = getParsedError(e); + notification.error(errorMessage); + } finally { + setIsLoading(false); + } + }; + + if (!connectedAddress) { + return ( +
+ +
+ ); + } return ( - <> -
-
-

- Welcome to - Scaffold-ETH 2 -

-
-

Connected Address:

-
-
-

- Get started by editing{" "} - - packages/nextjs/app/page.tsx - -

-

- Edit your smart contract{" "} - - YourContract.sol - {" "} - in{" "} - - packages/hardhat/contracts - -

+
+
+
+ {!z && ( + + )} + {z && ( + + )}
-
-
-
- -

- Tinker with your smart contract using the{" "} - - Debug Contracts - {" "} - tab. -

+ {story && squeezedFrogName ? ( + <> +
+
+

The Tale of {squeezedFrogName}

+
+

{story}

+
-
- -

- Explore your local transactions with the{" "} - - Block Explorer - {" "} - tab. -

+
+
+

Rewards

+
+ +
-
-
+ + ) : ( + + )}
- +
); }; diff --git a/packages/nextjs/app/zpass/page.tsx b/packages/nextjs/app/zpass/page.tsx deleted file mode 100644 index 58dc83f..0000000 --- a/packages/nextjs/app/zpass/page.tsx +++ /dev/null @@ -1,257 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { FrogSpec } from "@frogcrypto/shared"; -import { ParcnetAPI, Zapp, connect } from "@parcnet-js/app-connector"; -import { gpcPreVerify } from "@pcd/gpc"; -import { ProtoPODGPC } from "@pcd/gpcircuits"; -import { POD, PODEntries } from "@pcd/pod"; -import { PartialDeep } from "type-fest"; -import { useAccount, useSignMessage } from "wagmi"; -import { getParsedError, notification } from "~~/utils/scaffold-eth"; -import { replacer } from "~~/utils/scaffold-eth/common"; -import { TokensBalances } from "~~/components/TokensBalances"; - -export interface PODData { - entries: PODEntries; - signature: string; - signerPublicKey: string; -} - -export function podToPODData(pod: POD): PODData { - return { - entries: pod.content.asEntries(), - signature: pod.signature, - signerPublicKey: pod.signerPublicKey, - }; -} - -type ForgCryptToType = PartialDeep; - -const entriesToProve: ForgCryptToType = { - beauty: { - type: "int", - }, - jump: { - type: "int", - }, - speed: { - type: "int", - }, - frogId: { - type: "int", - }, - name: { - type: "string", - }, - biome: { - type: "int", - }, - owner: { - type: "cryptographic", - }, - intelligence: { - type: "int", - }, - rarity: { - type: "int", - }, - description: { - type: "string", - }, - temperament: { - type: "int", - }, -}; - -// TODO: Remove console logs -const myZapp: Zapp = { - name: "Frog Bank", - permissions: { - READ_POD: { collections: ["FrogCrypto (alpha)"] }, - INSERT_POD: { collections: ["FrogCrypto (alpha)"] }, - REQUEST_PROOF: { collections: ["FrogCrypto (alpha)"] }, - }, -}; - -const ZuAuth = () => { - const { address: connectedAddress } = useAccount(); - const [z, setZ] = useState(null); - const [isLoading, setIsLoading] = useState(false); - const [story, setStory] = useState(null); - const [squeezedFrogName, setSqueezedFrogName] = useState(null); - - const { signMessageAsync } = useSignMessage(); - - const handleAuth = async () => { - try { - if (!connectedAddress) return notification.error("Please connect your address"); - - const element = document.getElementById("zpass-app-connector") as HTMLElement; - - if (!element) { - console.log("Unable to find app connector element"); - notification.error("Oops! Something went wrong"); - return; - } - - console.log("The element was found", element); - const clientUrl = "https://staging.zupass.org"; - - setIsLoading(true); - const zCon = await connect(myZapp, element, clientUrl); - setZ(zCon); - setIsLoading(false); - - notification.success("Authentication successful!"); - } catch (e) { - console.log("error", e); - setIsLoading(false); - notification.error("Authentication failed"); - } - }; - - const handleSqueeze = async () => { - try { - if (!z) return notification.error("Please authenticate first"); - setIsLoading(true); - setStory(null); // Reset story when starting new squeeze - - const result = await z.gpc.prove({ - request: { - pods: { - FROGCRYPTO: { - pod: { - entries: entriesToProve, - }, - revealed: { - beauty: true, - jump: true, - speed: true, - frogId: true, - name: true, - biome: true, - owner: true, - intelligence: true, - rarity: true, - description: true, - temperament: true, - }, - }, - }, - }, - }); - - if (result.success) { - const boundConfig = result.boundConfig; - console.log("The bound config is:", boundConfig); - const revealedClaims = result.revealedClaims; - const circuit = gpcPreVerify(boundConfig, revealedClaims); - const pubSignals = ProtoPODGPC.makePublicSignals(circuit.circuitPublicInputs, circuit.circuitOutputs); - - console.log("The pubSignals are:", pubSignals); - const frogStats = revealedClaims.pods.FROGCRYPTO?.entries; - console.log("The frogStats are:", frogStats); - const frogName = frogStats?.name.value; - - const beauty = frogStats?.beauty.value as any as bigint; - const biome = frogStats?.biome.value as any as bigint; - const intelligence = frogStats?.intelligence.value as any as bigint; - const jump = frogStats?.jump.value as any as bigint; - const speed = frogStats?.speed.value as any as bigint; - const rarity = frogStats?.rarity.value as any as bigint; - const owner = frogStats?.owner.value as any as bigint; - const description = frogStats?.description.value as any as string; - const temperament = frogStats?.temperament.value as any as bigint; - const frogId = frogStats?.frogId.value as any as bigint; - - notification.info("Squeezing your Frog..."); - const signature = await signMessageAsync({ - message: `I own ${frogName}`, - }); - - // Send data to backend - const response = await fetch("/api/squeeze", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify( - { - proof: { - pi_a: result.proof.pi_a.slice(0, -1), - pi_b: result.proof.pi_b.slice(0, -1), - pi_c: result.proof.pi_c.slice(0, -1), - pubSignals: pubSignals, - }, - frogStats: { - beauty: beauty.toString(), - biome: biome.toString(), - intelligence: intelligence.toString(), - jump: jump.toString(), - speed: speed.toString(), - rarity: rarity.toString(), - owner: owner.toString(), - name: frogName, - description, - temperament: temperament.toString(), - frogId: frogId.toString(), - }, - signature, - address: connectedAddress, - }, - replacer, - ), - }); - const data = await response.json(); - - if (!response.ok) { - throw new Error(data.error); - } - - console.log("The data is", data); - setStory(data.story); - setSqueezedFrogName(frogName as string); - notification.success(`Successfully squeezed Frog: ${frogName}`); - } - } catch (e) { - const errorMessage = getParsedError(e); - notification.error(errorMessage); - } finally { - setIsLoading(false); - } - }; - - return ( -
-
-
- {!z && ( - - )} - {z && ( - - )} -
- - {story && squeezedFrogName && ( -
-
-

The Tale of {squeezedFrogName}

-
-

{story}

-
-
- )} - - -
-
- ); -}; - -export default ZuAuth; diff --git a/packages/nextjs/components/Header.tsx b/packages/nextjs/components/Header.tsx index d6598ba..697f43f 100644 --- a/packages/nextjs/components/Header.tsx +++ b/packages/nextjs/components/Header.tsx @@ -4,7 +4,7 @@ import React, { useCallback, useRef, useState } from "react"; import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { Bars3Icon, BugAntIcon } from "@heroicons/react/24/outline"; +import { Bars3Icon } from "@heroicons/react/24/outline"; import { FaucetButton, RainbowKitCustomConnectButton } from "~~/components/scaffold-eth"; import { useOutsideClick } from "~~/hooks/scaffold-eth"; @@ -15,20 +15,6 @@ type HeaderMenuLink = { }; export const menuLinks: HeaderMenuLink[] = [ - { - label: "Home", - href: "/", - }, - { - label: "Debug Contracts", - href: "/debug", - icon: , - }, - { - label: "Zpass", - href: "/zpass", - icon: , - }, ]; export const HeaderMenuLinks = () => { @@ -98,8 +84,8 @@ export const Header = () => { SE2 logo
- Scaffold-ETH - Ethereum dev stack + FrogCrypto + Squeeze your frogs
    diff --git a/packages/nextjs/public/priest.jpg b/packages/nextjs/public/priest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cabc950f60d3e1224b8d824384f2db5cdc5326f8 GIT binary patch literal 181486 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 literal 0 HcmV?d00001 From c3a263570be73a05081c408fee5cf17b31412581 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 15:56:19 -0300 Subject: [PATCH 2/7] Add image when no connected --- packages/nextjs/app/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index b70e7d7..e359649 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -225,8 +225,9 @@ const Home = () => { if (!connectedAddress) { return ( -
    +
    +
    ); } From a78889971ff4b90674a5113ae93fa78b4c8516c8 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 19:23:09 -0300 Subject: [PATCH 3/7] Better sign message --- packages/nextjs/app/api/squeeze/route.ts | 5 ++++- packages/nextjs/app/page.tsx | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/nextjs/app/api/squeeze/route.ts b/packages/nextjs/app/api/squeeze/route.ts index 1540c7c..2728b99 100644 --- a/packages/nextjs/app/api/squeeze/route.ts +++ b/packages/nextjs/app/api/squeeze/route.ts @@ -82,6 +82,7 @@ type SqueezeRequestBody = { frogStats: FrogStats; signature: string; address: string; + timestamp: number; }; // Utility function to convert string arrays to BigInt arrays @@ -130,9 +131,11 @@ export async function POST(req: Request) { console.log("The acutal values are:", actualStats); const convertedFrogStats = convertFrogStatsToBigInt(actualStats); + const message = `You are signing that you own ${body.frogStats.name} at timestamp ${body.timestamp} on https://frogcrypto-squeeze.com` + // Verify signature const isValidSignature = await verifyMessage({ - message: `I own ${body.frogStats.name}`, + message, signature: body.signature as `0x${string}`, address: body.address as `0x${string}`, }); diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index e359649..3ca751c 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -167,8 +167,9 @@ const Home = () => { const frogId = frogStats?.frogId.value as any as bigint; notification.info("Squeezing your Frog..."); + const timestamp = Date.now(); const signature = await signMessageAsync({ - message: `I own ${frogName}`, + message: `You are signing that you own ${frogName} at timestamp ${timestamp} on https://frogcrypto-squeeze.com`, }); // Send data to backend @@ -200,6 +201,7 @@ const Home = () => { }, signature, address: connectedAddress, + timestamp, }, replacer, ), From 469ae3043faae7d47a2d3cda0e21701c08f1fd0b Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 20:19:27 -0300 Subject: [PATCH 4/7] Better layout and add priest open image --- packages/nextjs/app/page.tsx | 56 +++++++++++++++---------- packages/nextjs/public/priest-open.jpg | Bin 0 -> 181842 bytes 2 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 packages/nextjs/public/priest-open.jpg diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index 3ca751c..036170a 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -227,17 +227,19 @@ const Home = () => { if (!connectedAddress) { return ( -
    - - +
    +
    + + +
    ); } return (
    -
    -
    +
    +
    {!z && ( )} + {story && squeezedFrogName && ( + <> +
    +
    +

    The Tale of {squeezedFrogName}

    +
    +

    {story}

    +
    +
    +
    +
    +

    Rewards

    +
    + +
    +
    + + )}
    {story && squeezedFrogName ? ( + + ) : ( <> -
    -
    -

    The Tale of {squeezedFrogName}

    -
    -

    {story}

    -
    -
    -
    -
    -

    Rewards

    -
    - -
    -
    + {(!z || (z && !isLoading)) && ( + + )} + {z && isLoading && ( + + )} - ) : ( - )}
    diff --git a/packages/nextjs/public/priest-open.jpg b/packages/nextjs/public/priest-open.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ecf2666d3abd3ae892eea158424c198a425ce625 GIT binary patch literal 181842 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�>#X*9-;?`xEx`)8X~YcD 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
      J?j;sJ2dWxAQ#fbYqykwMB#gX6PYU)F(Hql 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 literal 0 HcmV?d00001 From 6036cb3c77e13d65021fa44da6d6a12033cb3b4c Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 20:38:45 -0300 Subject: [PATCH 5/7] Add priest squeeze image --- packages/nextjs/app/page.tsx | 2 +- packages/nextjs/public/priest-squeeze.jpg | Bin 0 -> 168898 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/nextjs/public/priest-squeeze.jpg diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index 036170a..73e3c8c 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -271,7 +271,7 @@ const Home = () => {
{story && squeezedFrogName ? ( - + ) : ( <> {(!z || (z && !isLoading)) && ( diff --git a/packages/nextjs/public/priest-squeeze.jpg b/packages/nextjs/public/priest-squeeze.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6dfd47a2fad7491a063d4c619db58ee2969c2d82 GIT binary patch literal 168898 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/fLZ!7iRIEc-JxHPd@G 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 literal 0 HcmV?d00001 From 71edf47d7fd146520f0bf02b866b4f2995d855f3 Mon Sep 17 00:00:00 2001 From: Damian Date: Wed, 6 Nov 2024 20:56:57 -0300 Subject: [PATCH 6/7] Remove theme switch and eth price --- packages/nextjs/app/layout.tsx | 5 +-- packages/nextjs/components/Footer.tsx | 14 +------- .../ScaffoldEthAppWithProviders.tsx | 14 ++------ packages/nextjs/tailwind.config.js | 35 ------------------- 4 files changed, 4 insertions(+), 64 deletions(-) diff --git a/packages/nextjs/app/layout.tsx b/packages/nextjs/app/layout.tsx index 995bd4d..f75b6a8 100644 --- a/packages/nextjs/app/layout.tsx +++ b/packages/nextjs/app/layout.tsx @@ -1,6 +1,5 @@ import "@rainbow-me/rainbowkit/styles.css"; import { ScaffoldEthAppWithProviders } from "~~/components/ScaffoldEthAppWithProviders"; -import { ThemeProvider } from "~~/components/ThemeProvider"; import "~~/styles/globals.css"; import { getMetadata } from "~~/utils/scaffold-eth/getMetadata"; @@ -13,9 +12,7 @@ const ScaffoldEthApp = ({ children }: { children: React.ReactNode }) => { return ( - - {children} - + {children}

{/* This element will be used by the app connector */}
diff --git a/packages/nextjs/components/Footer.tsx b/packages/nextjs/components/Footer.tsx index 92b3c62..1ae5811 100644 --- a/packages/nextjs/components/Footer.tsx +++ b/packages/nextjs/components/Footer.tsx @@ -1,19 +1,16 @@ import React from "react"; import Link from "next/link"; import { hardhat } from "viem/chains"; -import { CurrencyDollarIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; import { HeartIcon } from "@heroicons/react/24/outline"; -import { SwitchTheme } from "~~/components/SwitchTheme"; import { BuidlGuidlLogo } from "~~/components/assets/BuidlGuidlLogo"; import { Faucet } from "~~/components/scaffold-eth"; import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork"; -import { useGlobalState } from "~~/services/store/store"; /** * Site footer */ export const Footer = () => { - const nativeCurrencyPrice = useGlobalState(state => state.nativeCurrency.price); const { targetNetwork } = useTargetNetwork(); const isLocalNetwork = targetNetwork.id === hardhat.id; @@ -22,14 +19,6 @@ export const Footer = () => {
- {nativeCurrencyPrice > 0 && ( -
-
- - {nativeCurrencyPrice.toFixed(2)} -
-
- )} {isLocalNetwork && ( <> @@ -40,7 +29,6 @@ export const Footer = () => { )}
-
diff --git a/packages/nextjs/components/ScaffoldEthAppWithProviders.tsx b/packages/nextjs/components/ScaffoldEthAppWithProviders.tsx index f67c2f7..9ffa04b 100644 --- a/packages/nextjs/components/ScaffoldEthAppWithProviders.tsx +++ b/packages/nextjs/components/ScaffoldEthAppWithProviders.tsx @@ -1,9 +1,7 @@ "use client"; -import { useEffect, useState } from "react"; -import { RainbowKitProvider, darkTheme, lightTheme } from "@rainbow-me/rainbowkit"; +import { RainbowKitProvider, lightTheme } from "@rainbow-me/rainbowkit"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { useTheme } from "next-themes"; import { Toaster } from "react-hot-toast"; import { WagmiProvider } from "wagmi"; import { Footer } from "~~/components/Footer"; @@ -37,21 +35,13 @@ export const queryClient = new QueryClient({ }); export const ScaffoldEthAppWithProviders = ({ children }: { children: React.ReactNode }) => { - const { resolvedTheme } = useTheme(); - const isDarkMode = resolvedTheme === "dark"; - const [mounted, setMounted] = useState(false); - - useEffect(() => { - setMounted(true); - }, []); - return ( {children} diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index 9099dc5..30f720f 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -2,8 +2,6 @@ module.exports = { content: ["./app/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", "./utils/**/*.{js,ts,jsx,tsx}"], plugins: [require("daisyui")], - darkTheme: "dark", - darkMode: ["selector", "[data-theme='dark']"], // DaisyUI theme colors daisyui: { themes: [ @@ -39,39 +37,6 @@ module.exports = { }, }, }, - { - dark: { - primary: "#212638", - "primary-content": "#F9FBFF", - secondary: "#323f61", - "secondary-content": "#F9FBFF", - accent: "#4969A6", - "accent-content": "#F9FBFF", - neutral: "#F9FBFF", - "neutral-content": "#385183", - "base-100": "#385183", - "base-200": "#2A3655", - "base-300": "#212638", - "base-content": "#F9FBFF", - info: "#385183", - success: "#34EEB6", - warning: "#FFCF72", - error: "#FF8863", - - "--rounded-btn": "9999rem", - - ".tooltip": { - "--tooltip-tail": "6px", - "--tooltip-color": "oklch(var(--p))", - }, - ".link": { - textUnderlineOffset: "2px", - }, - ".link:hover": { - opacity: "80%", - }, - }, - }, ], }, theme: { From 699678cc86f850294e9364b84bc48b5e23452e12 Mon Sep 17 00:00:00 2001 From: Damian Date: Thu, 7 Nov 2024 11:23:51 -0300 Subject: [PATCH 7/7] Get squeeze rewards and add Rewards page --- .../hardhat/contracts/FrogCryptoSqueeze.sol | 2 +- .../deployments/optimismSepolia/.chainId | 1 + .../FrogCryptoBeautyToken.json | 799 ++++++++++++++++++ .../FrogCryptoIntelligenceToken.json | 799 ++++++++++++++++++ .../optimismSepolia/FrogCryptoJumpToken.json | 799 ++++++++++++++++++ .../FrogCryptoRarityToken.json | 799 ++++++++++++++++++ .../optimismSepolia/FrogCryptoSpeedToken.json | 799 ++++++++++++++++++ .../optimismSepolia/FrogCryptoSqueeze.json | 537 ++++++++++++ .../deployments/optimismSepolia/Poseidon.json | 60 ++ .../964178e332bfe15e65bd3a294b6e046f.json | 41 + .../a49b46b2dac4fcc95aea528a9c5bd270.json | 41 + .../d25771cc29acf018fbcd36358c01e4b1.json | 74 ++ .../f11f926ae4f4bca312ca3f2182859797.json | 71 ++ packages/nextjs/app/api/squeeze/route.ts | 29 +- packages/nextjs/app/page.tsx | 11 +- packages/nextjs/app/rewards/page.tsx | 41 + packages/nextjs/components/Header.tsx | 12 +- packages/nextjs/components/TokensRewards.tsx | 26 + packages/nextjs/types/frog.d.ts | 16 +- 19 files changed, 4945 insertions(+), 12 deletions(-) create mode 100644 packages/hardhat/deployments/optimismSepolia/.chainId create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoBeautyToken.json create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoIntelligenceToken.json create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoJumpToken.json create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoRarityToken.json create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoSpeedToken.json create mode 100644 packages/hardhat/deployments/optimismSepolia/FrogCryptoSqueeze.json create mode 100644 packages/hardhat/deployments/optimismSepolia/Poseidon.json create mode 100644 packages/hardhat/deployments/optimismSepolia/solcInputs/964178e332bfe15e65bd3a294b6e046f.json create mode 100644 packages/hardhat/deployments/optimismSepolia/solcInputs/a49b46b2dac4fcc95aea528a9c5bd270.json create mode 100644 packages/hardhat/deployments/optimismSepolia/solcInputs/d25771cc29acf018fbcd36358c01e4b1.json create mode 100644 packages/hardhat/deployments/optimismSepolia/solcInputs/f11f926ae4f4bca312ca3f2182859797.json create mode 100644 packages/nextjs/app/rewards/page.tsx create mode 100644 packages/nextjs/components/TokensRewards.tsx diff --git a/packages/hardhat/contracts/FrogCryptoSqueeze.sol b/packages/hardhat/contracts/FrogCryptoSqueeze.sol index ad841cd..51671ea 100644 --- a/packages/hardhat/contracts/FrogCryptoSqueeze.sol +++ b/packages/hardhat/contracts/FrogCryptoSqueeze.sol @@ -46,7 +46,7 @@ contract FrogCryptoSqueeze is Groth16Verifier, Poseidon { uint256 indexed frogId, address indexed owner, uint256 rarityReward, - uint256 jummpReward, + uint256 jumpReward, uint256 speedReward, uint256 intelligenceReward, uint256 beautyReward diff --git a/packages/hardhat/deployments/optimismSepolia/.chainId b/packages/hardhat/deployments/optimismSepolia/.chainId new file mode 100644 index 0000000..03f37de --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/.chainId @@ -0,0 +1 @@ +11155420 \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoBeautyToken.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoBeautyToken.json new file mode 100644 index 0000000..33f7e9c --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoBeautyToken.json @@ -0,0 +1,799 @@ +{ + "address": "0x056513af3bE9d3Fb07523846183FB88E496D63e1", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xa94c298678152561134052bb6947a1c0c8005c7d2e81decc376d9afcd3cb2394", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x056513af3bE9d3Fb07523846183FB88E496D63e1", + "transactionIndex": 4, + "gasUsed": "1087125", + "logsBloom": "0x00000004000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400000000000000000800000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000020000000000000000002000000000000000000000000000000000000000000000000", + "blockHash": "0x15b44eff44d1beba36b0d513c8a0a4fb45885c204062c8404c038a1fbee26bbd", + "transactionHash": "0xa94c298678152561134052bb6947a1c0c8005c7d2e81decc376d9afcd3cb2394", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 19558037, + "transactionHash": "0xa94c298678152561134052bb6947a1c0c8005c7d2e81decc376d9afcd3cb2394", + "address": "0x056513af3bE9d3Fb07523846183FB88E496D63e1", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071" + ], + "data": "0x", + "logIndex": 16, + "blockHash": "0x15b44eff44d1beba36b0d513c8a0a4fb45885c204062c8404c038a1fbee26bbd" + } + ], + "blockNumber": 19558037, + "cumulativeGasUsed": "2631453", + "status": 1, + "byzantium": true + }, + "args": [ + "Enchantress' Tear", + "🌺" + ], + "numDeployments": 1, + "solcInputHash": "d25771cc29acf018fbcd36358c01e4b1", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"ERC20 potion token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/PotionToken.sol\":\"PotionToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` 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(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/PotionToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n/**\\n * ERC20 potion token contract\\n */\\ncontract PotionToken is ERC20, AccessControl {\\n bytes32 public constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 0;\\n }\\n\\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \\\"Ownable: new owner already have admin role\\\");\\n\\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n grantRole(MINTER_ROLE, account);\\n }\\n\\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n revokeRole(MINTER_ROLE, account);\\n }\\n\\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\\n _mint(to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9e8c61db2a8cf2d2031d2f166dde3d9f6cf5f0ee101051cae65b0384c2560c0f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620014d2380380620014d28339810160408190526200003491620001d7565b81816003620000448382620002d0565b506004620000538282620002d0565b5062000065915060009050336200006d565b50506200039c565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff166200010e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013a57600080fd5b81516001600160401b038082111562000157576200015762000112565b604051601f8301601f19908116603f0116810190828211818310171562000182576200018262000112565b816040528381526020925086838588010111156200019f57600080fd5b600091505b83821015620001c35785820183015181830184015290820190620001a4565b600093810190920192909252949350505050565b60008060408385031215620001eb57600080fd5b82516001600160401b03808211156200020357600080fd5b620002118683870162000128565b935060208501519150808211156200022857600080fd5b50620002378582860162000128565b9150509250929050565b600181811c908216806200025657607f821691505b6020821081036200027757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cb57600081815260208120601f850160051c81016020861015620002a65750805b601f850160051c820191505b81811015620002c757828155600101620002b2565b5050505b505050565b81516001600160401b03811115620002ec57620002ec62000112565b6200030481620002fd845462000241565b846200027d565b602080601f8311600181146200033c5760008415620003235750858301515b600019600386901b1c1916600185901b178555620002c7565b600085815260208120601f198616915b828110156200036d578886015182559484019460019091019084016200034c565b50858210156200038c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61112680620003ac6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "ERC20 potion token contract", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 404, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 410, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 412, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 414, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 24, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_roles", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoIntelligenceToken.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoIntelligenceToken.json new file mode 100644 index 0000000..1973783 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoIntelligenceToken.json @@ -0,0 +1,799 @@ +{ + "address": "0x5aB50Df3D414bA2b477e771DD99e3177EfCc15af", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x1428f3058dd291afda599276b6c260f4ec1cbd64ee302baf63184cb58a93ee1e", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x5aB50Df3D414bA2b477e771DD99e3177EfCc15af", + "transactionIndex": 2, + "gasUsed": "1087065", + "logsBloom": "0x00000004000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000001000000000000000000000000000202000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000400000000000000100000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1a984475d71ad7b5db672b42841bfde82e992fd1403cba94d0b455bfd7e72167", + "transactionHash": "0x1428f3058dd291afda599276b6c260f4ec1cbd64ee302baf63184cb58a93ee1e", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 19558031, + "transactionHash": "0x1428f3058dd291afda599276b6c260f4ec1cbd64ee302baf63184cb58a93ee1e", + "address": "0x5aB50Df3D414bA2b477e771DD99e3177EfCc15af", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0x1a984475d71ad7b5db672b42841bfde82e992fd1403cba94d0b455bfd7e72167" + } + ], + "blockNumber": 19558031, + "cumulativeGasUsed": "1219174", + "status": 1, + "byzantium": true + }, + "args": [ + "Sage's Sigil", + "🧠" + ], + "numDeployments": 1, + "solcInputHash": "d25771cc29acf018fbcd36358c01e4b1", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"ERC20 potion token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/PotionToken.sol\":\"PotionToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` 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(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/PotionToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n/**\\n * ERC20 potion token contract\\n */\\ncontract PotionToken is ERC20, AccessControl {\\n bytes32 public constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 0;\\n }\\n\\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \\\"Ownable: new owner already have admin role\\\");\\n\\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n grantRole(MINTER_ROLE, account);\\n }\\n\\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n revokeRole(MINTER_ROLE, account);\\n }\\n\\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\\n _mint(to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9e8c61db2a8cf2d2031d2f166dde3d9f6cf5f0ee101051cae65b0384c2560c0f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620014d2380380620014d28339810160408190526200003491620001d7565b81816003620000448382620002d0565b506004620000538282620002d0565b5062000065915060009050336200006d565b50506200039c565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff166200010e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013a57600080fd5b81516001600160401b038082111562000157576200015762000112565b604051601f8301601f19908116603f0116810190828211818310171562000182576200018262000112565b816040528381526020925086838588010111156200019f57600080fd5b600091505b83821015620001c35785820183015181830184015290820190620001a4565b600093810190920192909252949350505050565b60008060408385031215620001eb57600080fd5b82516001600160401b03808211156200020357600080fd5b620002118683870162000128565b935060208501519150808211156200022857600080fd5b50620002378582860162000128565b9150509250929050565b600181811c908216806200025657607f821691505b6020821081036200027757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cb57600081815260208120601f850160051c81016020861015620002a65750805b601f850160051c820191505b81811015620002c757828155600101620002b2565b5050505b505050565b81516001600160401b03811115620002ec57620002ec62000112565b6200030481620002fd845462000241565b846200027d565b602080601f8311600181146200033c5760008415620003235750858301515b600019600386901b1c1916600185901b178555620002c7565b600085815260208120601f198616915b828110156200036d578886015182559484019460019091019084016200034c565b50858210156200038c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61112680620003ac6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "ERC20 potion token contract", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 404, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 410, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 412, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 414, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 24, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_roles", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoJumpToken.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoJumpToken.json new file mode 100644 index 0000000..a08b611 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoJumpToken.json @@ -0,0 +1,799 @@ +{ + "address": "0x6Add5597D6e33e867b6e8080Fb4F5aab7a055FF5", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xf4e990fa8645fa522aa960077e90d59ccf0b6ed7290a2b78af21d94ac0eaeb8f", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x6Add5597D6e33e867b6e8080Fb4F5aab7a055FF5", + "transactionIndex": 1, + "gasUsed": "1087089", + "logsBloom": "0x00000004000000000004000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000020100000000000000000800000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfe2912cec0147ffdb4b9ca1ba1622ca52dcf3db8ddf301dd089304827448cf14", + "transactionHash": "0xf4e990fa8645fa522aa960077e90d59ccf0b6ed7290a2b78af21d94ac0eaeb8f", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 19558021, + "transactionHash": "0xf4e990fa8645fa522aa960077e90d59ccf0b6ed7290a2b78af21d94ac0eaeb8f", + "address": "0x6Add5597D6e33e867b6e8080Fb4F5aab7a055FF5", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xfe2912cec0147ffdb4b9ca1ba1622ca52dcf3db8ddf301dd089304827448cf14" + } + ], + "blockNumber": 19558021, + "cumulativeGasUsed": "1130928", + "status": 1, + "byzantium": true + }, + "args": [ + "Skybound Crest", + "🌌" + ], + "numDeployments": 1, + "solcInputHash": "d25771cc29acf018fbcd36358c01e4b1", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"ERC20 potion token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/PotionToken.sol\":\"PotionToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` 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(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/PotionToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n/**\\n * ERC20 potion token contract\\n */\\ncontract PotionToken is ERC20, AccessControl {\\n bytes32 public constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 0;\\n }\\n\\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \\\"Ownable: new owner already have admin role\\\");\\n\\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n grantRole(MINTER_ROLE, account);\\n }\\n\\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n revokeRole(MINTER_ROLE, account);\\n }\\n\\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\\n _mint(to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9e8c61db2a8cf2d2031d2f166dde3d9f6cf5f0ee101051cae65b0384c2560c0f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620014d2380380620014d28339810160408190526200003491620001d7565b81816003620000448382620002d0565b506004620000538282620002d0565b5062000065915060009050336200006d565b50506200039c565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff166200010e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013a57600080fd5b81516001600160401b038082111562000157576200015762000112565b604051601f8301601f19908116603f0116810190828211818310171562000182576200018262000112565b816040528381526020925086838588010111156200019f57600080fd5b600091505b83821015620001c35785820183015181830184015290820190620001a4565b600093810190920192909252949350505050565b60008060408385031215620001eb57600080fd5b82516001600160401b03808211156200020357600080fd5b620002118683870162000128565b935060208501519150808211156200022857600080fd5b50620002378582860162000128565b9150509250929050565b600181811c908216806200025657607f821691505b6020821081036200027757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cb57600081815260208120601f850160051c81016020861015620002a65750805b601f850160051c820191505b81811015620002c757828155600101620002b2565b5050505b505050565b81516001600160401b03811115620002ec57620002ec62000112565b6200030481620002fd845462000241565b846200027d565b602080601f8311600181146200033c5760008415620003235750858301515b600019600386901b1c1916600185901b178555620002c7565b600085815260208120601f198616915b828110156200036d578886015182559484019460019091019084016200034c565b50858210156200038c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61112680620003ac6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "ERC20 potion token contract", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 404, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 410, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 412, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 414, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 24, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_roles", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoRarityToken.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoRarityToken.json new file mode 100644 index 0000000..3a66abf --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoRarityToken.json @@ -0,0 +1,799 @@ +{ + "address": "0x103386734E9fe26A9bb0F53b20b32cBff50873f4", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xbda9e1027644f31d000b3f8515be3897e8048349f757a55051f92d60c1244d84", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x103386734E9fe26A9bb0F53b20b32cBff50873f4", + "transactionIndex": 3, + "gasUsed": "1087065", + "logsBloom": "0x00000004000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000400000000000000200000000000000000000000000000000000004000000000000000000000800000000000000000000000000000000000000000001000000000000000200000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xde110505368ab644f9bcd76fc75af37b3f6a2ac442a12cab8d0ec28bfbd003cf", + "transactionHash": "0xbda9e1027644f31d000b3f8515be3897e8048349f757a55051f92d60c1244d84", + "logs": [ + { + "transactionIndex": 3, + "blockNumber": 19558015, + "transactionHash": "0xbda9e1027644f31d000b3f8515be3897e8048349f757a55051f92d60c1244d84", + "address": "0x103386734E9fe26A9bb0F53b20b32cBff50873f4", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071" + ], + "data": "0x", + "logIndex": 20, + "blockHash": "0xde110505368ab644f9bcd76fc75af37b3f6a2ac442a12cab8d0ec28bfbd003cf" + } + ], + "blockNumber": 19558015, + "cumulativeGasUsed": "2751406", + "status": 1, + "byzantium": true + }, + "args": [ + "Mystic Relic", + "🔮" + ], + "numDeployments": 1, + "solcInputHash": "d25771cc29acf018fbcd36358c01e4b1", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"ERC20 potion token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/PotionToken.sol\":\"PotionToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` 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(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/PotionToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n/**\\n * ERC20 potion token contract\\n */\\ncontract PotionToken is ERC20, AccessControl {\\n bytes32 public constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 0;\\n }\\n\\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \\\"Ownable: new owner already have admin role\\\");\\n\\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n grantRole(MINTER_ROLE, account);\\n }\\n\\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n revokeRole(MINTER_ROLE, account);\\n }\\n\\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\\n _mint(to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9e8c61db2a8cf2d2031d2f166dde3d9f6cf5f0ee101051cae65b0384c2560c0f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620014d2380380620014d28339810160408190526200003491620001d7565b81816003620000448382620002d0565b506004620000538282620002d0565b5062000065915060009050336200006d565b50506200039c565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff166200010e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013a57600080fd5b81516001600160401b038082111562000157576200015762000112565b604051601f8301601f19908116603f0116810190828211818310171562000182576200018262000112565b816040528381526020925086838588010111156200019f57600080fd5b600091505b83821015620001c35785820183015181830184015290820190620001a4565b600093810190920192909252949350505050565b60008060408385031215620001eb57600080fd5b82516001600160401b03808211156200020357600080fd5b620002118683870162000128565b935060208501519150808211156200022857600080fd5b50620002378582860162000128565b9150509250929050565b600181811c908216806200025657607f821691505b6020821081036200027757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cb57600081815260208120601f850160051c81016020861015620002a65750805b601f850160051c820191505b81811015620002c757828155600101620002b2565b5050505b505050565b81516001600160401b03811115620002ec57620002ec62000112565b6200030481620002fd845462000241565b846200027d565b602080601f8311600181146200033c5760008415620003235750858301515b600019600386901b1c1916600185901b178555620002c7565b600085815260208120601f198616915b828110156200036d578886015182559484019460019091019084016200034c565b50858210156200038c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61112680620003ac6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "ERC20 potion token contract", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 404, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 410, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 412, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 414, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 24, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_roles", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoSpeedToken.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoSpeedToken.json new file mode 100644 index 0000000..971a2e7 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoSpeedToken.json @@ -0,0 +1,799 @@ +{ + "address": "0x7eb2D260A006311Ec0d9f618f3A38946c1bC331a", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeMinterRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x15b55c0a63981fabc9bb88e5fa0162894d3804e35768dd3bf72b4c0bfb74b0cf", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x7eb2D260A006311Ec0d9f618f3A38946c1bC331a", + "transactionIndex": 5, + "gasUsed": "1087065", + "logsBloom": "0x00000004000000000004000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000200000008000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000001000000200000000000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x0e82b4120d5829857b42bd04bddc0cc9adc1ffa92eae921409e5de010c1aa45d", + "transactionHash": "0x15b55c0a63981fabc9bb88e5fa0162894d3804e35768dd3bf72b4c0bfb74b0cf", + "logs": [ + { + "transactionIndex": 5, + "blockNumber": 19558025, + "transactionHash": "0x15b55c0a63981fabc9bb88e5fa0162894d3804e35768dd3bf72b4c0bfb74b0cf", + "address": "0x7eb2D260A006311Ec0d9f618f3A38946c1bC331a", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071", + "0x00000000000000000000000063f9d89d6b95945a329488fd0406c1f1185d0071" + ], + "data": "0x", + "logIndex": 12, + "blockHash": "0x0e82b4120d5829857b42bd04bddc0cc9adc1ffa92eae921409e5de010c1aa45d" + } + ], + "blockNumber": 19558025, + "cumulativeGasUsed": "1883832", + "status": 1, + "byzantium": true + }, + "args": [ + "Zephyr Token", + "🍃" + ], + "numDeployments": 1, + "solcInputHash": "d25771cc29acf018fbcd36358c01e4b1", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"ERC20 potion token contract\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/PotionToken.sol\":\"PotionToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x4ffc0547c02ad22925310c585c0f166f8759e2648a09e9b489100c42f15dd98d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` 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(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/PotionToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n/**\\n * ERC20 potion token contract\\n */\\ncontract PotionToken is ERC20, AccessControl {\\n bytes32 public constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 0;\\n }\\n\\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \\\"Ownable: new owner already have admin role\\\");\\n\\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n }\\n\\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n grantRole(MINTER_ROLE, account);\\n }\\n\\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n revokeRole(MINTER_ROLE, account);\\n }\\n\\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\\n _mint(to, amount);\\n }\\n}\\n\",\"keccak256\":\"0x9e8c61db2a8cf2d2031d2f166dde3d9f6cf5f0ee101051cae65b0384c2560c0f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620014d2380380620014d28339810160408190526200003491620001d7565b81816003620000448382620002d0565b506004620000538282620002d0565b5062000065915060009050336200006d565b50506200039c565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff166200010e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000cd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013a57600080fd5b81516001600160401b038082111562000157576200015762000112565b604051601f8301601f19908116603f0116810190828211818310171562000182576200018262000112565b816040528381526020925086838588010111156200019f57600080fd5b600091505b83821015620001c35785820183015181830184015290820190620001a4565b600093810190920192909252949350505050565b60008060408385031215620001eb57600080fd5b82516001600160401b03808211156200020357600080fd5b620002118683870162000128565b935060208501519150808211156200022857600080fd5b50620002378582860162000128565b9150509250929050565b600181811c908216806200025657607f821691505b6020821081036200027757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002cb57600081815260208120601f850160051c81016020861015620002a65750805b601f850160051c820191505b81811015620002c757828155600101620002b2565b5050505b505050565b81516001600160401b03811115620002ec57620002ec62000112565b6200030481620002fd845462000241565b846200027d565b602080601f8311600181146200033c5760008415620003235750858301515b600019600386901b1c1916600185901b178555620002c7565b600085815260208120601f198616915b828110156200036d578886015182559484019460019091019084016200034c565b50858210156200038c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61112680620003ac6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806340c10f19116100c3578063a457c2d71161007c578063a457c2d7146102b9578063a9059cbb146102cc578063d5391393146102df578063d547741f146102f4578063dd62ed3e14610307578063f2fde38b1461031a57600080fd5b806340c10f191461024757806369e2f0fb1461025a57806370a082311461026d57806391d148541461029657806395d89b41146102a9578063a217fddf146102b157600080fd5b8063248a9ca311610115578063248a9ca3146101c75780632f2ff15d146101ea578063313ce567146101ff57806336568abe1461020e57806339509351146102215780633dd1eb611461023457600080fd5b806301ffc9a71461015257806306fdde031461017a578063095ea7b31461018f57806318160ddd146101a257806323b872dd146101b4575b600080fd5b610165610160366004610e11565b61032d565b60405190151581526020015b60405180910390f35b610182610364565b6040516101719190610e5f565b61016561019d366004610eae565b6103f6565b6002545b604051908152602001610171565b6101656101c2366004610ed8565b61040e565b6101a66101d5366004610f14565b60009081526005602052604090206001015490565b6101fd6101f8366004610f2d565b610432565b005b60405160008152602001610171565b6101fd61021c366004610f2d565b61045c565b61016561022f366004610eae565b6104df565b6101fd610242366004610f59565b610501565b6101fd610255366004610eae565b610524565b6101fd610268366004610f59565b610546565b6101a661027b366004610f59565b6001600160a01b031660009081526020819052604090205490565b6101656102a4366004610f2d565b610569565b610182610594565b6101a6600081565b6101656102c7366004610eae565b6105a3565b6101656102da366004610eae565b61061e565b6101a66000805160206110d183398151915281565b6101fd610302366004610f2d565b61062c565b6101a6610315366004610f74565b610651565b6101fd610328366004610f59565b61067c565b60006001600160e01b03198216637965db0b60e01b148061035e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461037390610f9e565b80601f016020809104026020016040519081016040528092919081815260200182805461039f90610f9e565b80156103ec5780601f106103c1576101008083540402835291602001916103ec565b820191906000526020600020905b8154815290600101906020018083116103cf57829003601f168201915b5050505050905090565b600033610404818585610708565b5060019392505050565b60003361041c85828561082c565b6104278585856108a6565b506001949350505050565b60008281526005602052604090206001015461044d81610a4a565b6104578383610a57565b505050565b6001600160a01b03811633146104d15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104db8282610add565b5050565b6000336104048185856104f28383610651565b6104fc9190610fee565b610708565b600061050c81610a4a565b6104db6000805160206110d183398151915283610432565b6000805160206110d183398151915261053c81610a4a565b6104578383610b44565b600061055181610a4a565b6104db6000805160206110d18339815191528361062c565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606004805461037390610f9e565b600033816105b18286610651565b9050838110156106115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c8565b6104278286868403610708565b6000336104048185856108a6565b60008281526005602052604090206001015461064781610a4a565b6104578383610add565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061068781610a4a565b610692600083610569565b156106f25760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c653a206e6577206f776e657220616c726561647920686176652060448201526961646d696e20726f6c6560b01b60648201526084016104c8565b6106fd600083610432565b6104db60003361045c565b6001600160a01b03831661076a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c8565b6001600160a01b0382166107cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108388484610651565b905060001981146108a057818110156108935760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c8565b6108a08484848403610708565b50505050565b6001600160a01b03831661090a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c8565b6001600160a01b03821661096c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c8565b6001600160a01b038316600090815260208190526040902054818110156109e45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c8565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108a0565b610a548133610c03565b50565b610a618282610569565b6104db5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610ae78282610569565b156104db5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216610b9a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c8565b8060026000828254610bac9190610fee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610c0d8282610569565b6104db57610c1a81610c5c565b610c25836020610c6e565b604051602001610c36929190611001565b60408051601f198184030181529082905262461bcd60e51b82526104c891600401610e5f565b606061035e6001600160a01b03831660145b60606000610c7d836002611076565b610c88906002610fee565b67ffffffffffffffff811115610ca057610ca061108d565b6040519080825280601f01601f191660200182016040528015610cca576020820181803683370190505b509050600360fc1b81600081518110610ce557610ce56110a3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d1457610d146110a3565b60200101906001600160f81b031916908160001a9053506000610d38846002611076565b610d43906001610fee565b90505b6001811115610dbb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610d7757610d776110a3565b1a60f81b828281518110610d8d57610d8d6110a3565b60200101906001600160f81b031916908160001a90535060049490941c93610db4816110b9565b9050610d46565b508315610e0a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104c8565b9392505050565b600060208284031215610e2357600080fd5b81356001600160e01b031981168114610e0a57600080fd5b60005b83811015610e56578181015183820152602001610e3e565b50506000910152565b6020815260008251806020840152610e7e816040850160208701610e3b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610ea957600080fd5b919050565b60008060408385031215610ec157600080fd5b610eca83610e92565b946020939093013593505050565b600080600060608486031215610eed57600080fd5b610ef684610e92565b9250610f0460208501610e92565b9150604084013590509250925092565b600060208284031215610f2657600080fd5b5035919050565b60008060408385031215610f4057600080fd5b82359150610f5060208401610e92565b90509250929050565b600060208284031215610f6b57600080fd5b610e0a82610e92565b60008060408385031215610f8757600080fd5b610f9083610e92565b9150610f5060208401610e92565b600181811c90821680610fb257607f821691505b602082108103610fd257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035e5761035e610fd8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611039816017850160208801610e3b565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161106a816028840160208801610e3b565b01602801949350505050565b808202811582820484141761035e5761035e610fd8565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816110c8576110c8610fd8565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212203190f4e7a90900275357e6a567112eb3475fc10060829ecf4d8ee3f5d463b49364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "ERC20 potion token contract", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 404, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 410, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 412, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 414, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 416, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 24, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "_roles", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/PotionToken.sol:PotionToken", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/FrogCryptoSqueeze.json b/packages/hardhat/deployments/optimismSepolia/FrogCryptoSqueeze.json new file mode 100644 index 0000000..0ab99d6 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/FrogCryptoSqueeze.json @@ -0,0 +1,537 @@ +{ + "address": "0x28596C7884787D914b83d3B541e158bBB1A8B527", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "rarityTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "jumpTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "speedTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "intelligenceTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "beautyTokenAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "frogId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rarityReward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "jumpReward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "speedReward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "intelligenceReward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "beautyReward", + "type": "uint256" + } + ], + "name": "Squeeze", + "type": "event" + }, + { + "inputs": [], + "name": "beautyTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[1]", + "name": "", + "type": "uint256[1]" + } + ], + "name": "hash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "intelligenceTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "jumpTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rarityTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "speedTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[60]", + "name": "_pubSignals", + "type": "uint256[60]" + } + ], + "internalType": "struct FrogCryptoSqueeze.ProofArgs", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "beauty", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "biome", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intelligence", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "jump", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "speed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rarity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "owner", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "temperament", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frogId", + "type": "uint256" + } + ], + "internalType": "struct FrogCryptoSqueeze.FrogAttributes", + "name": "attributes", + "type": "tuple" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "squeezeFrog", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "squeezeTimestamps", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "temperamentTokenContract", + "outputs": [ + { + "internalType": "contract PotionTokenContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[60]", + "name": "_pubSignals", + "type": "uint256[60]" + } + ], + "internalType": "struct FrogCryptoSqueeze.ProofArgs", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "beauty", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "biome", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "intelligence", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "jump", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "speed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rarity", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "owner", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "temperament", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frogId", + "type": "uint256" + } + ], + "internalType": "struct FrogCryptoSqueeze.FrogAttributes", + "name": "attrs", + "type": "tuple" + } + ], + "name": "verifyFrogAttributes", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[60]", + "name": "_pubSignals", + "type": "uint256[60]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xd3d56b5af89a8eba75ea78e414daf3700ea263d3f23715a2e7a38cd1f7055f27", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0x28596C7884787D914b83d3B541e158bBB1A8B527", + "transactionIndex": 2, + "gasUsed": "4813637", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa10973c9d6e578f32d765133a1579dbc9a41f8207cadd254337e1614e24303ee", + "transactionHash": "0xd3d56b5af89a8eba75ea78e414daf3700ea263d3f23715a2e7a38cd1f7055f27", + "logs": [], + "blockNumber": 19593040, + "cumulativeGasUsed": "4945734", + "status": 1, + "byzantium": true + }, + "args": [ + "0x103386734E9fe26A9bb0F53b20b32cBff50873f4", + "0x6Add5597D6e33e867b6e8080Fb4F5aab7a055FF5", + "0x7eb2D260A006311Ec0d9f618f3A38946c1bC331a", + "0x5aB50Df3D414bA2b477e771DD99e3177EfCc15af", + "0x056513af3bE9d3Fb07523846183FB88E496D63e1" + ], + "numDeployments": 2, + "solcInputHash": "a49b46b2dac4fcc95aea528a9c5bd270", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rarityTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"jumpTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"speedTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"intelligenceTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"beautyTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"frogId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rarityReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"jumpReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"speedReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intelligenceReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"beautyReward\",\"type\":\"uint256\"}],\"name\":\"Squeeze\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"beautyTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[1]\",\"name\":\"\",\"type\":\"uint256[1]\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"intelligenceTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"jumpTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rarityTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"speedTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[60]\",\"name\":\"_pubSignals\",\"type\":\"uint256[60]\"}],\"internalType\":\"struct FrogCryptoSqueeze.ProofArgs\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"beauty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"biome\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intelligence\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"jump\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"speed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rarity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"owner\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"temperament\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"frogId\",\"type\":\"uint256\"}],\"internalType\":\"struct FrogCryptoSqueeze.FrogAttributes\",\"name\":\"attributes\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"squeezeFrog\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"squeezeTimestamps\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"temperamentTokenContract\",\"outputs\":[{\"internalType\":\"contract PotionTokenContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[60]\",\"name\":\"_pubSignals\",\"type\":\"uint256[60]\"}],\"internalType\":\"struct FrogCryptoSqueeze.ProofArgs\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"beauty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"biome\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"intelligence\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"jump\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"speed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rarity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"owner\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"temperament\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"frogId\",\"type\":\"uint256\"}],\"internalType\":\"struct FrogCryptoSqueeze.FrogAttributes\",\"name\":\"attrs\",\"type\":\"tuple\"}],\"name\":\"verifyFrogAttributes\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[60]\",\"name\":\"_pubSignals\",\"type\":\"uint256[60]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FrogCryptoSqueeze.sol\":\"FrogCryptoSqueeze\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/FrogCryptoSqueeze.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Poseidon.sol\\\";\\nimport \\\"./Groth16Verifier.sol\\\";\\n\\nabstract contract PotionTokenContract {\\n function mint(address to, uint256 amount) public virtual;\\n}\\n\\ncontract FrogCryptoSqueeze is Groth16Verifier, Poseidon {\\n // The known hash of the FrogCrypto signer\\n uint256 constant FROGCRYPTO_SIGNER_HASH =\\n 320469162396708332516033932244029190181315114284264408621970394677041964715;\\n\\n // Mapping from frogId to squeeze timestamp\\n mapping(uint256 => uint256) public squeezeTimestamps;\\n\\n PotionTokenContract public rarityTokenContract;\\n PotionTokenContract public temperamentTokenContract;\\n PotionTokenContract public jumpTokenContract;\\n PotionTokenContract public speedTokenContract;\\n PotionTokenContract public intelligenceTokenContract;\\n PotionTokenContract public beautyTokenContract;\\n\\n struct ProofArgs {\\n uint256[2] _pA;\\n uint256[2][2] _pB;\\n uint256[2] _pC;\\n uint256[60] _pubSignals;\\n }\\n\\n struct FrogAttributes {\\n uint256 beauty;\\n uint256 biome;\\n uint256 intelligence;\\n uint256 jump;\\n uint256 speed;\\n uint256 rarity;\\n uint256 owner;\\n uint256 temperament;\\n uint256 frogId;\\n }\\n\\n event Squeeze(\\n uint256 indexed frogId,\\n address indexed owner,\\n uint256 rarityReward,\\n uint256 jumpReward,\\n uint256 speedReward,\\n uint256 intelligenceReward,\\n uint256 beautyReward\\n );\\n\\n modifier verifiedProof(ProofArgs calldata proof) {\\n require(this.verifyProof(proof._pA, proof._pB, proof._pC, proof._pubSignals), \\\"Invalid proof\\\");\\n _;\\n }\\n\\n constructor(\\n address rarityTokenAddress,\\n address jumpTokenAddress,\\n address speedTokenAddress,\\n address intelligenceTokenAddress,\\n address beautyTokenAddress\\n ) {\\n rarityTokenContract = PotionTokenContract(rarityTokenAddress);\\n jumpTokenContract = PotionTokenContract(jumpTokenAddress);\\n speedTokenContract = PotionTokenContract(speedTokenAddress);\\n intelligenceTokenContract = PotionTokenContract(intelligenceTokenAddress);\\n beautyTokenContract = PotionTokenContract(beautyTokenAddress);\\n }\\n\\n function squeezeFrog(ProofArgs calldata proof, FrogAttributes calldata attributes, address owner) public {\\n // First verify the proof and attributes\\n require(verifyFrogAttributes(proof, attributes), \\\"Invalid frog attributes\\\");\\n\\n // TODO: change cooldown period\\n require(\\n squeezeTimestamps[attributes.frogId] + 1 minutes < block.timestamp,\\n \\\"Squeeze: Cooldown period is not over yet\\\"\\n );\\n\\n squeezeTimestamps[attributes.frogId] = block.timestamp;\\n\\n bytes32 predictableRandom = keccak256(\\n abi.encodePacked(attributes.frogId, blockhash(block.number - 1), msg.sender, address(this))\\n );\\n\\n uint8 temperamentMultiplier = 1;\\n\\n // cool temperament gets a bonus (we can add another bonus later)\\n if (attributes.temperament == 6) {\\n temperamentMultiplier = 2;\\n }\\n\\n uint256 rarityAmount = ((uint256(uint8(predictableRandom[0])) % 10) + 1) *\\n (attributes.rarity + 1) *\\n temperamentMultiplier;\\n uint256 jumpAmount = ((uint256(uint8(predictableRandom[2])) % 10) + 1) *\\n (attributes.jump + 1) *\\n temperamentMultiplier;\\n uint256 speedAmount = ((uint256(uint8(predictableRandom[3])) % 10) + 1) *\\n (attributes.speed + 1) *\\n temperamentMultiplier;\\n uint256 intelligenceAmount = ((uint256(uint8(predictableRandom[4])) % 10) + 1) *\\n (attributes.intelligence + 1) *\\n temperamentMultiplier;\\n uint256 beautyAmount = ((uint256(uint8(predictableRandom[5])) % 10) + 1) *\\n (attributes.beauty + 1) *\\n temperamentMultiplier;\\n\\n rarityTokenContract.mint(owner, rarityAmount);\\n jumpTokenContract.mint(owner, jumpAmount);\\n speedTokenContract.mint(owner, speedAmount);\\n intelligenceTokenContract.mint(owner, intelligenceAmount);\\n beautyTokenContract.mint(owner, beautyAmount);\\n\\n emit Squeeze(attributes.frogId, owner, rarityAmount, jumpAmount, speedAmount, intelligenceAmount, beautyAmount);\\n }\\n\\n function verifyFrogAttributes(ProofArgs calldata proof, FrogAttributes calldata attrs) public view returns (bool) {\\n uint256[60] memory pubSignals = proof._pubSignals;\\n\\n // Verify FrogCrypto signer\\n require(pubSignals[25] == FROGCRYPTO_SIGNER_HASH, \\\"Invalid signer\\\");\\n\\n uint256[1] memory input;\\n\\n // Verify beauty\\n input[0] = attrs.beauty;\\n require(this.hash(input) == pubSignals[0], \\\"Invalid beauty value\\\");\\n\\n // Verify biome\\n input[0] = attrs.biome;\\n require(this.hash(input) == pubSignals[1], \\\"Invalid biome value\\\");\\n\\n // verify frogId\\n input[0] = attrs.frogId;\\n require(this.hash(input) == pubSignals[3], \\\"Invalid frogId value\\\");\\n\\n // Verify intelligence\\n input[0] = attrs.intelligence;\\n require(this.hash(input) == pubSignals[4], \\\"Invalid intelligence value\\\");\\n\\n // Verify jump\\n input[0] = attrs.jump;\\n require(this.hash(input) == pubSignals[5], \\\"Invalid jump value\\\");\\n\\n // Verify owner\\n input[0] = attrs.owner;\\n require(this.hash(input) == pubSignals[7], \\\"Invalid owner value\\\");\\n\\n // Verify rarity\\n input[0] = attrs.rarity;\\n require(this.hash(input) == pubSignals[8], \\\"Invalid rarity value\\\");\\n\\n // Verify speed\\n input[0] = attrs.speed;\\n require(this.hash(input) == pubSignals[9], \\\"Invalid speed value\\\");\\n\\n input[0] = attrs.temperament;\\n require(this.hash(input) == pubSignals[10], \\\"Invalid speed value\\\");\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xb9c42ac12ef85275ed80fc0407a56a8704b8772ab2052d944765f1e480ea304b\",\"license\":\"MIT\"},\"contracts/Groth16Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n\\t// Scalar field size\\n\\tuint256 constant r =\\n\\t\\t21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\t// Base field size\\n\\tuint256 constant q =\\n\\t\\t21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n\\t// Verification Key data\\n\\tuint256 constant alphax =\\n\\t\\t20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n\\tuint256 constant alphay =\\n\\t\\t9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n\\tuint256 constant betax1 =\\n\\t\\t4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n\\tuint256 constant betax2 =\\n\\t\\t6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n\\tuint256 constant betay1 =\\n\\t\\t21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n\\tuint256 constant betay2 =\\n\\t\\t10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n\\tuint256 constant gammax1 =\\n\\t\\t11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n\\tuint256 constant gammax2 =\\n\\t\\t10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n\\tuint256 constant gammay1 =\\n\\t\\t4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n\\tuint256 constant gammay2 =\\n\\t\\t8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\tuint256 constant deltax1 =\\n\\t\\t20520124732927332327873265850761449286007985884576783646471472851495393940176;\\n\\tuint256 constant deltax2 =\\n\\t\\t15186265480905208282922239900328489292444307478543511518778432579560350684744;\\n\\tuint256 constant deltay1 =\\n\\t\\t16439709157989854781575386903705114956127999812986029888560530272710365313983;\\n\\tuint256 constant deltay2 =\\n\\t\\t4214104585402129979383307131221473200132164352817422962054819905839268800475;\\n\\n\\tuint256 constant IC0x =\\n\\t\\t12277324663121539084679683501505688594366597380533437740994022534746968296925;\\n\\tuint256 constant IC0y =\\n\\t\\t16380671995001451342386700719067227883287820400238358061288182230554025598302;\\n\\n\\tuint256 constant IC1x =\\n\\t\\t5190353014499945678829068468990765742757549186510864889270232008806153087396;\\n\\tuint256 constant IC1y =\\n\\t\\t19834252880244132418620519034879785076508390279933685386298170186441409909168;\\n\\n\\tuint256 constant IC2x =\\n\\t\\t2744387324177524065055432568462502060905874970452855629215133135989691358725;\\n\\tuint256 constant IC2y =\\n\\t\\t19683497734329386289581254469251156544945887989872142897805445597996697171563;\\n\\n\\tuint256 constant IC3x =\\n\\t\\t16364581735408788196876671261794253330229515801819949732471870260428856164875;\\n\\tuint256 constant IC3y =\\n\\t\\t5360020983625766116016458053299551190916514189424402143747655065316573073737;\\n\\n\\tuint256 constant IC4x =\\n\\t\\t12105401442777576022568243830504304724319835802489753305392640672905314429318;\\n\\tuint256 constant IC4y =\\n\\t\\t4533767381643525748539209433291972728869771390681883411971339130788167678191;\\n\\n\\tuint256 constant IC5x =\\n\\t\\t14655105260061026013536435219722244582641001994548095039207403606952986548676;\\n\\tuint256 constant IC5y =\\n\\t\\t6164561044598494876893634560104394990241471992383826621011589810538448632553;\\n\\n\\tuint256 constant IC6x =\\n\\t\\t11422538929165273292646471640436931586150243226165158258377759121207698546693;\\n\\tuint256 constant IC6y =\\n\\t\\t19996118372594129253740080624681752122794924310923896590723668163609020119303;\\n\\n\\tuint256 constant IC7x =\\n\\t\\t1608169220478017683201283029407537404003465420344898051589898653740906874189;\\n\\tuint256 constant IC7y =\\n\\t\\t4598219219881469847753617821782195429646988589418969082785191839339407067731;\\n\\n\\tuint256 constant IC8x =\\n\\t\\t15827337144240104434284958539474213118722302813402254231816052334889847603700;\\n\\tuint256 constant IC8y =\\n\\t\\t4524272288678524202977212434542413854721939205352325806226415649043493656587;\\n\\n\\tuint256 constant IC9x =\\n\\t\\t12903302956025509577349732724608972753848852747646591736799284416811318356691;\\n\\tuint256 constant IC9y =\\n\\t\\t1032653756669871628418431952179410642769924541469386596753111579808738155791;\\n\\n\\tuint256 constant IC10x =\\n\\t\\t5058294297628429474257831813564601282656608632738746636364633118084915796686;\\n\\tuint256 constant IC10y =\\n\\t\\t9916588999043034758140198050858798913696272314277526355595377569882762118395;\\n\\n\\tuint256 constant IC11x =\\n\\t\\t5520950258000124528649959009587322206194309520867900771157489126718260495588;\\n\\tuint256 constant IC11y =\\n\\t\\t13423687093301599638921916315302488464894457098480820589963235628977328873959;\\n\\n\\tuint256 constant IC12x =\\n\\t\\t17372417161020358511851158950579180064435550406197880511786173528653080571324;\\n\\tuint256 constant IC12y =\\n\\t\\t16388281283477736785676413647165899714739561439383723924878531463253258535798;\\n\\n\\tuint256 constant IC13x =\\n\\t\\t11615484768784941273831902304054470951878190970768148868549524618072759518177;\\n\\tuint256 constant IC13y =\\n\\t\\t2454462683711297495640450591326260718272062089549919947762999731787907307322;\\n\\n\\tuint256 constant IC14x =\\n\\t\\t20998123019599417074129870225407389744016263905569276719056003230750882078966;\\n\\tuint256 constant IC14y =\\n\\t\\t2027449160682157357573641319743953001139995224502434755334363787127125692307;\\n\\n\\tuint256 constant IC15x =\\n\\t\\t20975620125341868607446197473110148889440951779129665826706258866979403571951;\\n\\tuint256 constant IC15y =\\n\\t\\t9036700354882894745639015859925148940502671522437251966395307498062201300115;\\n\\n\\tuint256 constant IC16x =\\n\\t\\t8587069003289925272802713047590422438240603180529506394622515428975339586412;\\n\\tuint256 constant IC16y =\\n\\t\\t4378223105097068792530355962047054913632602659154515398746431479792494683307;\\n\\n\\tuint256 constant IC17x =\\n\\t\\t10425351374487491092078025911162404974424865904747299578229309190820507362670;\\n\\tuint256 constant IC17y =\\n\\t\\t7938118020641905969824944125336180473504483041687733798598901735869758550276;\\n\\n\\tuint256 constant IC18x =\\n\\t\\t2731447294069503101366715738330788892158751204559397907475007657161030049358;\\n\\tuint256 constant IC18y =\\n\\t\\t4414384646459616947533237428069749099795594730622459314735543270574401384454;\\n\\n\\tuint256 constant IC19x =\\n\\t\\t12181507654019731410038372938606308249489708161279257326624219579898870156212;\\n\\tuint256 constant IC19y =\\n\\t\\t18689993809764382264456275934137957896993901004031326057532324815067748979258;\\n\\n\\tuint256 constant IC20x =\\n\\t\\t3428093310012627190830381109488448213941407467199041818748319516567565675097;\\n\\tuint256 constant IC20y =\\n\\t\\t9212363656631904394679539472256675043097198441642452923275866620632093584464;\\n\\n\\tuint256 constant IC21x =\\n\\t\\t18167927253289725405435989072528319789610028309675996687776482217930219097324;\\n\\tuint256 constant IC21y =\\n\\t\\t11536766067781669236882843903281104178384579779772177559138730708427497071957;\\n\\n\\tuint256 constant IC22x =\\n\\t\\t20035810338607314323955949585659972285441022575981103656094294313909996656932;\\n\\tuint256 constant IC22y =\\n\\t\\t7997562424985358365305111098343437150762605947716803920426785164718797831565;\\n\\n\\tuint256 constant IC23x =\\n\\t\\t9986712342698702618149186010348406416155846897870904219632010665312730756761;\\n\\tuint256 constant IC23y =\\n\\t\\t20963946329982329161430750799528828110178648939369147690623681890735508473084;\\n\\n\\tuint256 constant IC24x =\\n\\t\\t16940190367628636615510438529595839357899514570779911633108631150606017639658;\\n\\tuint256 constant IC24y =\\n\\t\\t19811948534754191487432847089954280623902539989834110172452145788629097124701;\\n\\n\\tuint256 constant IC25x =\\n\\t\\t1249106085684745092237253910125724951748735669738602119191760896489914096;\\n\\tuint256 constant IC25y =\\n\\t\\t18177408893599232440719388554509588727793527447172049482533937110555460990841;\\n\\n\\tuint256 constant IC26x =\\n\\t\\t10365857423353553736405489148874295650826880157768887040509353531314321583383;\\n\\tuint256 constant IC26y =\\n\\t\\t20770042327207453865166626940058297688611226609377585542598350001082817948397;\\n\\n\\tuint256 constant IC27x =\\n\\t\\t5736063059699666199362675961074050835883052364097807660115972868365507559013;\\n\\tuint256 constant IC27y =\\n\\t\\t13643543907639316479329632939940554017983537889535117817821274723297156403963;\\n\\n\\tuint256 constant IC28x =\\n\\t\\t16025180862200276449259543624981925606735997363919624909545708294152472351636;\\n\\tuint256 constant IC28y =\\n\\t\\t1109552921991830101042328748080272391176315562285922063015521733351877181121;\\n\\n\\tuint256 constant IC29x =\\n\\t\\t17682240688395550617822273512749416227712105463719965283711530657071591873729;\\n\\tuint256 constant IC29y =\\n\\t\\t6868330462624654892085690822602481554757264196866113028269031649330358928973;\\n\\n\\tuint256 constant IC30x =\\n\\t\\t10379314116528041264715120180753972214746348102205434178712478459211919727266;\\n\\tuint256 constant IC30y =\\n\\t\\t2868544592992480669628601978351264912651542308675709135346303285296832312831;\\n\\n\\tuint256 constant IC31x =\\n\\t\\t18301755856663451898705671831143264776087370227626870537209885753154727745135;\\n\\tuint256 constant IC31y =\\n\\t\\t14989566943693248337375345382490657233151030488271584236577019477988984570667;\\n\\n\\tuint256 constant IC32x =\\n\\t\\t2611427460304728674512368081743588702374291565032144045509755125494172829431;\\n\\tuint256 constant IC32y =\\n\\t\\t20284861001848591395643574545845384817851721085403656397055760971158683669531;\\n\\n\\tuint256 constant IC33x =\\n\\t\\t9994381801955638660870716129575806119951239073244977744968125742612770701964;\\n\\tuint256 constant IC33y =\\n\\t\\t6134966411093459650168989683578162450448205314735925390105026767537838520837;\\n\\n\\tuint256 constant IC34x =\\n\\t\\t10989902820069540724912125933733153146671332874535466610661438364982363208949;\\n\\tuint256 constant IC34y =\\n\\t\\t5229068301666861962954921868276695072426995494059989772856487541222100352029;\\n\\n\\tuint256 constant IC35x =\\n\\t\\t2212722254371299303793343402488309920014272130931170869023535773818640929570;\\n\\tuint256 constant IC35y =\\n\\t\\t1060329465445567102816559472001034126110140906554484765351978517718148355198;\\n\\n\\tuint256 constant IC36x =\\n\\t\\t12077706967014624229026277618706342799606244159314183725710551090492280924333;\\n\\tuint256 constant IC36y =\\n\\t\\t13913176388623636150479995111956344908631089983957536990999858794721298540066;\\n\\n\\tuint256 constant IC37x =\\n\\t\\t21703189902951736445560257737292703316136812014860113440756072187434728214251;\\n\\tuint256 constant IC37y =\\n\\t\\t20216804026149183772301756194798673978326145478066942964148185194471427049500;\\n\\n\\tuint256 constant IC38x =\\n\\t\\t10287783606385313753228693957804848457286636182654320335342518112953843818919;\\n\\tuint256 constant IC38y =\\n\\t\\t7911687969516121229905845724698683542246332278360312768599636015608269134617;\\n\\n\\tuint256 constant IC39x =\\n\\t\\t13969567783361525977319027962746248904987928696546960453829160539195495904734;\\n\\tuint256 constant IC39y =\\n\\t\\t8226774691959374867876706802590453926240599737820644781139469760858901082046;\\n\\n\\tuint256 constant IC40x =\\n\\t\\t12697191759416239548120236436310291446114849792335587786166698427319674203204;\\n\\tuint256 constant IC40y =\\n\\t\\t3576868414216527077611133030448465832146556559505043339767774185581059468387;\\n\\n\\tuint256 constant IC41x =\\n\\t\\t3652859335159578832495246405427801782343652027755250621884208881733454256186;\\n\\tuint256 constant IC41y =\\n\\t\\t16152959212357630758336210305169567061764323654844642188021525025790159170529;\\n\\n\\tuint256 constant IC42x =\\n\\t\\t11820498121947253273708623566630026730670651510095012853447505632961521054725;\\n\\tuint256 constant IC42y =\\n\\t\\t8425173595940729385440183444082426527082856656139671103060591152329269303855;\\n\\n\\tuint256 constant IC43x =\\n\\t\\t15208297703573936040995781936495139337521314609783232818533645617542642581767;\\n\\tuint256 constant IC43y =\\n\\t\\t6603929002478023568238603869607485302965102643822082232775178803796403753253;\\n\\n\\tuint256 constant IC44x =\\n\\t\\t16869513925253089884764564886765646809847932834576677567710730324239424030361;\\n\\tuint256 constant IC44y =\\n\\t\\t21221128175458514836954538107809973142440946772066955944605015744978703367122;\\n\\n\\tuint256 constant IC45x =\\n\\t\\t3664632576269586275268899307631410895325605682335945634029613546053691328156;\\n\\tuint256 constant IC45y =\\n\\t\\t7474344736288316274843922281593099876544805654985985724747960087492926404850;\\n\\n\\tuint256 constant IC46x =\\n\\t\\t3773138018575580585374024433281480935981191438163984766886397827178228039569;\\n\\tuint256 constant IC46y =\\n\\t\\t19811742704341863535165372982863825336866524862873986593851936669353129254680;\\n\\n\\tuint256 constant IC47x =\\n\\t\\t4580674780054124441594349666004146388709131468839778278701144566831443831794;\\n\\tuint256 constant IC47y =\\n\\t\\t4384676859140385495483611633082439929576746843130514907256296890842423834381;\\n\\n\\tuint256 constant IC48x =\\n\\t\\t12387974119877388993893752215223895830576785638229571939661240963371031359402;\\n\\tuint256 constant IC48y =\\n\\t\\t21311945906798935664679025953811701388699515681513409771402947009784886654209;\\n\\n\\tuint256 constant IC49x =\\n\\t\\t11211632267490412783876750476130613984493796022328990209630372870314956479826;\\n\\tuint256 constant IC49y =\\n\\t\\t14531740894319885133470510720446922636333004070495706081492802440018383390840;\\n\\n\\tuint256 constant IC50x =\\n\\t\\t6714987073820449065380642291390555300685043249048204084269770268747301787779;\\n\\tuint256 constant IC50y =\\n\\t\\t7763561248050280096095159154676766138428320406645755768068361957974882067115;\\n\\n\\tuint256 constant IC51x =\\n\\t\\t13056055619098914681540454317027488143392462374786003307011705246757544831587;\\n\\tuint256 constant IC51y =\\n\\t\\t18313444934933122830501365064560434636312273939991982798333175598744399972595;\\n\\n\\tuint256 constant IC52x =\\n\\t\\t4344951956234079360961640662614567004666787873907691179692172694665726642169;\\n\\tuint256 constant IC52y =\\n\\t\\t14507578567524397582957955462192850056536719401985418484169419801944018852343;\\n\\n\\tuint256 constant IC53x =\\n\\t\\t855550140188142399858117164334358804746643689273435028084474760058483461635;\\n\\tuint256 constant IC53y =\\n\\t\\t1662209466478449172786812143176226372399042447403840480013431593274668031013;\\n\\n\\tuint256 constant IC54x =\\n\\t\\t5613283962972129075833205387311501596500496040148780687862709110664762261740;\\n\\tuint256 constant IC54y =\\n\\t\\t15966836247521330481117830446609287521890060697578471208739251082743743838618;\\n\\n\\tuint256 constant IC55x =\\n\\t\\t4636150489632987218929183587987436844787933308941066908836421800220544340096;\\n\\tuint256 constant IC55y =\\n\\t\\t10594320900232129426302566663957916877583440535053085183082339191464034594716;\\n\\n\\tuint256 constant IC56x =\\n\\t\\t8474281620870935707379122936790909527334611946198442568724838947244059965057;\\n\\tuint256 constant IC56y =\\n\\t\\t2419538145415989208380804987763450818207947625964229197081105281020432534379;\\n\\n\\tuint256 constant IC57x =\\n\\t\\t11133736744489853771290190634021140521893271092184861404391472237936013099678;\\n\\tuint256 constant IC57y =\\n\\t\\t7516679398736825245452800590216203276994861843912925631440499505593407281942;\\n\\n\\tuint256 constant IC58x =\\n\\t\\t1191157660205228693453984218558421426825701517352034600442070625748571980591;\\n\\tuint256 constant IC58y =\\n\\t\\t20712098598797183834002713723567990918966066051166975287543977089153806042084;\\n\\n\\tuint256 constant IC59x =\\n\\t\\t19882465696230520674715442384672558779086822281593399553240353388492021496542;\\n\\tuint256 constant IC59y =\\n\\t\\t991900654516700352789785899520776173696339481656855012321394622129641703221;\\n\\n\\tuint256 constant IC60x =\\n\\t\\t7086475804411478827870597169229868726186285910024168908879665198904955302786;\\n\\tuint256 constant IC60y =\\n\\t\\t2691192618814776029125685779609142812764332191269301113887218595274094044958;\\n\\n\\t// Memory data\\n\\tuint16 constant pVk = 0;\\n\\tuint16 constant pPairing = 128;\\n\\n\\tuint16 constant pLastMem = 896;\\n\\n\\tfunction verifyProof(\\n\\t\\tuint[2] calldata _pA,\\n\\t\\tuint[2][2] calldata _pB,\\n\\t\\tuint[2] calldata _pC,\\n\\t\\tuint[60] calldata _pubSignals\\n\\t) public view returns (bool) {\\n\\t\\tassembly {\\n\\t\\t\\tfunction checkField(v) {\\n\\t\\t\\t\\tif iszero(lt(v, r)) {\\n\\t\\t\\t\\t\\tmstore(0, 0)\\n\\t\\t\\t\\t\\treturn(0, 0x20)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// G1 function to multiply a G1 value(x,y) to value in an address\\n\\t\\t\\tfunction g1_mulAccC(pR, x, y, s) {\\n\\t\\t\\t\\tlet success\\n\\t\\t\\t\\tlet mIn := mload(0x40)\\n\\t\\t\\t\\tmstore(mIn, x)\\n\\t\\t\\t\\tmstore(add(mIn, 32), y)\\n\\t\\t\\t\\tmstore(add(mIn, 64), s)\\n\\n\\t\\t\\t\\tsuccess := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n\\t\\t\\t\\tif iszero(success) {\\n\\t\\t\\t\\t\\tmstore(0, 0)\\n\\t\\t\\t\\t\\treturn(0, 0x20)\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tmstore(add(mIn, 64), mload(pR))\\n\\t\\t\\t\\tmstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n\\t\\t\\t\\tsuccess := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n\\t\\t\\t\\tif iszero(success) {\\n\\t\\t\\t\\t\\tmstore(0, 0)\\n\\t\\t\\t\\t\\treturn(0, 0x20)\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n\\t\\t\\t\\tlet _pPairing := add(pMem, pPairing)\\n\\t\\t\\t\\tlet _pVk := add(pMem, pVk)\\n\\n\\t\\t\\t\\tmstore(_pVk, IC0x)\\n\\t\\t\\t\\tmstore(add(_pVk, 32), IC0y)\\n\\n\\t\\t\\t\\t// Compute the linear combination vk_x\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n\\n\\t\\t\\t\\tg1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC10x,\\n\\t\\t\\t\\t\\tIC10y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 288))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC11x,\\n\\t\\t\\t\\t\\tIC11y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 320))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC12x,\\n\\t\\t\\t\\t\\tIC12y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 352))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC13x,\\n\\t\\t\\t\\t\\tIC13y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 384))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC14x,\\n\\t\\t\\t\\t\\tIC14y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 416))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC15x,\\n\\t\\t\\t\\t\\tIC15y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 448))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC16x,\\n\\t\\t\\t\\t\\tIC16y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 480))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC17x,\\n\\t\\t\\t\\t\\tIC17y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 512))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC18x,\\n\\t\\t\\t\\t\\tIC18y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 544))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC19x,\\n\\t\\t\\t\\t\\tIC19y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 576))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC20x,\\n\\t\\t\\t\\t\\tIC20y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 608))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC21x,\\n\\t\\t\\t\\t\\tIC21y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 640))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC22x,\\n\\t\\t\\t\\t\\tIC22y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 672))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC23x,\\n\\t\\t\\t\\t\\tIC23y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 704))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC24x,\\n\\t\\t\\t\\t\\tIC24y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 736))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC25x,\\n\\t\\t\\t\\t\\tIC25y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 768))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC26x,\\n\\t\\t\\t\\t\\tIC26y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 800))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC27x,\\n\\t\\t\\t\\t\\tIC27y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 832))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC28x,\\n\\t\\t\\t\\t\\tIC28y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 864))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC29x,\\n\\t\\t\\t\\t\\tIC29y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 896))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC30x,\\n\\t\\t\\t\\t\\tIC30y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 928))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC31x,\\n\\t\\t\\t\\t\\tIC31y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 960))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC32x,\\n\\t\\t\\t\\t\\tIC32y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 992))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC33x,\\n\\t\\t\\t\\t\\tIC33y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1024))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC34x,\\n\\t\\t\\t\\t\\tIC34y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1056))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC35x,\\n\\t\\t\\t\\t\\tIC35y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1088))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC36x,\\n\\t\\t\\t\\t\\tIC36y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1120))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC37x,\\n\\t\\t\\t\\t\\tIC37y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1152))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC38x,\\n\\t\\t\\t\\t\\tIC38y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1184))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC39x,\\n\\t\\t\\t\\t\\tIC39y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1216))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC40x,\\n\\t\\t\\t\\t\\tIC40y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1248))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC41x,\\n\\t\\t\\t\\t\\tIC41y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1280))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC42x,\\n\\t\\t\\t\\t\\tIC42y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1312))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC43x,\\n\\t\\t\\t\\t\\tIC43y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1344))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC44x,\\n\\t\\t\\t\\t\\tIC44y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1376))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC45x,\\n\\t\\t\\t\\t\\tIC45y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1408))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC46x,\\n\\t\\t\\t\\t\\tIC46y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1440))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC47x,\\n\\t\\t\\t\\t\\tIC47y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1472))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC48x,\\n\\t\\t\\t\\t\\tIC48y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1504))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC49x,\\n\\t\\t\\t\\t\\tIC49y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1536))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC50x,\\n\\t\\t\\t\\t\\tIC50y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1568))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC51x,\\n\\t\\t\\t\\t\\tIC51y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1600))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC52x,\\n\\t\\t\\t\\t\\tIC52y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1632))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC53x,\\n\\t\\t\\t\\t\\tIC53y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1664))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC54x,\\n\\t\\t\\t\\t\\tIC54y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1696))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC55x,\\n\\t\\t\\t\\t\\tIC55y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1728))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC56x,\\n\\t\\t\\t\\t\\tIC56y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1760))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC57x,\\n\\t\\t\\t\\t\\tIC57y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1792))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC58x,\\n\\t\\t\\t\\t\\tIC58y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1824))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC59x,\\n\\t\\t\\t\\t\\tIC59y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1856))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tg1_mulAccC(\\n\\t\\t\\t\\t\\t_pVk,\\n\\t\\t\\t\\t\\tIC60x,\\n\\t\\t\\t\\t\\tIC60y,\\n\\t\\t\\t\\t\\tcalldataload(add(pubSignals, 1888))\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\t// -A\\n\\t\\t\\t\\tmstore(_pPairing, calldataload(pA))\\n\\t\\t\\t\\tmstore(\\n\\t\\t\\t\\t\\tadd(_pPairing, 32),\\n\\t\\t\\t\\t\\tmod(sub(q, calldataload(add(pA, 32))), q)\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\t// B\\n\\t\\t\\t\\tmstore(add(_pPairing, 64), calldataload(pB))\\n\\t\\t\\t\\tmstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n\\t\\t\\t\\tmstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n\\t\\t\\t\\tmstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n\\t\\t\\t\\t// alpha1\\n\\t\\t\\t\\tmstore(add(_pPairing, 192), alphax)\\n\\t\\t\\t\\tmstore(add(_pPairing, 224), alphay)\\n\\n\\t\\t\\t\\t// beta2\\n\\t\\t\\t\\tmstore(add(_pPairing, 256), betax1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 288), betax2)\\n\\t\\t\\t\\tmstore(add(_pPairing, 320), betay1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 352), betay2)\\n\\n\\t\\t\\t\\t// vk_x\\n\\t\\t\\t\\tmstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n\\t\\t\\t\\tmstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\t\\t\\t\\t// gamma2\\n\\t\\t\\t\\tmstore(add(_pPairing, 448), gammax1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 480), gammax2)\\n\\t\\t\\t\\tmstore(add(_pPairing, 512), gammay1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 544), gammay2)\\n\\n\\t\\t\\t\\t// C\\n\\t\\t\\t\\tmstore(add(_pPairing, 576), calldataload(pC))\\n\\t\\t\\t\\tmstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n\\t\\t\\t\\t// delta2\\n\\t\\t\\t\\tmstore(add(_pPairing, 640), deltax1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 672), deltax2)\\n\\t\\t\\t\\tmstore(add(_pPairing, 704), deltay1)\\n\\t\\t\\t\\tmstore(add(_pPairing, 736), deltay2)\\n\\n\\t\\t\\t\\tlet success := staticcall(\\n\\t\\t\\t\\t\\tsub(gas(), 2000),\\n\\t\\t\\t\\t\\t8,\\n\\t\\t\\t\\t\\t_pPairing,\\n\\t\\t\\t\\t\\t768,\\n\\t\\t\\t\\t\\t_pPairing,\\n\\t\\t\\t\\t\\t0x20\\n\\t\\t\\t\\t)\\n\\n\\t\\t\\t\\tisOk := and(success, mload(_pPairing))\\n\\t\\t\\t}\\n\\n\\t\\t\\tlet pMem := mload(0x40)\\n\\t\\t\\tmstore(0x40, add(pMem, pLastMem))\\n\\n\\t\\t\\t// Validate that all evaluations \\u2208 F\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 0)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 32)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 64)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 96)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 128)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 160)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 192)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 224)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 256)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 288)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 320)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 352)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 384)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 416)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 448)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 480)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 512)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 544)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 576)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 608)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 640)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 672)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 704)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 736)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 768)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 800)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 832)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 864)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 896)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 928)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 960)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 992)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1024)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1056)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1088)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1120)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1152)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1184)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1216)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1248)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1280)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1312)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1344)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1376)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1408)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1440)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1472)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1504)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1536)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1568)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1600)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1632)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1664)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1696)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1728)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1760)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1792)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1824)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1856)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1888)))\\n\\n\\t\\t\\tcheckField(calldataload(add(_pubSignals, 1920)))\\n\\n\\t\\t\\t// Validate all evaluations\\n\\t\\t\\tlet isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n\\t\\t\\tmstore(0, isValid)\\n\\t\\t\\treturn(0, 0x20)\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0x6064a7414afc77b88ee9fef8a82e8cb064923e4373223a83a26666e5f6ac1407\",\"license\":\"GPL-3.0\"},\"contracts/Poseidon.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\ncontract Poseidon {\\n\\tuint constant M00 =\\n\\t\\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\\n\\tuint constant M01 =\\n\\t\\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\\n\\tuint constant M10 =\\n\\t\\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\\n\\tuint constant M11 =\\n\\t\\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\\n\\n\\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n\\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n\\tfunction hash(uint[1] memory) public pure returns (uint) {\\n\\t\\tassembly {\\n\\t\\t\\tlet\\n\\t\\t\\t\\tF\\n\\t\\t\\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n\\n\\t\\t\\t// load the inputs from memory\\n\\t\\t\\tlet state1 := add(\\n\\t\\t\\t\\tmod(mload(0x80), F),\\n\\t\\t\\t\\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\\n\\t\\t\\t)\\n\\t\\t\\tlet scratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\\n\\t\\t\\t\\tadd(\\n\\t\\t\\t\\t\\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\\n\\t\\t\\t\\t\\tmulmod(state1, M10, F)\\n\\t\\t\\t\\t)\\n\\t\\t\\t)\\n\\t\\t\\tlet scratch1 := add(\\n\\t\\t\\t\\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\\n\\t\\t\\t\\tadd(\\n\\t\\t\\t\\t\\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\\n\\t\\t\\t\\t\\tmulmod(state1, M11, F)\\n\\t\\t\\t\\t)\\n\\t\\t\\t)\\n\\t\\t\\tlet state0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\n\\t\\t\\tmstore(\\n\\t\\t\\t\\t0x0,\\n\\t\\t\\t\\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\\n\\t\\t\\t)\\n\\n\\t\\t\\treturn(0, 0x20)\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xce7d2c35acf209314fe0dc10fdea36174a60e89fec4b1bce6c8a44465b566e8d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162005527380380620055278339810160408190526200003491620000b4565b600180546001600160a01b03199081166001600160a01b0397881617909155600380548216958716959095179094556004805485169386169390931790925560058054841691851691909117905560068054909216921691909117905562000124565b80516001600160a01b0381168114620000af57600080fd5b919050565b600080600080600060a08688031215620000cd57600080fd5b620000d88662000097565b9450620000e86020870162000097565b9350620000f86040870162000097565b9250620001086060870162000097565b9150620001186080870162000097565b90509295509295909350565b6153f380620001346000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806374c77ead1161007157806374c77ead1461015757806383e873731461016a5780639d036e711461017d578063a54a2bcf14610190578063a570f664146101a3578063d6d3f45d146101b657600080fd5b8063120d6837146100ae5780631e43ac54146100e1578063395aa5591461010c5780633c11d911146101215780635efd6ac814610144575b600080fd5b6100ce6100bc3660046150a7565b60006020819052908152604090205481565b6040519081526020015b60405180910390f35b6004546100f4906001600160a01b031681565b6040516001600160a01b0390911681526020016100d8565b61011f61011a3660046150ec565b6101c9565b005b61013461012f366004615144565b6106ee565b60405190151581526020016100d8565b6003546100f4906001600160a01b031681565b6001546100f4906001600160a01b031681565b6002546100f4906001600160a01b031681565b6100ce61018b36600461517b565b610dee565b61013461019e366004615217565b613652565b6005546100f4906001600160a01b031681565b6006546100f4906001600160a01b031681565b6101d383836106ee565b6102245760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066726f67206174747269627574657300000000000000000060448201526064015b60405180910390fd5b610100820135600090815260208190526040902054429061024690603c615293565b106102a45760405162461bcd60e51b815260206004820152602860248201527f53717565657a653a20436f6f6c646f776e20706572696f64206973206e6f74206044820152671bdd995c881e595d60c21b606482015260840161021b565b6101008201356000818152602081905260408120429055906102c76001436152a6565b6040805160208101939093529040908201526bffffffffffffffffffffffff1933606090811b82168184015230901b16607482015260880160408051601f1981840301815291905280516020909101209050600160e084013560060361032b575060025b600060ff821661034060a08701356001615293565b61034f600a600087901a6152b9565b61035a906001615293565b61036491906152db565b61036e91906152db565b9050600060ff831661038560608801356001615293565b610394600a600288901a6152b9565b61039f906001615293565b6103a991906152db565b6103b391906152db565b9050600060ff84166103ca60808901356001615293565b6103d9600a600389901a6152b9565b6103e4906001615293565b6103ee91906152db565b6103f891906152db565b9050600060ff851661040f60408a01356001615293565b61041e600a60048a901a6152b9565b610429906001615293565b61043391906152db565b61043d91906152db565b9050600060ff86166104518a356001615293565b610460600a60058b901a6152b9565b61046b906001615293565b61047591906152db565b61047f91906152db565b6001546040516340c10f1960e01b81526001600160a01b038b81166004830152602482018990529293509116906340c10f1990604401600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b50506003546040516340c10f1960e01b81526001600160a01b038c811660048301526024820189905290911692506340c10f199150604401600060405180830381600087803b15801561053557600080fd5b505af1158015610549573d6000803e3d6000fd5b5050600480546040516340c10f1960e01b81526001600160a01b038d81169382019390935260248101889052911692506340c10f199150604401600060405180830381600087803b15801561059d57600080fd5b505af11580156105b1573d6000803e3d6000fd5b50506005546040516340c10f1960e01b81526001600160a01b038c811660048301526024820187905290911692506340c10f199150604401600060405180830381600087803b15801561060357600080fd5b505af1158015610617573d6000803e3d6000fd5b50506006546040516340c10f1960e01b81526001600160a01b038c811660048301526024820186905290911692506340c10f199150604401600060405180830381600087803b15801561066957600080fd5b505af115801561067d573d6000803e3d6000fd5b5050604080518881526020810188905290810186905260608101859052608081018490526001600160a01b038b1692506101008c013591507f297562f625f4ed410a5279ff709ca679e9c8043ccfcaf569d9419f55e50ad90f9060a00160405180910390a350505050505050505050565b6000808361010001603c806020026040519081016040528092919082603c6020028082843760009201919091525050506103208101519091507eb5610de1f6ffecc890aa0a487b94a60ebc5f3190a6b8df7a773b87059826ab146107855760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015260640161021b565b61078d615089565b833581528151604051639d036e7160e01b81523090639d036e71906107b69085906004016152f2565b602060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190615324565b1461083b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206265617574792076616c756560601b604482015260640161021b565b6020848101358252820151604051639d036e7160e01b81523090639d036e71906108699085906004016152f2565b602060405180830381865afa158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190615324565b146108ed5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642062696f6d652076616c756560681b604482015260640161021b565b61010084013581526060820151604051639d036e7160e01b81523090639d036e719061091d9085906004016152f2565b602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e9190615324565b146109a25760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6749642076616c756560601b604482015260640161021b565b604084810135825260808301519051639d036e7160e01b81523090639d036e71906109d19085906004016152f2565b602060405180830381865afa1580156109ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a129190615324565b14610a5f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e74656c6c6967656e63652076616c7565000000000000604482015260640161021b565b6060840135815260a0820151604051639d036e7160e01b81523090639d036e7190610a8e9085906004016152f2565b602060405180830381865afa158015610aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acf9190615324565b14610b115760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206a756d702076616c756560701b604482015260640161021b565b60c0840135815260e0820151604051639d036e7160e01b81523090639d036e7190610b409085906004016152f2565b602060405180830381865afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190615324565b14610bc45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206f776e65722076616c756560681b604482015260640161021b565b60a08401358152610100820151604051639d036e7160e01b81523090639d036e7190610bf49085906004016152f2565b602060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c359190615324565b14610c795760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207261726974792076616c756560601b604482015260640161021b565b60808401358152610120820151604051639d036e7160e01b81523090639d036e7190610ca99085906004016152f2565b602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190615324565b14610d2d5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642073706565642076616c756560681b604482015260640161021b565b60e08401358152610140820151604051639d036e7160e01b81523090639d036e7190610d5d9085906004016152f2565b602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e9190615324565b14610de15760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642073706565642076616c756560681b604482015260640161021b565b6001925050505b92915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81816080510601818182098282848384090991508260008051602061539e83398151915283097f22e11e8111ef1eba040287dd10347f960e4597f732d1241130896303e21e33250190508260008051602061535e83398151915283097f4856ffdbb010431fd76f0727ff753e0ef564aa60b95bf22d457f1986b12d1d7901838280098483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e030190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d30193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d00192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e210191508483840990508483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b90190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f10193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b910192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b050191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b560190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd90193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f20430192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c90191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc90190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b80190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f5820191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc70190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f947880191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f430190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc50193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee320192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e7960193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b970520192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b30190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c10193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af400191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b00191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017e2d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c350490193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec10191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba32120192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e9652338727620190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d30193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d10192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c0600193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a70192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a70191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b3760190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd10192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f4290190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da0160190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b0208759540193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f90193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b830192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f840191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef60190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c00193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f890192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c2670191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c5152110190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c81710191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b30192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b6310193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b520191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a60191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce890190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd689073555220193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe73890190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d80193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad20192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c140191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c600190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e5080193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017ed7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d17910192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae565659840190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c610193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c690192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc66290190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d50193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f6460192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd0191508483840990508483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe370190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c0193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d00192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f001915084838409905084838683840909925084828309905084828683840909915050838460008051602061539e83398151915283098560008051602061533e8339815191528509010660005260206000f35b6000614d17565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061368a576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816136c0576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806136f1576000805260206000f35b5050505050565b7f1b24b8318b5bb141500bfa3933cf02683e6bd01af5ee2d655f78891ef9ee0ddd85527f243721bd299b49eb2e872a3456b69d0123fa2a2791292f3a687d3d66628b1d5e60208601526000608086018661379587357f2bd9ca0fc6e3bafdd8e34669a8dbbddc2b68e647a3c3f643bd6dd83e4e7b51b07f0b79a2bd4197c3649fa5b80f937360bac421d72160a89b9e8c94c1ae609c69a48461368d565b6137e560208801357f2b847704a1d58de83bac05005fda7d4cc9964f87fce489ec0ccc51379bd6b66b7f061144a76d5507029e507d1c9610333826c8a7527845ffaaf668f700977b9e058461368d565b61383560408801357f0bd9aa1400b668b37b128e34cd958522c3b5dcda843b44d480ce087c693051497f242e06684398fc76d2db85f9e78733c337593a4abda7e107b60dacb1a389020b8461368d565b61388560608801357f0a06057a93e980a0dfa42612caece3fcc59c2ceb8da6984496e0e6b2ff4df8ef7f1ac36a16e1834c4beb26caaf4dc37e9edc1ee62f0185418db682882bb13be9868461368d565b6138d560808801357f0da104956ddb5741d6e81f8d6c4d8b0b265eeeee52892bdaa59a764b1a6f3ae97f20667ee1b226768508272b5dbf1ff48a60df44e2176e773638c04a01c8e019c48461368d565b61392560a08801357f2c3566e4933321990a84f34809019b2b619beeff6bc3a0c35db0845973a8b9077f1940ed8c8677aa1f861a5fc91aa63b1f4a9ee9d49f7dc873a7ff9648abda60058461368d565b61397560c08801357f0a2a7ff6203d40bbeb77b421187c5878c8fc2c35a6be3069010d0778f131ca537f038e3107a3b1daaff3c9eacc32f03543ef6c52abf7c48d1fae4e82a5e7c8854d8461368d565b6139c560e08801357f0a00a5ba016920fb5f19aa992b8837b2bb8b12aebed6347f8ca424eeabb3980b7f22fdf492d81cc24202e468ec16289a86a030b219c4229513b97430c2d5d9c1f48461368d565b613a166101008801357f02487618a85f434d026f992b6a7ebb3e693330fb9a81a6d8e922726b63959d0f7f1c8702bae300bdc3813a3f03a638211dae029c66bb5bc6ad04f434c59ae3aad38461368d565b613a676101208801357f15ec97291744fd34bc9d86f02d5c04dbb08c469c4d46ce27e9f74adaef3804fb7f0b2ee4a3351f08f7aaefd672375186687a2ddea81559d5d77eeddcac49f81ace8461368d565b613ab86101408801357f1dad89a35053a792f9ce212f5569b85c1b2e6fc0495361dafb314b1f8bc5e1e77f0c34bf428bcf6ab1a97a656099f64a9b01664b54e3b60fad1a01d6f78445c4e48461368d565b613b096101608801357f243b70415bd4879f7186e2196eb54c5c2327fdf901cdc15c5f364965831e03767f2668708ddc11a54a33c8c685846de57131d5e2f5e312442c239871d8c7a02dbc8461368d565b613b5a6101808801357f056d2d38d49eba5b188f1d7413ddf28772f7f683e4a74aa7d5a0c3013169973a7f19ae21a379d6a810d64f5a709e3a349d944d82d4be3b4dd704254503f188c3e18461368d565b613bab6101a08801357f047b7edcf8575d66a092739613921db2225ecbe13bf7ec874f8a0abace87cf937f2e6c84369267923cd6c9340a2a505be91c977f17836ae07ac03839562bef20f68461368d565b613bfc6101c08801357f13fa975561ec118309920faae42d9457c10e2ed24b9ef5e848d71ee678ad24937f2e5fc7bfd581a073958c3decf7e6b56cbff7086d35b86d97c642adf84275a2ef8461368d565b613c4d6101e08801357f09adfc88b480029e47b6012d3db0d902d2cf6a7485383c9c826711f0e88fa4ab7f12fc1bdba240e9263d171d5a42d68695b33c7a10b98cc8cb83a401c40f47436c8461368d565b613c9e6102008801357f118cd0c9ded786ab87e7587434e5cfb5078c7b8bcf9594c4e34d22aec587b1047f170c8a2e69cbc6ffc8fcf06ed647eccc3eda0c3464209b2d1ddf279f24db256e8461368d565b613cef6102208801357f09c27402d24c991889b14e91eea2bc8abf03c7d2392f52e3f61b13a00779f0067f0609f1c308cf2b3fa045845ab0d33c412028c6a33cfce67312effbeb579b1e4e8461368d565b613d406102408801357f2952295ff472ef93eae8abafc2234cb4d472a2aeac71edfbcac8a8e1d64f523a7f1aee7d2f263c625503b25e9ed8cc74f645191bee64360ea3f8a8a79c6c78cbb48461368d565b613d916102608801357f145e0357601fab65e2014e83468ad1033c1e8e70ddd76870b46f4d6862426c507f07943b67e802c70508f05ec7b8b180ab6885c70b4b444c96556824be6a0aaa598461368d565b613de26102808801357f19819404939a8d8f0eeb7ab786c67d2d589f0e164584dc565fb233c18ba0e5557f282aaeb321a5f8f5a3f4d5ed747a7d184c179a34f2e9f9dd75769bd045888cec8461368d565b613e336102a08801357f11ae75bd5f64389de84946267ce726d1a8f8120611f282da717a6db918853d8d7f2c4bdde56b70b92fa3bcafbba715f24747c2454a619b5ec29aacee05998699248461368d565b613e846102c08801357f2e592c52b2d1d89ab1767cce61982f3e8be4e6489b9a9a07e3db626fdc38c4fc7f161447647782d608195daf6d102c8c28c37427d0779c87301e6981798a7c36998461368d565b613ed56102e08801357f2bcd2a5d9f43d76cc734e796328df5e10538d4ce04791d43c2d7808fb7b0135d7f2573ced70de2a3a3298de8e2f3eac9662bcf81f071a96f5cd968607c564434ea8461368d565b613f246103008801357f28300c80b78c55978e5d2011b1f7196f0e708f6ddadbd9eb18da41c1eaf977797db4fbeb75508cb98b7135658d16bb426b5229892b9a1d821a69bf72d37ef08461368d565b613f756103208801357f2deb6d67804c00c92c3949b62432535f742a8e8ed22e1e1e5c3281b48fb5aaed7f16eade0d1e573d5cf712d70075c204bbfbf5d1e8eabb4ab14432dcb428f16d178461368d565b613fc66103408801357f1e29f8e1cb3cccd09c24d9f5074d1930a1fa872d60025a566233c54b17dc12fb7f0cae7f23d15412e4811b8221015bb1f708d9675134bb03569a00566b50b6fe658461368d565b6140176103608801357f0273fc153a4777074e4d938655fd90420e0f381100d7ef0ba658e7a35c58fec17f236dee5233137e60d3e5bf9aa08e813c6b1e2b4a19683322f50086be4c9dd3948461368d565b6140686103808801357f0f2f5657f81e3f12b0e3be89d2bce992897233c3cc3e01716f27e9371400464d7f2717cb27317d864dfabcbdd3c69f7afe84b5d955b7f6635333cdcd11c8645cc18461368d565b6140b96103a08801357f065789e87a7e39c62bc62c20359c0417047a3ae77d6b24cd3a4bdfef1fd1f5ff7f16f27bcd9c0355ed38ef4399f7aca3150e8d1c88bc0593c68e45978ad95d1aa28461368d565b61410a6103c08801357f2123cb530970de727edec699e08b202b916f4c02fbbfad59e66b91ad1a41432b7f28766d3deb4dd0de99c990cf6e44cba439703080c19f5d8ad2dad2a3fe7e966f8461368d565b61415b6103e08801357f2cd8d30ff05fd0eece2932906cc861f8792e3d774bbd9c21ff60971eea44541b7f05c603fbfa7604abfb9c2479522475dc92e66fbe4c5a81b3805d11a39cf746f78461368d565b6141ac6104008801357f0d904497767fb1b66ef42ebf38411f67f6004cc0b9e723764d2012e135247a057f16189ea085756aafdd1bb33919c4f54640ae60ada0c8876d2f5611a03b73c28c8461368d565b6141fd6104208801357f0b8f8c3b11aecd8952bfc07dcd5b2d15acafdb4da9065db2a73bbc299286bc1d7f184c10875b4977c7eb2f533c48bf43e363b8f931926187d6f78c307b182ebcf58461368d565b61424e6104408801357f0258200dbff6b22970bd0d7450608ad6ba7109230a72e1a279fdbebbdee4947e7f04e45b3df4eeda4d3ee69bcf882a3fa09e369d54e0c91e7d3a1f8004ed2813228461368d565b61429f6104608801357f1ec2942a5ce1a352cfbb4856a6eac7e07c49136e23e065abc3f77022fff6e6227f1ab3bd69aeb8f3e2b418ccb8fd878cef18ddad6a1ef666c452d7617c28f7e8ad8461368d565b6142f06104808801357f2cb24e3a690c8d1f710fe8889ea4f16b1485c45bfc512f27355003e2d216881c7f2ffb91f6c6917887a04f4f578fe007a09897745cb4a9c91b83cb973ecb88ceeb8461368d565b6143416104a08801357f117ddb50c9da65b8375e04db382077ea9bf7ec523db6978d5c7271c7f5785b197f16beadde4c26182d5f05ae4251f3295d79a47b6e8353e7e067e0234fea5ba1a78461368d565b6143926104c08801357f12303080e09a39c45186fdfef5ebaca36d58f86965d6c6aeed35b7df999a6fbe7f1ee27ec371e496008287bbfe46799f6484c4a5da9ad910b357aa2944c80375de8461368d565b6143e36104e08801357f07e86f8f38dc88419854b437107038a39108d379a11e54c3d6209260eac36c637f1c125b19b470a0dea7d32e0b62568ab4ff570ac82eca2077e00f738a37b3ec448461368d565b6144346105008801357f23b6403c9f6fcd06ddbcbbfdc83b71c9ff212e049133939b7c8f2941030f2be17f081371f322bd272ee1deffaa298876830f1409ecb176c0b209a76c7bb40bd83a8461368d565b6144856105208801357f12a07ab13a0ab940a72fa4c7ee8194c5856af0a29b63f5ac878570e0170dda2f7f1a222a3361939d01168db0bb288bf5cbe5a3a536b70183bd76a0f03718ecf4058461368d565b6144d66105408801357f0e99b0fcbf37cf058dea3b1e0b5b3377e9f049de2e0c54f7ca1d09a5c3df11257f219f9769d5f83017ca93fb31019261e6050743b295f9728b1974b042a06cc1078461368d565b6145276105608801357f2eeabb9f8784b34914257ad54f9bfd6d5c94782ec624d597534d7e3976f03bd27f254bce781b476da57e9475e9b34beb9d23c27782149e6a891ac550fa567206998461368d565b6145786105808801357f10865446ae96bfd8169f8b326b1606e7cacc51416b1aa263c1a943da9f7878f27f081a1bc8eb493f19f701351f5978c18ab715870cd57beecbae65f1a94f31469c8461368d565b6145c96105a08801357f2bcd0c8af2a3fee4f6bcf65d2465c9ba63bc32197439d753e8a164ab454f9f187f0857853b757c7f6d7ab0a1cb88817969e6754c3b214c92b743508ec57f1f3f918461368d565b61461a6105c08801357f09b1a39fbf3b9a6a07d31f65a6e409e22d426204b8759dc803ca7c68e69d370d7f0a2091eeaf4c1c2380fae7b0f9d38b2a4e63e5d06f178ed9ce935b082b176bf28461368d565b61466b6105e08801357f2f1e224867fa4007687bef4c50942c5d930dfc028bcd2eaf5a70bf117ae4f5017f1b63584a0003ce39cae25dd8eea87c9374d3168aac3cc61c2a5fec86b3486faa8461368d565b6146bc6106008801357f2020ac830dd7b196529f0bf2586cb3fd05be5c3b7e5fba11a3fc40f3381cc8787f18c98f19a8807355e890f241e2e5e258f17445349ad3297f33ff84437cfcdd528461368d565b61470d6106208801357f112a051b53378896c0cabf7986887d313af2869f44221067f683a838760722ab7f0ed88c498f5d09ac0f2a89fbc5314f5ac6d28b5d53da2014ba049f2a351618838461368d565b61475e6106408801357f287d0ae1ede62c8ee95efe3ae5be9d655877075ae7666721f93dbd4dd0cb08f37f1cdd77320f8fc74e6172ed0b65de66f582e85d2710333b46bffe2c415ca0aa638461368d565b6147af6106608801357f2012ff9c8adc5e52000ecf115cf8838921a1def8abccf37cc28cf73506c719f77f099b27d9347e050f4434f5b2d1728b593e49dbda97b1aa688d367e431c6dc7f98461368d565b6148006106808801357f03acc6f7c496e0a62c2b34dcc193e5f8bd5f1c1270555a5e8031f9201c1d1c257f01e439666c0d012bf3774ce87c427474db0742ac3c3b6464fa2b614980c34e038461368d565b6148516106a08801357f234ce8b829cabe28bc5d824a2db3d22ba5bc77d0cff073304a698fc534c0f99a7f0c6901920296c1732a938fd2a349760f14efa712cc7596fc36a683c93db080ec8461368d565b6148a26106c08801357f176c2c5274791e95d0d8e11d8e2935601f505f1c4d64dfc9c99c9202e4086f9c7f0a3ff7db1dd8f5369fd193a754db32fb06749ce43fb6ed54eb68202c63ca10808461368d565b6148f36106e08801357f055968f9b53f5f5b77201a38363019e09975621f4f0830fb62041062ed3ccb6b7f12bc45ff1ba08b3abac11afa1dc140faa3ee06a2416621c2934e2f70174cb6818461368d565b6149446107008801357f109e4a2e95dcd069d74d2e24a22aac2391e1f7bc00c5b278db4f8dec3f9c9b167f189d78c020c23110d388abbba1e5c4a3c9d54365c473780dc2d3fea0d4c2429e8461368d565b6149956107208801357f2dcaa1e329bc3a13b2de65a2b0c814cccf7f32fb555f81a0828ca97297fb03e47f02a22bdd325c06dd9588ffab6bf8ccb68c41df7f49171af1e1e43302eb49032f8461368d565b6149e66107408801357f023165581606dd3cabf7560571458b4bbd174f4cd2e744036637dc5f3cb147357f2bf513a8834d5b31431e07cdb396f91c1fe78199811e40f5ba21b0607b06fade8461368d565b614a376107608801357f05f3293a24d82cb4f4ca97d6f74e40f3ce7d8fe37729f6b4d20fc7f27310671e7f0faacd9c677a13a943662ac66673a0b68b9cffaa8b69b90a33d592a77ab2f3828461368d565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2d5dfaa0b8f3e2ecd04bd5076379fb0e131fe9f52fb12bd142e7386f3633d2d06102808201527f21931f25470766f3949906ec0cded90100641df9f78d0431bd2d36d29c7416486102a08201527f24588baf3e47cb366d1305b09e3c640494ccd9419769e9507392770caa287bbf6102c08201527f095119427a6726ba07b15dc6fc1f46b207e1a965667b2858c879f24ffd3aa7db6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052614d2f6000840135613659565b614d3c6020840135613659565b614d496040840135613659565b614d566060840135613659565b614d636080840135613659565b614d7060a0840135613659565b614d7d60c0840135613659565b614d8a60e0840135613659565b614d98610100840135613659565b614da6610120840135613659565b614db4610140840135613659565b614dc2610160840135613659565b614dd0610180840135613659565b614dde6101a0840135613659565b614dec6101c0840135613659565b614dfa6101e0840135613659565b614e08610200840135613659565b614e16610220840135613659565b614e24610240840135613659565b614e32610260840135613659565b614e40610280840135613659565b614e4e6102a0840135613659565b614e5c6102c0840135613659565b614e6a6102e0840135613659565b614e78610300840135613659565b614e86610320840135613659565b614e94610340840135613659565b614ea2610360840135613659565b614eb0610380840135613659565b614ebe6103a0840135613659565b614ecc6103c0840135613659565b614eda6103e0840135613659565b614ee8610400840135613659565b614ef6610420840135613659565b614f04610440840135613659565b614f12610460840135613659565b614f20610480840135613659565b614f2e6104a0840135613659565b614f3c6104c0840135613659565b614f4a6104e0840135613659565b614f58610500840135613659565b614f66610520840135613659565b614f74610540840135613659565b614f82610560840135613659565b614f90610580840135613659565b614f9e6105a0840135613659565b614fac6105c0840135613659565b614fba6105e0840135613659565b614fc8610600840135613659565b614fd6610620840135613659565b614fe4610640840135613659565b614ff2610660840135613659565b615000610680840135613659565b61500e6106a0840135613659565b61501c6106c0840135613659565b61502a6106e0840135613659565b615038610700840135613659565b615046610720840135613659565b615054610740840135613659565b615062610760840135613659565b615070610780840135613659565b61507d818486888a6136f8565b90508060005260206000f35b60405180602001604052806001906020820280368337509192915050565b6000602082840312156150b957600080fd5b5035919050565b600061088082840312156150d357600080fd5b50919050565b600061012082840312156150d357600080fd5b60008060006109c0848603121561510257600080fd5b61510c85856150c0565b925061511c8561088086016150d9565b91506109a08401356001600160a01b038116811461513957600080fd5b809150509250925092565b6000806109a0838503121561515857600080fd5b61516284846150c0565b91506151728461088085016150d9565b90509250929050565b6000602080838503121561518e57600080fd5b83601f84011261519d57600080fd5b60405181810181811067ffffffffffffffff821117156151cd57634e487b7160e01b600052604160045260246000fd5b60405280848301868111156151e157600080fd5b855b818110156151fa57803583529184019184016151e3565b50919695505050505050565b8060408101831015610de857600080fd5b60008060008061088080868803121561522f57600080fd5b6152398787615206565b945060c086018781111561524c57600080fd5b60408701945061525c8882615206565b93505086818701111561526e57600080fd5b50929591945092610100019150565b634e487b7160e01b600052601160045260246000fd5b80820180821115610de857610de861527d565b81810381811115610de857610de861527d565b6000826152d657634e487b7160e01b600052601260045260246000fd5b500690565b8082028115828204841417610de857610de861527d565b602081810190828460005b600181101561531a578151835291830191908301906001016152fd565b5050505092915050565b60006020828403121561533657600080fd5b505191905056fe066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad51274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c80cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff92b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8a26469706673582212208944dc394d8176835965efdf417d7efbca28f918248afa25f519bd37377239a264736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806374c77ead1161007157806374c77ead1461015757806383e873731461016a5780639d036e711461017d578063a54a2bcf14610190578063a570f664146101a3578063d6d3f45d146101b657600080fd5b8063120d6837146100ae5780631e43ac54146100e1578063395aa5591461010c5780633c11d911146101215780635efd6ac814610144575b600080fd5b6100ce6100bc3660046150a7565b60006020819052908152604090205481565b6040519081526020015b60405180910390f35b6004546100f4906001600160a01b031681565b6040516001600160a01b0390911681526020016100d8565b61011f61011a3660046150ec565b6101c9565b005b61013461012f366004615144565b6106ee565b60405190151581526020016100d8565b6003546100f4906001600160a01b031681565b6001546100f4906001600160a01b031681565b6002546100f4906001600160a01b031681565b6100ce61018b36600461517b565b610dee565b61013461019e366004615217565b613652565b6005546100f4906001600160a01b031681565b6006546100f4906001600160a01b031681565b6101d383836106ee565b6102245760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066726f67206174747269627574657300000000000000000060448201526064015b60405180910390fd5b610100820135600090815260208190526040902054429061024690603c615293565b106102a45760405162461bcd60e51b815260206004820152602860248201527f53717565657a653a20436f6f6c646f776e20706572696f64206973206e6f74206044820152671bdd995c881e595d60c21b606482015260840161021b565b6101008201356000818152602081905260408120429055906102c76001436152a6565b6040805160208101939093529040908201526bffffffffffffffffffffffff1933606090811b82168184015230901b16607482015260880160408051601f1981840301815291905280516020909101209050600160e084013560060361032b575060025b600060ff821661034060a08701356001615293565b61034f600a600087901a6152b9565b61035a906001615293565b61036491906152db565b61036e91906152db565b9050600060ff831661038560608801356001615293565b610394600a600288901a6152b9565b61039f906001615293565b6103a991906152db565b6103b391906152db565b9050600060ff84166103ca60808901356001615293565b6103d9600a600389901a6152b9565b6103e4906001615293565b6103ee91906152db565b6103f891906152db565b9050600060ff851661040f60408a01356001615293565b61041e600a60048a901a6152b9565b610429906001615293565b61043391906152db565b61043d91906152db565b9050600060ff86166104518a356001615293565b610460600a60058b901a6152b9565b61046b906001615293565b61047591906152db565b61047f91906152db565b6001546040516340c10f1960e01b81526001600160a01b038b81166004830152602482018990529293509116906340c10f1990604401600060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b50506003546040516340c10f1960e01b81526001600160a01b038c811660048301526024820189905290911692506340c10f199150604401600060405180830381600087803b15801561053557600080fd5b505af1158015610549573d6000803e3d6000fd5b5050600480546040516340c10f1960e01b81526001600160a01b038d81169382019390935260248101889052911692506340c10f199150604401600060405180830381600087803b15801561059d57600080fd5b505af11580156105b1573d6000803e3d6000fd5b50506005546040516340c10f1960e01b81526001600160a01b038c811660048301526024820187905290911692506340c10f199150604401600060405180830381600087803b15801561060357600080fd5b505af1158015610617573d6000803e3d6000fd5b50506006546040516340c10f1960e01b81526001600160a01b038c811660048301526024820186905290911692506340c10f199150604401600060405180830381600087803b15801561066957600080fd5b505af115801561067d573d6000803e3d6000fd5b5050604080518881526020810188905290810186905260608101859052608081018490526001600160a01b038b1692506101008c013591507f297562f625f4ed410a5279ff709ca679e9c8043ccfcaf569d9419f55e50ad90f9060a00160405180910390a350505050505050505050565b6000808361010001603c806020026040519081016040528092919082603c6020028082843760009201919091525050506103208101519091507eb5610de1f6ffecc890aa0a487b94a60ebc5f3190a6b8df7a773b87059826ab146107855760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015260640161021b565b61078d615089565b833581528151604051639d036e7160e01b81523090639d036e71906107b69085906004016152f2565b602060405180830381865afa1580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190615324565b1461083b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206265617574792076616c756560601b604482015260640161021b565b6020848101358252820151604051639d036e7160e01b81523090639d036e71906108699085906004016152f2565b602060405180830381865afa158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190615324565b146108ed5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642062696f6d652076616c756560681b604482015260640161021b565b61010084013581526060820151604051639d036e7160e01b81523090639d036e719061091d9085906004016152f2565b602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e9190615324565b146109a25760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6749642076616c756560601b604482015260640161021b565b604084810135825260808301519051639d036e7160e01b81523090639d036e71906109d19085906004016152f2565b602060405180830381865afa1580156109ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a129190615324565b14610a5f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e74656c6c6967656e63652076616c7565000000000000604482015260640161021b565b6060840135815260a0820151604051639d036e7160e01b81523090639d036e7190610a8e9085906004016152f2565b602060405180830381865afa158015610aab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acf9190615324565b14610b115760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206a756d702076616c756560701b604482015260640161021b565b60c0840135815260e0820151604051639d036e7160e01b81523090639d036e7190610b409085906004016152f2565b602060405180830381865afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190615324565b14610bc45760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206f776e65722076616c756560681b604482015260640161021b565b60a08401358152610100820151604051639d036e7160e01b81523090639d036e7190610bf49085906004016152f2565b602060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c359190615324565b14610c795760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207261726974792076616c756560601b604482015260640161021b565b60808401358152610120820151604051639d036e7160e01b81523090639d036e7190610ca99085906004016152f2565b602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190615324565b14610d2d5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642073706565642076616c756560681b604482015260640161021b565b60e08401358152610140820151604051639d036e7160e01b81523090639d036e7190610d5d9085906004016152f2565b602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e9190615324565b14610de15760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642073706565642076616c756560681b604482015260640161021b565b6001925050505b92915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81816080510601818182098282848384090991508260008051602061539e83398151915283097f22e11e8111ef1eba040287dd10347f960e4597f732d1241130896303e21e33250190508260008051602061535e83398151915283097f4856ffdbb010431fd76f0727ff753e0ef564aa60b95bf22d457f1986b12d1d7901838280098483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e030190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d30193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d00192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e210191508483840990508483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b90190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f10193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b910192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b050191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b560190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd90193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f20430192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c90191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc90190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b80190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f5820191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc70190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f947880191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f430190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc50193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee320192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e7960193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b970520192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b30190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c10193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af400191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b00191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017e2d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c350490193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec10191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba32120192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e9652338727620190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d30193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d10192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c0600193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a70192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a70191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b3760190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd10192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f4290190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c60192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da0160190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b0208759540193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f90193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b830192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f840191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef60190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c00193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f890192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c2670191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c5152110190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c81710191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b30192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b6310193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a90192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b520191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f0190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad0193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a60191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce890190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd689073555220193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c0192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe73890190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d80193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad20192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c140191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c600190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e5080193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017ed7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d17910192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae565659840190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c610193508481820992508481868586090990508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c690192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa0191508483840990508483868384090992508460008051602061539e83398151915283098560008051602061533e8339815191528509017f1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc66290190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d50193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f6460192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd0191508483840990508483868384090992508482830990508482868384090991508460008051602061539e83398151915283098560008051602061533e8339815191528509017f13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe370190508460008051602061535e83398151915283098560008051602061537e8339815191528509017f07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c0193508481820992508481868586090990508484850992508484868586090993508460008051602061539e83398151915285098560008051602061533e8339815191528309017f1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d00192508460008051602061535e83398151915285098560008051602061537e8339815191528309017f269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f001915084838409905084838683840909925084828309905084828683840909915050838460008051602061539e83398151915283098560008051602061533e8339815191528509010660005260206000f35b6000614d17565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061368a576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816136c0576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806136f1576000805260206000f35b5050505050565b7f1b24b8318b5bb141500bfa3933cf02683e6bd01af5ee2d655f78891ef9ee0ddd85527f243721bd299b49eb2e872a3456b69d0123fa2a2791292f3a687d3d66628b1d5e60208601526000608086018661379587357f2bd9ca0fc6e3bafdd8e34669a8dbbddc2b68e647a3c3f643bd6dd83e4e7b51b07f0b79a2bd4197c3649fa5b80f937360bac421d72160a89b9e8c94c1ae609c69a48461368d565b6137e560208801357f2b847704a1d58de83bac05005fda7d4cc9964f87fce489ec0ccc51379bd6b66b7f061144a76d5507029e507d1c9610333826c8a7527845ffaaf668f700977b9e058461368d565b61383560408801357f0bd9aa1400b668b37b128e34cd958522c3b5dcda843b44d480ce087c693051497f242e06684398fc76d2db85f9e78733c337593a4abda7e107b60dacb1a389020b8461368d565b61388560608801357f0a06057a93e980a0dfa42612caece3fcc59c2ceb8da6984496e0e6b2ff4df8ef7f1ac36a16e1834c4beb26caaf4dc37e9edc1ee62f0185418db682882bb13be9868461368d565b6138d560808801357f0da104956ddb5741d6e81f8d6c4d8b0b265eeeee52892bdaa59a764b1a6f3ae97f20667ee1b226768508272b5dbf1ff48a60df44e2176e773638c04a01c8e019c48461368d565b61392560a08801357f2c3566e4933321990a84f34809019b2b619beeff6bc3a0c35db0845973a8b9077f1940ed8c8677aa1f861a5fc91aa63b1f4a9ee9d49f7dc873a7ff9648abda60058461368d565b61397560c08801357f0a2a7ff6203d40bbeb77b421187c5878c8fc2c35a6be3069010d0778f131ca537f038e3107a3b1daaff3c9eacc32f03543ef6c52abf7c48d1fae4e82a5e7c8854d8461368d565b6139c560e08801357f0a00a5ba016920fb5f19aa992b8837b2bb8b12aebed6347f8ca424eeabb3980b7f22fdf492d81cc24202e468ec16289a86a030b219c4229513b97430c2d5d9c1f48461368d565b613a166101008801357f02487618a85f434d026f992b6a7ebb3e693330fb9a81a6d8e922726b63959d0f7f1c8702bae300bdc3813a3f03a638211dae029c66bb5bc6ad04f434c59ae3aad38461368d565b613a676101208801357f15ec97291744fd34bc9d86f02d5c04dbb08c469c4d46ce27e9f74adaef3804fb7f0b2ee4a3351f08f7aaefd672375186687a2ddea81559d5d77eeddcac49f81ace8461368d565b613ab86101408801357f1dad89a35053a792f9ce212f5569b85c1b2e6fc0495361dafb314b1f8bc5e1e77f0c34bf428bcf6ab1a97a656099f64a9b01664b54e3b60fad1a01d6f78445c4e48461368d565b613b096101608801357f243b70415bd4879f7186e2196eb54c5c2327fdf901cdc15c5f364965831e03767f2668708ddc11a54a33c8c685846de57131d5e2f5e312442c239871d8c7a02dbc8461368d565b613b5a6101808801357f056d2d38d49eba5b188f1d7413ddf28772f7f683e4a74aa7d5a0c3013169973a7f19ae21a379d6a810d64f5a709e3a349d944d82d4be3b4dd704254503f188c3e18461368d565b613bab6101a08801357f047b7edcf8575d66a092739613921db2225ecbe13bf7ec874f8a0abace87cf937f2e6c84369267923cd6c9340a2a505be91c977f17836ae07ac03839562bef20f68461368d565b613bfc6101c08801357f13fa975561ec118309920faae42d9457c10e2ed24b9ef5e848d71ee678ad24937f2e5fc7bfd581a073958c3decf7e6b56cbff7086d35b86d97c642adf84275a2ef8461368d565b613c4d6101e08801357f09adfc88b480029e47b6012d3db0d902d2cf6a7485383c9c826711f0e88fa4ab7f12fc1bdba240e9263d171d5a42d68695b33c7a10b98cc8cb83a401c40f47436c8461368d565b613c9e6102008801357f118cd0c9ded786ab87e7587434e5cfb5078c7b8bcf9594c4e34d22aec587b1047f170c8a2e69cbc6ffc8fcf06ed647eccc3eda0c3464209b2d1ddf279f24db256e8461368d565b613cef6102208801357f09c27402d24c991889b14e91eea2bc8abf03c7d2392f52e3f61b13a00779f0067f0609f1c308cf2b3fa045845ab0d33c412028c6a33cfce67312effbeb579b1e4e8461368d565b613d406102408801357f2952295ff472ef93eae8abafc2234cb4d472a2aeac71edfbcac8a8e1d64f523a7f1aee7d2f263c625503b25e9ed8cc74f645191bee64360ea3f8a8a79c6c78cbb48461368d565b613d916102608801357f145e0357601fab65e2014e83468ad1033c1e8e70ddd76870b46f4d6862426c507f07943b67e802c70508f05ec7b8b180ab6885c70b4b444c96556824be6a0aaa598461368d565b613de26102808801357f19819404939a8d8f0eeb7ab786c67d2d589f0e164584dc565fb233c18ba0e5557f282aaeb321a5f8f5a3f4d5ed747a7d184c179a34f2e9f9dd75769bd045888cec8461368d565b613e336102a08801357f11ae75bd5f64389de84946267ce726d1a8f8120611f282da717a6db918853d8d7f2c4bdde56b70b92fa3bcafbba715f24747c2454a619b5ec29aacee05998699248461368d565b613e846102c08801357f2e592c52b2d1d89ab1767cce61982f3e8be4e6489b9a9a07e3db626fdc38c4fc7f161447647782d608195daf6d102c8c28c37427d0779c87301e6981798a7c36998461368d565b613ed56102e08801357f2bcd2a5d9f43d76cc734e796328df5e10538d4ce04791d43c2d7808fb7b0135d7f2573ced70de2a3a3298de8e2f3eac9662bcf81f071a96f5cd968607c564434ea8461368d565b613f246103008801357f28300c80b78c55978e5d2011b1f7196f0e708f6ddadbd9eb18da41c1eaf977797db4fbeb75508cb98b7135658d16bb426b5229892b9a1d821a69bf72d37ef08461368d565b613f756103208801357f2deb6d67804c00c92c3949b62432535f742a8e8ed22e1e1e5c3281b48fb5aaed7f16eade0d1e573d5cf712d70075c204bbfbf5d1e8eabb4ab14432dcb428f16d178461368d565b613fc66103408801357f1e29f8e1cb3cccd09c24d9f5074d1930a1fa872d60025a566233c54b17dc12fb7f0cae7f23d15412e4811b8221015bb1f708d9675134bb03569a00566b50b6fe658461368d565b6140176103608801357f0273fc153a4777074e4d938655fd90420e0f381100d7ef0ba658e7a35c58fec17f236dee5233137e60d3e5bf9aa08e813c6b1e2b4a19683322f50086be4c9dd3948461368d565b6140686103808801357f0f2f5657f81e3f12b0e3be89d2bce992897233c3cc3e01716f27e9371400464d7f2717cb27317d864dfabcbdd3c69f7afe84b5d955b7f6635333cdcd11c8645cc18461368d565b6140b96103a08801357f065789e87a7e39c62bc62c20359c0417047a3ae77d6b24cd3a4bdfef1fd1f5ff7f16f27bcd9c0355ed38ef4399f7aca3150e8d1c88bc0593c68e45978ad95d1aa28461368d565b61410a6103c08801357f2123cb530970de727edec699e08b202b916f4c02fbbfad59e66b91ad1a41432b7f28766d3deb4dd0de99c990cf6e44cba439703080c19f5d8ad2dad2a3fe7e966f8461368d565b61415b6103e08801357f2cd8d30ff05fd0eece2932906cc861f8792e3d774bbd9c21ff60971eea44541b7f05c603fbfa7604abfb9c2479522475dc92e66fbe4c5a81b3805d11a39cf746f78461368d565b6141ac6104008801357f0d904497767fb1b66ef42ebf38411f67f6004cc0b9e723764d2012e135247a057f16189ea085756aafdd1bb33919c4f54640ae60ada0c8876d2f5611a03b73c28c8461368d565b6141fd6104208801357f0b8f8c3b11aecd8952bfc07dcd5b2d15acafdb4da9065db2a73bbc299286bc1d7f184c10875b4977c7eb2f533c48bf43e363b8f931926187d6f78c307b182ebcf58461368d565b61424e6104408801357f0258200dbff6b22970bd0d7450608ad6ba7109230a72e1a279fdbebbdee4947e7f04e45b3df4eeda4d3ee69bcf882a3fa09e369d54e0c91e7d3a1f8004ed2813228461368d565b61429f6104608801357f1ec2942a5ce1a352cfbb4856a6eac7e07c49136e23e065abc3f77022fff6e6227f1ab3bd69aeb8f3e2b418ccb8fd878cef18ddad6a1ef666c452d7617c28f7e8ad8461368d565b6142f06104808801357f2cb24e3a690c8d1f710fe8889ea4f16b1485c45bfc512f27355003e2d216881c7f2ffb91f6c6917887a04f4f578fe007a09897745cb4a9c91b83cb973ecb88ceeb8461368d565b6143416104a08801357f117ddb50c9da65b8375e04db382077ea9bf7ec523db6978d5c7271c7f5785b197f16beadde4c26182d5f05ae4251f3295d79a47b6e8353e7e067e0234fea5ba1a78461368d565b6143926104c08801357f12303080e09a39c45186fdfef5ebaca36d58f86965d6c6aeed35b7df999a6fbe7f1ee27ec371e496008287bbfe46799f6484c4a5da9ad910b357aa2944c80375de8461368d565b6143e36104e08801357f07e86f8f38dc88419854b437107038a39108d379a11e54c3d6209260eac36c637f1c125b19b470a0dea7d32e0b62568ab4ff570ac82eca2077e00f738a37b3ec448461368d565b6144346105008801357f23b6403c9f6fcd06ddbcbbfdc83b71c9ff212e049133939b7c8f2941030f2be17f081371f322bd272ee1deffaa298876830f1409ecb176c0b209a76c7bb40bd83a8461368d565b6144856105208801357f12a07ab13a0ab940a72fa4c7ee8194c5856af0a29b63f5ac878570e0170dda2f7f1a222a3361939d01168db0bb288bf5cbe5a3a536b70183bd76a0f03718ecf4058461368d565b6144d66105408801357f0e99b0fcbf37cf058dea3b1e0b5b3377e9f049de2e0c54f7ca1d09a5c3df11257f219f9769d5f83017ca93fb31019261e6050743b295f9728b1974b042a06cc1078461368d565b6145276105608801357f2eeabb9f8784b34914257ad54f9bfd6d5c94782ec624d597534d7e3976f03bd27f254bce781b476da57e9475e9b34beb9d23c27782149e6a891ac550fa567206998461368d565b6145786105808801357f10865446ae96bfd8169f8b326b1606e7cacc51416b1aa263c1a943da9f7878f27f081a1bc8eb493f19f701351f5978c18ab715870cd57beecbae65f1a94f31469c8461368d565b6145c96105a08801357f2bcd0c8af2a3fee4f6bcf65d2465c9ba63bc32197439d753e8a164ab454f9f187f0857853b757c7f6d7ab0a1cb88817969e6754c3b214c92b743508ec57f1f3f918461368d565b61461a6105c08801357f09b1a39fbf3b9a6a07d31f65a6e409e22d426204b8759dc803ca7c68e69d370d7f0a2091eeaf4c1c2380fae7b0f9d38b2a4e63e5d06f178ed9ce935b082b176bf28461368d565b61466b6105e08801357f2f1e224867fa4007687bef4c50942c5d930dfc028bcd2eaf5a70bf117ae4f5017f1b63584a0003ce39cae25dd8eea87c9374d3168aac3cc61c2a5fec86b3486faa8461368d565b6146bc6106008801357f2020ac830dd7b196529f0bf2586cb3fd05be5c3b7e5fba11a3fc40f3381cc8787f18c98f19a8807355e890f241e2e5e258f17445349ad3297f33ff84437cfcdd528461368d565b61470d6106208801357f112a051b53378896c0cabf7986887d313af2869f44221067f683a838760722ab7f0ed88c498f5d09ac0f2a89fbc5314f5ac6d28b5d53da2014ba049f2a351618838461368d565b61475e6106408801357f287d0ae1ede62c8ee95efe3ae5be9d655877075ae7666721f93dbd4dd0cb08f37f1cdd77320f8fc74e6172ed0b65de66f582e85d2710333b46bffe2c415ca0aa638461368d565b6147af6106608801357f2012ff9c8adc5e52000ecf115cf8838921a1def8abccf37cc28cf73506c719f77f099b27d9347e050f4434f5b2d1728b593e49dbda97b1aa688d367e431c6dc7f98461368d565b6148006106808801357f03acc6f7c496e0a62c2b34dcc193e5f8bd5f1c1270555a5e8031f9201c1d1c257f01e439666c0d012bf3774ce87c427474db0742ac3c3b6464fa2b614980c34e038461368d565b6148516106a08801357f234ce8b829cabe28bc5d824a2db3d22ba5bc77d0cff073304a698fc534c0f99a7f0c6901920296c1732a938fd2a349760f14efa712cc7596fc36a683c93db080ec8461368d565b6148a26106c08801357f176c2c5274791e95d0d8e11d8e2935601f505f1c4d64dfc9c99c9202e4086f9c7f0a3ff7db1dd8f5369fd193a754db32fb06749ce43fb6ed54eb68202c63ca10808461368d565b6148f36106e08801357f055968f9b53f5f5b77201a38363019e09975621f4f0830fb62041062ed3ccb6b7f12bc45ff1ba08b3abac11afa1dc140faa3ee06a2416621c2934e2f70174cb6818461368d565b6149446107008801357f109e4a2e95dcd069d74d2e24a22aac2391e1f7bc00c5b278db4f8dec3f9c9b167f189d78c020c23110d388abbba1e5c4a3c9d54365c473780dc2d3fea0d4c2429e8461368d565b6149956107208801357f2dcaa1e329bc3a13b2de65a2b0c814cccf7f32fb555f81a0828ca97297fb03e47f02a22bdd325c06dd9588ffab6bf8ccb68c41df7f49171af1e1e43302eb49032f8461368d565b6149e66107408801357f023165581606dd3cabf7560571458b4bbd174f4cd2e744036637dc5f3cb147357f2bf513a8834d5b31431e07cdb396f91c1fe78199811e40f5ba21b0607b06fade8461368d565b614a376107608801357f05f3293a24d82cb4f4ca97d6f74e40f3ce7d8fe37729f6b4d20fc7f27310671e7f0faacd9c677a13a943662ac66673a0b68b9cffaa8b69b90a33d592a77ab2f3828461368d565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08201527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08201527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008201527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208201527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408201527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2d5dfaa0b8f3e2ecd04bd5076379fb0e131fe9f52fb12bd142e7386f3633d2d06102808201527f21931f25470766f3949906ec0cded90100641df9f78d0431bd2d36d29c7416486102a08201527f24588baf3e47cb366d1305b09e3c640494ccd9419769e9507392770caa287bbf6102c08201527f095119427a6726ba07b15dc6fc1f46b207e1a965667b2858c879f24ffd3aa7db6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052614d2f6000840135613659565b614d3c6020840135613659565b614d496040840135613659565b614d566060840135613659565b614d636080840135613659565b614d7060a0840135613659565b614d7d60c0840135613659565b614d8a60e0840135613659565b614d98610100840135613659565b614da6610120840135613659565b614db4610140840135613659565b614dc2610160840135613659565b614dd0610180840135613659565b614dde6101a0840135613659565b614dec6101c0840135613659565b614dfa6101e0840135613659565b614e08610200840135613659565b614e16610220840135613659565b614e24610240840135613659565b614e32610260840135613659565b614e40610280840135613659565b614e4e6102a0840135613659565b614e5c6102c0840135613659565b614e6a6102e0840135613659565b614e78610300840135613659565b614e86610320840135613659565b614e94610340840135613659565b614ea2610360840135613659565b614eb0610380840135613659565b614ebe6103a0840135613659565b614ecc6103c0840135613659565b614eda6103e0840135613659565b614ee8610400840135613659565b614ef6610420840135613659565b614f04610440840135613659565b614f12610460840135613659565b614f20610480840135613659565b614f2e6104a0840135613659565b614f3c6104c0840135613659565b614f4a6104e0840135613659565b614f58610500840135613659565b614f66610520840135613659565b614f74610540840135613659565b614f82610560840135613659565b614f90610580840135613659565b614f9e6105a0840135613659565b614fac6105c0840135613659565b614fba6105e0840135613659565b614fc8610600840135613659565b614fd6610620840135613659565b614fe4610640840135613659565b614ff2610660840135613659565b615000610680840135613659565b61500e6106a0840135613659565b61501c6106c0840135613659565b61502a6106e0840135613659565b615038610700840135613659565b615046610720840135613659565b615054610740840135613659565b615062610760840135613659565b615070610780840135613659565b61507d818486888a6136f8565b90508060005260206000f35b60405180602001604052806001906020820280368337509192915050565b6000602082840312156150b957600080fd5b5035919050565b600061088082840312156150d357600080fd5b50919050565b600061012082840312156150d357600080fd5b60008060006109c0848603121561510257600080fd5b61510c85856150c0565b925061511c8561088086016150d9565b91506109a08401356001600160a01b038116811461513957600080fd5b809150509250925092565b6000806109a0838503121561515857600080fd5b61516284846150c0565b91506151728461088085016150d9565b90509250929050565b6000602080838503121561518e57600080fd5b83601f84011261519d57600080fd5b60405181810181811067ffffffffffffffff821117156151cd57634e487b7160e01b600052604160045260246000fd5b60405280848301868111156151e157600080fd5b855b818110156151fa57803583529184019184016151e3565b50919695505050505050565b8060408101831015610de857600080fd5b60008060008061088080868803121561522f57600080fd5b6152398787615206565b945060c086018781111561524c57600080fd5b60408701945061525c8882615206565b93505086818701111561526e57600080fd5b50929591945092610100019150565b634e487b7160e01b600052601160045260246000fd5b80820180821115610de857610de861527d565b81810381811115610de857610de861527d565b6000826152d657634e487b7160e01b600052601260045260246000fd5b500690565b8082028115828204841417610de857610de861527d565b602081810190828460005b600181101561531a578151835291830191908301906001016152fd565b5050505092915050565b60006020828403121561533657600080fd5b505191905056fe066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad51274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c80cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff92b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8a26469706673582212208944dc394d8176835965efdf417d7efbca28f918248afa25f519bd37377239a264736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 22, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "squeezeTimestamps", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 25, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "rarityTokenContract", + "offset": 0, + "slot": "1", + "type": "t_contract(PotionTokenContract)11" + }, + { + "astId": 28, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "temperamentTokenContract", + "offset": 0, + "slot": "2", + "type": "t_contract(PotionTokenContract)11" + }, + { + "astId": 31, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "jumpTokenContract", + "offset": 0, + "slot": "3", + "type": "t_contract(PotionTokenContract)11" + }, + { + "astId": 34, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "speedTokenContract", + "offset": 0, + "slot": "4", + "type": "t_contract(PotionTokenContract)11" + }, + { + "astId": 37, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "intelligenceTokenContract", + "offset": 0, + "slot": "5", + "type": "t_contract(PotionTokenContract)11" + }, + { + "astId": 40, + "contract": "contracts/FrogCryptoSqueeze.sol:FrogCryptoSqueeze", + "label": "beautyTokenContract", + "offset": 0, + "slot": "6", + "type": "t_contract(PotionTokenContract)11" + } + ], + "types": { + "t_contract(PotionTokenContract)11": { + "encoding": "inplace", + "label": "contract PotionTokenContract", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/Poseidon.json b/packages/hardhat/deployments/optimismSepolia/Poseidon.json new file mode 100644 index 0000000..5d79e76 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/Poseidon.json @@ -0,0 +1,60 @@ +{ + "address": "0xcA3771b14684CB56Bc422bD13265Ba7233595929", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256[1]", + "name": "", + "type": "uint256[1]" + } + ], + "name": "hash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0x930caa211e8241ae34490e03032c6351cc73c201e28511fbc5716135a2baeb0a", + "receipt": { + "to": null, + "from": "0x63f9d89D6B95945a329488FD0406C1f1185D0071", + "contractAddress": "0xcA3771b14684CB56Bc422bD13265Ba7233595929", + "transactionIndex": 9, + "gasUsed": "2374177", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf0e8440abd325e0280633f0539ff288fd306ace618e6c845af23ab3d734349b4", + "transactionHash": "0x930caa211e8241ae34490e03032c6351cc73c201e28511fbc5716135a2baeb0a", + "logs": [], + "blockNumber": 19558012, + "cumulativeGasUsed": "4714946", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "f11f926ae4f4bca312ca3f2182859797", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[1]\",\"name\":\"\",\"type\":\"uint256[1]\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Poseidon.sol\":\"Poseidon\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Poseidon.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\ncontract Poseidon {\\n\\tuint constant M00 =\\n\\t\\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\\n\\tuint constant M01 =\\n\\t\\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\\n\\tuint constant M10 =\\n\\t\\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\\n\\tuint constant M11 =\\n\\t\\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\\n\\n\\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n\\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n\\tfunction hash(uint[1] memory) public pure returns (uint) {\\n\\t\\tassembly {\\n\\t\\t\\tlet\\n\\t\\t\\t\\tF\\n\\t\\t\\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n\\n\\t\\t\\t// load the inputs from memory\\n\\t\\t\\tlet state1 := add(\\n\\t\\t\\t\\tmod(mload(0x80), F),\\n\\t\\t\\t\\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\\n\\t\\t\\t)\\n\\t\\t\\tlet scratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\\n\\t\\t\\t\\tadd(\\n\\t\\t\\t\\t\\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\\n\\t\\t\\t\\t\\tmulmod(state1, M10, F)\\n\\t\\t\\t\\t)\\n\\t\\t\\t)\\n\\t\\t\\tlet scratch1 := add(\\n\\t\\t\\t\\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\\n\\t\\t\\t\\tadd(\\n\\t\\t\\t\\t\\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\\n\\t\\t\\t\\t\\tmulmod(state1, M11, F)\\n\\t\\t\\t\\t)\\n\\t\\t\\t)\\n\\t\\t\\tlet state0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\t\\t\\tstate0 := add(\\n\\t\\t\\t\\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate1 := add(\\n\\t\\t\\t\\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\\n\\t\\t\\t\\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch0 := mulmod(state0, state0, F)\\n\\t\\t\\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n\\t\\t\\tscratch0 := mulmod(state1, state1, F)\\n\\t\\t\\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n\\t\\t\\tscratch0 := add(\\n\\t\\t\\t\\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\\n\\t\\t\\t\\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\\n\\t\\t\\t)\\n\\t\\t\\tscratch1 := add(\\n\\t\\t\\t\\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\\n\\t\\t\\t\\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\\n\\t\\t\\t)\\n\\t\\t\\tstate0 := mulmod(scratch0, scratch0, F)\\n\\t\\t\\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n\\t\\t\\tstate0 := mulmod(scratch1, scratch1, F)\\n\\t\\t\\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n\\n\\t\\t\\tmstore(\\n\\t\\t\\t\\t0x0,\\n\\t\\t\\t\\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\\n\\t\\t\\t)\\n\\n\\t\\t\\treturn(0, 0x20)\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xce7d2c35acf209314fe0dc10fdea36174a60e89fec4b1bce6c8a44465b566e8d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506129fa806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639d036e7114610030575b600080fd5b61004361003e3660046128b9565b610055565b60405190815260200160405180910390f35b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb8181608051060181818209828284838409099150826000805160206129a583398151915283097f22e11e8111ef1eba040287dd10347f960e4597f732d1241130896303e21e33250190508260008051602061296583398151915283097f4856ffdbb010431fd76f0727ff753e0ef564aa60b95bf22d457f1986b12d1d790183828009848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03019050846000805160206129658339815191528309856000805160206129858339815191528509017f2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0019250846000805160206129658339815191528509856000805160206129858339815191528309017f012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21019150848384099050848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9019050846000805160206129658339815191528309856000805160206129858339815191528509017f179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91019250846000805160206129658339815191528509856000805160206129858339815191528309017f1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56019050846000805160206129658339815191528309856000805160206129858339815191528509017f28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043019250846000805160206129658339815191528509856000805160206129858339815191528309017f2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9019050846000805160206129658339815191528309856000805160206129858339815191528509017f0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9019250846000805160206129658339815191528509856000805160206129858339815191528309017f2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8019050846000805160206129658339815191528309856000805160206129858339815191528509017f02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e019250846000805160206129658339815191528509856000805160206129858339815191528309017f1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7019050846000805160206129658339815191528309856000805160206129858339815191528509017f1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd019250846000805160206129658339815191528509856000805160206129858339815191528309017f2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43019050846000805160206129658339815191528309856000805160206129858339815191528509017f175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f019050846000805160206129658339815191528309856000805160206129858339815191528509017f14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b019050846000805160206129658339815191528309856000805160206129858339815191528509017f057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee019250846000805160206129658339815191528509856000805160206129858339815191528309017f21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3019050846000805160206129658339815191528309856000805160206129858339815191528509017f268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6019250846000805160206129658339815191528509856000805160206129858339815191528309017f04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e019050846000805160206129658339815191528309856000805160206129858339815191528509017f2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9019250846000805160206129658339815191528509856000805160206129858339815191528309017f21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b019050846000805160206129658339815191528309856000805160206129858339815191528509017e2d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6019250846000805160206129658339815191528509856000805160206129858339815191528309017f0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a019050846000805160206129658339815191528309856000805160206129858339815191528509017f1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212019250846000805160206129658339815191528509856000805160206129858339815191528309017f0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762019050846000805160206129658339815191528309856000805160206129858339815191528509017f0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f019050846000805160206129658339815191528309856000805160206129858339815191528509017f23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7019250846000805160206129658339815191528509856000805160206129858339815191528309017f1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376019050846000805160206129658339815191528309856000805160206129858339815191528509017f015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1019250846000805160206129658339815191528509856000805160206129858339815191528309017f0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429019050846000805160206129658339815191528309856000805160206129858339815191528509017f15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6019250846000805160206129658339815191528509856000805160206129858339815191528309017f0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016019050846000805160206129658339815191528309856000805160206129858339815191528509017f044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b019250846000805160206129658339815191528509856000805160206129858339815191528309017f1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da019050846000805160206129658339815191528309856000805160206129858339815191528509017f2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd019250846000805160206129658339815191528509856000805160206129858339815191528309017f2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d019050846000805160206129658339815191528309856000805160206129858339815191528509017f2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83019250846000805160206129658339815191528509856000805160206129858339815191528309017f08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6019050846000805160206129658339815191528309856000805160206129858339815191528509017f041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89019250846000805160206129658339815191528509856000805160206129858339815191528309017f0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211019050846000805160206129658339815191528309856000805160206129858339815191528509017f0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f019250846000805160206129658339815191528509856000805160206129858339815191528309017f24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e019050846000805160206129658339815191528309856000805160206129858339815191528509017f2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3019250846000805160206129658339815191528509856000805160206129858339815191528309017f25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f019050846000805160206129658339815191528309856000805160206129858339815191528509017f22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9019250846000805160206129658339815191528509856000805160206129858339815191528309017f29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f019050846000805160206129658339815191528309856000805160206129858339815191528509017f07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea019250846000805160206129658339815191528509856000805160206129858339815191528309017f01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89019050846000805160206129658339815191528309856000805160206129858339815191528509017f2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c019250846000805160206129658339815191528509856000805160206129858339815191528309017f1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389019050846000805160206129658339815191528309856000805160206129858339815191528509017f1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2019250846000805160206129658339815191528509856000805160206129858339815191528309017f1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60019050846000805160206129658339815191528309856000805160206129858339815191528509017f1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017ed7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791019250846000805160206129658339815191528509856000805160206129858339815191528309017f140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984019050846000805160206129658339815191528309856000805160206129858339815191528509017f0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69019250846000805160206129658339815191528509856000805160206129858339815191528309017f2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629019050846000805160206129658339815191528309856000805160206129858339815191528509017f0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646019250846000805160206129658339815191528509856000805160206129858339815191528309017f1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd019150848384099050848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37019050846000805160206129658339815191528309856000805160206129858339815191528509017f07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0019250846000805160206129658339815191528509856000805160206129858339815191528309017f269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f00191508483840990508483868384090992508482830990508482868384090991505083846000805160206129a58339815191528309856000805160206129458339815191528509010660005260206000f35b600060208083850312156128cc57600080fd5b83601f8401126128db57600080fd5b60405181810181811067ffffffffffffffff8211171561290b57634e487b7160e01b600052604160045260246000fd5b604052808483018681111561291f57600080fd5b855b818110156129385780358352918401918401612921565b5091969550505050505056fe066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad51274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c80cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff92b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8a26469706673582212209c0c8f8c93368576e632f5c86d3c7390f4ca623600a22a1be78bc4f631ff4bd764736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639d036e7114610030575b600080fd5b61004361003e3660046128b9565b610055565b60405190815260200160405180910390f35b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb8181608051060181818209828284838409099150826000805160206129a583398151915283097f22e11e8111ef1eba040287dd10347f960e4597f732d1241130896303e21e33250190508260008051602061296583398151915283097f4856ffdbb010431fd76f0727ff753e0ef564aa60b95bf22d457f1986b12d1d790183828009848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03019050846000805160206129658339815191528309856000805160206129858339815191528509017f2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0019250846000805160206129658339815191528509856000805160206129858339815191528309017f012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21019150848384099050848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9019050846000805160206129658339815191528309856000805160206129858339815191528509017f179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91019250846000805160206129658339815191528509856000805160206129858339815191528309017f1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56019050846000805160206129658339815191528309856000805160206129858339815191528509017f28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043019250846000805160206129658339815191528509856000805160206129858339815191528309017f2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9019050846000805160206129658339815191528309856000805160206129858339815191528509017f0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9019250846000805160206129658339815191528509856000805160206129858339815191528309017f2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8019050846000805160206129658339815191528309856000805160206129858339815191528509017f02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e019250846000805160206129658339815191528509856000805160206129858339815191528309017f1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7019050846000805160206129658339815191528309856000805160206129858339815191528509017f1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd019250846000805160206129658339815191528509856000805160206129858339815191528309017f2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43019050846000805160206129658339815191528309856000805160206129858339815191528509017f175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f019050846000805160206129658339815191528309856000805160206129858339815191528509017f14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b019050846000805160206129658339815191528309856000805160206129858339815191528509017f057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee019250846000805160206129658339815191528509856000805160206129858339815191528309017f21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3019050846000805160206129658339815191528309856000805160206129858339815191528509017f268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6019250846000805160206129658339815191528509856000805160206129858339815191528309017f04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e019050846000805160206129658339815191528309856000805160206129858339815191528509017f2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9019250846000805160206129658339815191528509856000805160206129858339815191528309017f21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b019050846000805160206129658339815191528309856000805160206129858339815191528509017e2d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6019250846000805160206129658339815191528509856000805160206129858339815191528309017f0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a019050846000805160206129658339815191528309856000805160206129858339815191528509017f1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212019250846000805160206129658339815191528509856000805160206129858339815191528309017f0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762019050846000805160206129658339815191528309856000805160206129858339815191528509017f0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1019250846000805160206129658339815191528509856000805160206129858339815191528309017f1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f019050846000805160206129658339815191528309856000805160206129858339815191528509017f23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7019250846000805160206129658339815191528509856000805160206129858339815191528309017f1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376019050846000805160206129658339815191528309856000805160206129858339815191528509017f015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1019250846000805160206129658339815191528509856000805160206129858339815191528309017f0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429019050846000805160206129658339815191528309856000805160206129858339815191528509017f15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6019250846000805160206129658339815191528509856000805160206129858339815191528309017f0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016019050846000805160206129658339815191528309856000805160206129858339815191528509017f044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b019250846000805160206129658339815191528509856000805160206129858339815191528309017f1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da019050846000805160206129658339815191528309856000805160206129858339815191528509017f2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd019250846000805160206129658339815191528509856000805160206129858339815191528309017f2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d019050846000805160206129658339815191528309856000805160206129858339815191528509017f2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83019250846000805160206129658339815191528509856000805160206129858339815191528309017f08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6019050846000805160206129658339815191528309856000805160206129858339815191528509017f041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89019250846000805160206129658339815191528509856000805160206129858339815191528309017f0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211019050846000805160206129658339815191528309856000805160206129858339815191528509017f0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f019250846000805160206129658339815191528509856000805160206129858339815191528309017f24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e019050846000805160206129658339815191528309856000805160206129858339815191528509017f2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3019250846000805160206129658339815191528509856000805160206129858339815191528309017f25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f019050846000805160206129658339815191528309856000805160206129858339815191528509017f22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9019250846000805160206129658339815191528509856000805160206129858339815191528309017f29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f019050846000805160206129658339815191528309856000805160206129858339815191528509017f07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea019250846000805160206129658339815191528509856000805160206129858339815191528309017f01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89019050846000805160206129658339815191528309856000805160206129858339815191528509017f2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c019250846000805160206129658339815191528509856000805160206129858339815191528309017f1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389019050846000805160206129658339815191528309856000805160206129858339815191528509017f1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2019250846000805160206129658339815191528509856000805160206129858339815191528309017f1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60019050846000805160206129658339815191528309856000805160206129858339815191528509017f1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017ed7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791019250846000805160206129658339815191528509856000805160206129858339815191528309017f140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984019050846000805160206129658339815191528309856000805160206129858339815191528509017f0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61019350848182099250848186858609099050846000805160206129a58339815191528509856000805160206129458339815191528309017f1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69019250846000805160206129658339815191528509856000805160206129858339815191528309017f2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa019150848384099050848386838409099250846000805160206129a58339815191528309856000805160206129458339815191528509017f1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629019050846000805160206129658339815191528309856000805160206129858339815191528509017f0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646019250846000805160206129658339815191528509856000805160206129858339815191528309017f1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd019150848384099050848386838409099250848283099050848286838409099150846000805160206129a58339815191528309856000805160206129458339815191528509017f13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37019050846000805160206129658339815191528309856000805160206129858339815191528509017f07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c019350848182099250848186858609099050848485099250848486858609099350846000805160206129a58339815191528509856000805160206129458339815191528309017f1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0019250846000805160206129658339815191528509856000805160206129858339815191528309017f269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f00191508483840990508483868384090992508482830990508482868384090991505083846000805160206129a58339815191528309856000805160206129458339815191528509010660005260206000f35b600060208083850312156128cc57600080fd5b83601f8401126128db57600080fd5b60405181810181811067ffffffffffffffff8211171561290b57634e487b7160e01b600052604160045260246000fd5b604052808483018681111561291f57600080fd5b855b818110156129385780358352918401918401612921565b5091969550505050505056fe066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad51274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c80cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff92b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8a26469706673582212209c0c8f8c93368576e632f5c86d3c7390f4ca623600a22a1be78bc4f631ff4bd764736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/solcInputs/964178e332bfe15e65bd3a294b6e046f.json b/packages/hardhat/deployments/optimismSepolia/solcInputs/964178e332bfe15e65bd3a294b6e046f.json new file mode 100644 index 0000000..2561a8c --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/solcInputs/964178e332bfe15e65bd3a294b6e046f.json @@ -0,0 +1,41 @@ +{ + "language": "Solidity", + "sources": { + "contracts/FrogCryptoSqueeze.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Poseidon.sol\";\nimport \"./Groth16Verifier.sol\";\n\nabstract contract PotionTokenContract {\n function mint(address to, uint256 amount) public virtual;\n}\n\ncontract FrogCryptoSqueeze is Groth16Verifier, Poseidon {\n // The known hash of the FrogCrypto signer\n uint256 constant FROGCRYPTO_SIGNER_HASH =\n 320469162396708332516033932244029190181315114284264408621970394677041964715;\n\n // Mapping from frogId to squeeze timestamp\n mapping(uint256 => uint256) public squeezeTimestamps;\n\n PotionTokenContract public rarityTokenContract;\n PotionTokenContract public temperamentTokenContract;\n PotionTokenContract public jumpTokenContract;\n PotionTokenContract public speedTokenContract;\n PotionTokenContract public intelligenceTokenContract;\n PotionTokenContract public beautyTokenContract;\n\n struct ProofArgs {\n uint256[2] _pA;\n uint256[2][2] _pB;\n uint256[2] _pC;\n uint256[60] _pubSignals;\n }\n\n struct FrogAttributes {\n uint256 beauty;\n uint256 biome;\n uint256 intelligence;\n uint256 jump;\n uint256 speed;\n uint256 rarity;\n uint256 owner;\n uint256 temperament;\n uint256 frogId;\n }\n\n event Squeeze(\n uint256 indexed frogId,\n address indexed owner,\n uint256 rarityReward,\n uint256 jummpReward,\n uint256 speedReward,\n uint256 intelligenceReward,\n uint256 beautyReward\n );\n\n modifier verifiedProof(ProofArgs calldata proof) {\n require(this.verifyProof(proof._pA, proof._pB, proof._pC, proof._pubSignals), \"Invalid proof\");\n _;\n }\n\n constructor(\n address rarityTokenAddress,\n address jumpTokenAddress,\n address speedTokenAddress,\n address intelligenceTokenAddress,\n address beautyTokenAddress\n ) {\n rarityTokenContract = PotionTokenContract(rarityTokenAddress);\n jumpTokenContract = PotionTokenContract(jumpTokenAddress);\n speedTokenContract = PotionTokenContract(speedTokenAddress);\n intelligenceTokenContract = PotionTokenContract(intelligenceTokenAddress);\n beautyTokenContract = PotionTokenContract(beautyTokenAddress);\n }\n\n function squeezeFrog(ProofArgs calldata proof, FrogAttributes calldata attributes, address owner) public {\n // First verify the proof and attributes\n require(verifyFrogAttributes(proof, attributes), \"Invalid frog attributes\");\n\n // TODO: change cooldown period\n require(\n squeezeTimestamps[attributes.frogId] + 1 minutes < block.timestamp,\n \"Squeeze: Cooldown period is not over yet\"\n );\n\n squeezeTimestamps[attributes.frogId] = block.timestamp;\n\n bytes32 predictableRandom = keccak256(\n abi.encodePacked(attributes.frogId, blockhash(block.number - 1), msg.sender, address(this))\n );\n\n uint8 temperamentMultiplier = 1;\n\n // cool temperament gets a bonus (we can add another bonus later)\n if (attributes.temperament == 6) {\n temperamentMultiplier = 2;\n }\n\n uint256 rarityAmount = ((uint256(uint8(predictableRandom[0])) % 10) + 1) *\n (attributes.rarity + 1) *\n temperamentMultiplier;\n uint256 jumpAmount = ((uint256(uint8(predictableRandom[2])) % 10) + 1) *\n (attributes.jump + 1) *\n temperamentMultiplier;\n uint256 speedAmount = ((uint256(uint8(predictableRandom[3])) % 10) + 1) *\n (attributes.speed + 1) *\n temperamentMultiplier;\n uint256 intelligenceAmount = ((uint256(uint8(predictableRandom[4])) % 10) + 1) *\n (attributes.intelligence + 1) *\n temperamentMultiplier;\n uint256 beautyAmount = ((uint256(uint8(predictableRandom[5])) % 10) + 1) *\n (attributes.beauty + 1) *\n temperamentMultiplier;\n\n rarityTokenContract.mint(owner, rarityAmount);\n jumpTokenContract.mint(owner, jumpAmount);\n speedTokenContract.mint(owner, speedAmount);\n intelligenceTokenContract.mint(owner, intelligenceAmount);\n beautyTokenContract.mint(owner, beautyAmount);\n\n emit Squeeze(attributes.frogId, owner, rarityAmount, jumpAmount, speedAmount, intelligenceAmount, beautyAmount);\n }\n\n function verifyFrogAttributes(ProofArgs calldata proof, FrogAttributes calldata attrs) public view returns (bool) {\n uint256[60] memory pubSignals = proof._pubSignals;\n\n // Verify FrogCrypto signer\n require(pubSignals[25] == FROGCRYPTO_SIGNER_HASH, \"Invalid signer\");\n\n uint256[1] memory input;\n\n // Verify beauty\n input[0] = attrs.beauty;\n require(this.hash(input) == pubSignals[0], \"Invalid beauty value\");\n\n // Verify biome\n input[0] = attrs.biome;\n require(this.hash(input) == pubSignals[1], \"Invalid biome value\");\n\n // verify frogId\n input[0] = attrs.frogId;\n require(this.hash(input) == pubSignals[3], \"Invalid frogId value\");\n\n // Verify intelligence\n input[0] = attrs.intelligence;\n require(this.hash(input) == pubSignals[4], \"Invalid intelligence value\");\n\n // Verify jump\n input[0] = attrs.jump;\n require(this.hash(input) == pubSignals[5], \"Invalid jump value\");\n\n // Verify owner\n input[0] = attrs.owner;\n require(this.hash(input) == pubSignals[7], \"Invalid owner value\");\n\n // Verify rarity\n input[0] = attrs.rarity;\n require(this.hash(input) == pubSignals[8], \"Invalid rarity value\");\n\n // Verify speed\n input[0] = attrs.speed;\n require(this.hash(input) == pubSignals[9], \"Invalid speed value\");\n\n input[0] = attrs.temperament;\n require(this.hash(input) == pubSignals[10], \"Invalid speed value\");\n\n return true;\n }\n}\n" + }, + "contracts/Groth16Verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n\t// Scalar field size\n\tuint256 constant r =\n\t\t21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\t// Base field size\n\tuint256 constant q =\n\t\t21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n\t// Verification Key data\n\tuint256 constant alphax =\n\t\t20491192805390485299153009773594534940189261866228447918068658471970481763042;\n\tuint256 constant alphay =\n\t\t9383485363053290200918347156157836566562967994039712273449902621266178545958;\n\tuint256 constant betax1 =\n\t\t4252822878758300859123897981450591353533073413197771768651442665752259397132;\n\tuint256 constant betax2 =\n\t\t6375614351688725206403948262868962793625744043794305715222011528459656738731;\n\tuint256 constant betay1 =\n\t\t21847035105528745403288232691147584728191162732299865338377159692350059136679;\n\tuint256 constant betay2 =\n\t\t10505242626370262277552901082094356697409835680220590971873171140371331206856;\n\tuint256 constant gammax1 =\n\t\t11559732032986387107991004021392285783925812861821192530917403151452391805634;\n\tuint256 constant gammax2 =\n\t\t10857046999023057135944570762232829481370756359578518086990519993285655852781;\n\tuint256 constant gammay1 =\n\t\t4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\tuint256 constant gammay2 =\n\t\t8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\tuint256 constant deltax1 =\n\t\t20520124732927332327873265850761449286007985884576783646471472851495393940176;\n\tuint256 constant deltax2 =\n\t\t15186265480905208282922239900328489292444307478543511518778432579560350684744;\n\tuint256 constant deltay1 =\n\t\t16439709157989854781575386903705114956127999812986029888560530272710365313983;\n\tuint256 constant deltay2 =\n\t\t4214104585402129979383307131221473200132164352817422962054819905839268800475;\n\n\tuint256 constant IC0x =\n\t\t12277324663121539084679683501505688594366597380533437740994022534746968296925;\n\tuint256 constant IC0y =\n\t\t16380671995001451342386700719067227883287820400238358061288182230554025598302;\n\n\tuint256 constant IC1x =\n\t\t5190353014499945678829068468990765742757549186510864889270232008806153087396;\n\tuint256 constant IC1y =\n\t\t19834252880244132418620519034879785076508390279933685386298170186441409909168;\n\n\tuint256 constant IC2x =\n\t\t2744387324177524065055432568462502060905874970452855629215133135989691358725;\n\tuint256 constant IC2y =\n\t\t19683497734329386289581254469251156544945887989872142897805445597996697171563;\n\n\tuint256 constant IC3x =\n\t\t16364581735408788196876671261794253330229515801819949732471870260428856164875;\n\tuint256 constant IC3y =\n\t\t5360020983625766116016458053299551190916514189424402143747655065316573073737;\n\n\tuint256 constant IC4x =\n\t\t12105401442777576022568243830504304724319835802489753305392640672905314429318;\n\tuint256 constant IC4y =\n\t\t4533767381643525748539209433291972728869771390681883411971339130788167678191;\n\n\tuint256 constant IC5x =\n\t\t14655105260061026013536435219722244582641001994548095039207403606952986548676;\n\tuint256 constant IC5y =\n\t\t6164561044598494876893634560104394990241471992383826621011589810538448632553;\n\n\tuint256 constant IC6x =\n\t\t11422538929165273292646471640436931586150243226165158258377759121207698546693;\n\tuint256 constant IC6y =\n\t\t19996118372594129253740080624681752122794924310923896590723668163609020119303;\n\n\tuint256 constant IC7x =\n\t\t1608169220478017683201283029407537404003465420344898051589898653740906874189;\n\tuint256 constant IC7y =\n\t\t4598219219881469847753617821782195429646988589418969082785191839339407067731;\n\n\tuint256 constant IC8x =\n\t\t15827337144240104434284958539474213118722302813402254231816052334889847603700;\n\tuint256 constant IC8y =\n\t\t4524272288678524202977212434542413854721939205352325806226415649043493656587;\n\n\tuint256 constant IC9x =\n\t\t12903302956025509577349732724608972753848852747646591736799284416811318356691;\n\tuint256 constant IC9y =\n\t\t1032653756669871628418431952179410642769924541469386596753111579808738155791;\n\n\tuint256 constant IC10x =\n\t\t5058294297628429474257831813564601282656608632738746636364633118084915796686;\n\tuint256 constant IC10y =\n\t\t9916588999043034758140198050858798913696272314277526355595377569882762118395;\n\n\tuint256 constant IC11x =\n\t\t5520950258000124528649959009587322206194309520867900771157489126718260495588;\n\tuint256 constant IC11y =\n\t\t13423687093301599638921916315302488464894457098480820589963235628977328873959;\n\n\tuint256 constant IC12x =\n\t\t17372417161020358511851158950579180064435550406197880511786173528653080571324;\n\tuint256 constant IC12y =\n\t\t16388281283477736785676413647165899714739561439383723924878531463253258535798;\n\n\tuint256 constant IC13x =\n\t\t11615484768784941273831902304054470951878190970768148868549524618072759518177;\n\tuint256 constant IC13y =\n\t\t2454462683711297495640450591326260718272062089549919947762999731787907307322;\n\n\tuint256 constant IC14x =\n\t\t20998123019599417074129870225407389744016263905569276719056003230750882078966;\n\tuint256 constant IC14y =\n\t\t2027449160682157357573641319743953001139995224502434755334363787127125692307;\n\n\tuint256 constant IC15x =\n\t\t20975620125341868607446197473110148889440951779129665826706258866979403571951;\n\tuint256 constant IC15y =\n\t\t9036700354882894745639015859925148940502671522437251966395307498062201300115;\n\n\tuint256 constant IC16x =\n\t\t8587069003289925272802713047590422438240603180529506394622515428975339586412;\n\tuint256 constant IC16y =\n\t\t4378223105097068792530355962047054913632602659154515398746431479792494683307;\n\n\tuint256 constant IC17x =\n\t\t10425351374487491092078025911162404974424865904747299578229309190820507362670;\n\tuint256 constant IC17y =\n\t\t7938118020641905969824944125336180473504483041687733798598901735869758550276;\n\n\tuint256 constant IC18x =\n\t\t2731447294069503101366715738330788892158751204559397907475007657161030049358;\n\tuint256 constant IC18y =\n\t\t4414384646459616947533237428069749099795594730622459314735543270574401384454;\n\n\tuint256 constant IC19x =\n\t\t12181507654019731410038372938606308249489708161279257326624219579898870156212;\n\tuint256 constant IC19y =\n\t\t18689993809764382264456275934137957896993901004031326057532324815067748979258;\n\n\tuint256 constant IC20x =\n\t\t3428093310012627190830381109488448213941407467199041818748319516567565675097;\n\tuint256 constant IC20y =\n\t\t9212363656631904394679539472256675043097198441642452923275866620632093584464;\n\n\tuint256 constant IC21x =\n\t\t18167927253289725405435989072528319789610028309675996687776482217930219097324;\n\tuint256 constant IC21y =\n\t\t11536766067781669236882843903281104178384579779772177559138730708427497071957;\n\n\tuint256 constant IC22x =\n\t\t20035810338607314323955949585659972285441022575981103656094294313909996656932;\n\tuint256 constant IC22y =\n\t\t7997562424985358365305111098343437150762605947716803920426785164718797831565;\n\n\tuint256 constant IC23x =\n\t\t9986712342698702618149186010348406416155846897870904219632010665312730756761;\n\tuint256 constant IC23y =\n\t\t20963946329982329161430750799528828110178648939369147690623681890735508473084;\n\n\tuint256 constant IC24x =\n\t\t16940190367628636615510438529595839357899514570779911633108631150606017639658;\n\tuint256 constant IC24y =\n\t\t19811948534754191487432847089954280623902539989834110172452145788629097124701;\n\n\tuint256 constant IC25x =\n\t\t1249106085684745092237253910125724951748735669738602119191760896489914096;\n\tuint256 constant IC25y =\n\t\t18177408893599232440719388554509588727793527447172049482533937110555460990841;\n\n\tuint256 constant IC26x =\n\t\t10365857423353553736405489148874295650826880157768887040509353531314321583383;\n\tuint256 constant IC26y =\n\t\t20770042327207453865166626940058297688611226609377585542598350001082817948397;\n\n\tuint256 constant IC27x =\n\t\t5736063059699666199362675961074050835883052364097807660115972868365507559013;\n\tuint256 constant IC27y =\n\t\t13643543907639316479329632939940554017983537889535117817821274723297156403963;\n\n\tuint256 constant IC28x =\n\t\t16025180862200276449259543624981925606735997363919624909545708294152472351636;\n\tuint256 constant IC28y =\n\t\t1109552921991830101042328748080272391176315562285922063015521733351877181121;\n\n\tuint256 constant IC29x =\n\t\t17682240688395550617822273512749416227712105463719965283711530657071591873729;\n\tuint256 constant IC29y =\n\t\t6868330462624654892085690822602481554757264196866113028269031649330358928973;\n\n\tuint256 constant IC30x =\n\t\t10379314116528041264715120180753972214746348102205434178712478459211919727266;\n\tuint256 constant IC30y =\n\t\t2868544592992480669628601978351264912651542308675709135346303285296832312831;\n\n\tuint256 constant IC31x =\n\t\t18301755856663451898705671831143264776087370227626870537209885753154727745135;\n\tuint256 constant IC31y =\n\t\t14989566943693248337375345382490657233151030488271584236577019477988984570667;\n\n\tuint256 constant IC32x =\n\t\t2611427460304728674512368081743588702374291565032144045509755125494172829431;\n\tuint256 constant IC32y =\n\t\t20284861001848591395643574545845384817851721085403656397055760971158683669531;\n\n\tuint256 constant IC33x =\n\t\t9994381801955638660870716129575806119951239073244977744968125742612770701964;\n\tuint256 constant IC33y =\n\t\t6134966411093459650168989683578162450448205314735925390105026767537838520837;\n\n\tuint256 constant IC34x =\n\t\t10989902820069540724912125933733153146671332874535466610661438364982363208949;\n\tuint256 constant IC34y =\n\t\t5229068301666861962954921868276695072426995494059989772856487541222100352029;\n\n\tuint256 constant IC35x =\n\t\t2212722254371299303793343402488309920014272130931170869023535773818640929570;\n\tuint256 constant IC35y =\n\t\t1060329465445567102816559472001034126110140906554484765351978517718148355198;\n\n\tuint256 constant IC36x =\n\t\t12077706967014624229026277618706342799606244159314183725710551090492280924333;\n\tuint256 constant IC36y =\n\t\t13913176388623636150479995111956344908631089983957536990999858794721298540066;\n\n\tuint256 constant IC37x =\n\t\t21703189902951736445560257737292703316136812014860113440756072187434728214251;\n\tuint256 constant IC37y =\n\t\t20216804026149183772301756194798673978326145478066942964148185194471427049500;\n\n\tuint256 constant IC38x =\n\t\t10287783606385313753228693957804848457286636182654320335342518112953843818919;\n\tuint256 constant IC38y =\n\t\t7911687969516121229905845724698683542246332278360312768599636015608269134617;\n\n\tuint256 constant IC39x =\n\t\t13969567783361525977319027962746248904987928696546960453829160539195495904734;\n\tuint256 constant IC39y =\n\t\t8226774691959374867876706802590453926240599737820644781139469760858901082046;\n\n\tuint256 constant IC40x =\n\t\t12697191759416239548120236436310291446114849792335587786166698427319674203204;\n\tuint256 constant IC40y =\n\t\t3576868414216527077611133030448465832146556559505043339767774185581059468387;\n\n\tuint256 constant IC41x =\n\t\t3652859335159578832495246405427801782343652027755250621884208881733454256186;\n\tuint256 constant IC41y =\n\t\t16152959212357630758336210305169567061764323654844642188021525025790159170529;\n\n\tuint256 constant IC42x =\n\t\t11820498121947253273708623566630026730670651510095012853447505632961521054725;\n\tuint256 constant IC42y =\n\t\t8425173595940729385440183444082426527082856656139671103060591152329269303855;\n\n\tuint256 constant IC43x =\n\t\t15208297703573936040995781936495139337521314609783232818533645617542642581767;\n\tuint256 constant IC43y =\n\t\t6603929002478023568238603869607485302965102643822082232775178803796403753253;\n\n\tuint256 constant IC44x =\n\t\t16869513925253089884764564886765646809847932834576677567710730324239424030361;\n\tuint256 constant IC44y =\n\t\t21221128175458514836954538107809973142440946772066955944605015744978703367122;\n\n\tuint256 constant IC45x =\n\t\t3664632576269586275268899307631410895325605682335945634029613546053691328156;\n\tuint256 constant IC45y =\n\t\t7474344736288316274843922281593099876544805654985985724747960087492926404850;\n\n\tuint256 constant IC46x =\n\t\t3773138018575580585374024433281480935981191438163984766886397827178228039569;\n\tuint256 constant IC46y =\n\t\t19811742704341863535165372982863825336866524862873986593851936669353129254680;\n\n\tuint256 constant IC47x =\n\t\t4580674780054124441594349666004146388709131468839778278701144566831443831794;\n\tuint256 constant IC47y =\n\t\t4384676859140385495483611633082439929576746843130514907256296890842423834381;\n\n\tuint256 constant IC48x =\n\t\t12387974119877388993893752215223895830576785638229571939661240963371031359402;\n\tuint256 constant IC48y =\n\t\t21311945906798935664679025953811701388699515681513409771402947009784886654209;\n\n\tuint256 constant IC49x =\n\t\t11211632267490412783876750476130613984493796022328990209630372870314956479826;\n\tuint256 constant IC49y =\n\t\t14531740894319885133470510720446922636333004070495706081492802440018383390840;\n\n\tuint256 constant IC50x =\n\t\t6714987073820449065380642291390555300685043249048204084269770268747301787779;\n\tuint256 constant IC50y =\n\t\t7763561248050280096095159154676766138428320406645755768068361957974882067115;\n\n\tuint256 constant IC51x =\n\t\t13056055619098914681540454317027488143392462374786003307011705246757544831587;\n\tuint256 constant IC51y =\n\t\t18313444934933122830501365064560434636312273939991982798333175598744399972595;\n\n\tuint256 constant IC52x =\n\t\t4344951956234079360961640662614567004666787873907691179692172694665726642169;\n\tuint256 constant IC52y =\n\t\t14507578567524397582957955462192850056536719401985418484169419801944018852343;\n\n\tuint256 constant IC53x =\n\t\t855550140188142399858117164334358804746643689273435028084474760058483461635;\n\tuint256 constant IC53y =\n\t\t1662209466478449172786812143176226372399042447403840480013431593274668031013;\n\n\tuint256 constant IC54x =\n\t\t5613283962972129075833205387311501596500496040148780687862709110664762261740;\n\tuint256 constant IC54y =\n\t\t15966836247521330481117830446609287521890060697578471208739251082743743838618;\n\n\tuint256 constant IC55x =\n\t\t4636150489632987218929183587987436844787933308941066908836421800220544340096;\n\tuint256 constant IC55y =\n\t\t10594320900232129426302566663957916877583440535053085183082339191464034594716;\n\n\tuint256 constant IC56x =\n\t\t8474281620870935707379122936790909527334611946198442568724838947244059965057;\n\tuint256 constant IC56y =\n\t\t2419538145415989208380804987763450818207947625964229197081105281020432534379;\n\n\tuint256 constant IC57x =\n\t\t11133736744489853771290190634021140521893271092184861404391472237936013099678;\n\tuint256 constant IC57y =\n\t\t7516679398736825245452800590216203276994861843912925631440499505593407281942;\n\n\tuint256 constant IC58x =\n\t\t1191157660205228693453984218558421426825701517352034600442070625748571980591;\n\tuint256 constant IC58y =\n\t\t20712098598797183834002713723567990918966066051166975287543977089153806042084;\n\n\tuint256 constant IC59x =\n\t\t19882465696230520674715442384672558779086822281593399553240353388492021496542;\n\tuint256 constant IC59y =\n\t\t991900654516700352789785899520776173696339481656855012321394622129641703221;\n\n\tuint256 constant IC60x =\n\t\t7086475804411478827870597169229868726186285910024168908879665198904955302786;\n\tuint256 constant IC60y =\n\t\t2691192618814776029125685779609142812764332191269301113887218595274094044958;\n\n\t// Memory data\n\tuint16 constant pVk = 0;\n\tuint16 constant pPairing = 128;\n\n\tuint16 constant pLastMem = 896;\n\n\tfunction verifyProof(\n\t\tuint[2] calldata _pA,\n\t\tuint[2][2] calldata _pB,\n\t\tuint[2] calldata _pC,\n\t\tuint[60] calldata _pubSignals\n\t) public view returns (bool) {\n\t\tassembly {\n\t\t\tfunction checkField(v) {\n\t\t\t\tif iszero(lt(v, r)) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// G1 function to multiply a G1 value(x,y) to value in an address\n\t\t\tfunction g1_mulAccC(pR, x, y, s) {\n\t\t\t\tlet success\n\t\t\t\tlet mIn := mload(0x40)\n\t\t\t\tmstore(mIn, x)\n\t\t\t\tmstore(add(mIn, 32), y)\n\t\t\t\tmstore(add(mIn, 64), s)\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\n\t\t\t\tmstore(add(mIn, 64), mload(pR))\n\t\t\t\tmstore(add(mIn, 96), mload(add(pR, 32)))\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n\t\t\t\tlet _pPairing := add(pMem, pPairing)\n\t\t\t\tlet _pVk := add(pMem, pVk)\n\n\t\t\t\tmstore(_pVk, IC0x)\n\t\t\t\tmstore(add(_pVk, 32), IC0y)\n\n\t\t\t\t// Compute the linear combination vk_x\n\n\t\t\t\tg1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC10x,\n\t\t\t\t\tIC10y,\n\t\t\t\t\tcalldataload(add(pubSignals, 288))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC11x,\n\t\t\t\t\tIC11y,\n\t\t\t\t\tcalldataload(add(pubSignals, 320))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC12x,\n\t\t\t\t\tIC12y,\n\t\t\t\t\tcalldataload(add(pubSignals, 352))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC13x,\n\t\t\t\t\tIC13y,\n\t\t\t\t\tcalldataload(add(pubSignals, 384))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC14x,\n\t\t\t\t\tIC14y,\n\t\t\t\t\tcalldataload(add(pubSignals, 416))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC15x,\n\t\t\t\t\tIC15y,\n\t\t\t\t\tcalldataload(add(pubSignals, 448))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC16x,\n\t\t\t\t\tIC16y,\n\t\t\t\t\tcalldataload(add(pubSignals, 480))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC17x,\n\t\t\t\t\tIC17y,\n\t\t\t\t\tcalldataload(add(pubSignals, 512))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC18x,\n\t\t\t\t\tIC18y,\n\t\t\t\t\tcalldataload(add(pubSignals, 544))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC19x,\n\t\t\t\t\tIC19y,\n\t\t\t\t\tcalldataload(add(pubSignals, 576))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC20x,\n\t\t\t\t\tIC20y,\n\t\t\t\t\tcalldataload(add(pubSignals, 608))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC21x,\n\t\t\t\t\tIC21y,\n\t\t\t\t\tcalldataload(add(pubSignals, 640))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC22x,\n\t\t\t\t\tIC22y,\n\t\t\t\t\tcalldataload(add(pubSignals, 672))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC23x,\n\t\t\t\t\tIC23y,\n\t\t\t\t\tcalldataload(add(pubSignals, 704))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC24x,\n\t\t\t\t\tIC24y,\n\t\t\t\t\tcalldataload(add(pubSignals, 736))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC25x,\n\t\t\t\t\tIC25y,\n\t\t\t\t\tcalldataload(add(pubSignals, 768))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC26x,\n\t\t\t\t\tIC26y,\n\t\t\t\t\tcalldataload(add(pubSignals, 800))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC27x,\n\t\t\t\t\tIC27y,\n\t\t\t\t\tcalldataload(add(pubSignals, 832))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC28x,\n\t\t\t\t\tIC28y,\n\t\t\t\t\tcalldataload(add(pubSignals, 864))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC29x,\n\t\t\t\t\tIC29y,\n\t\t\t\t\tcalldataload(add(pubSignals, 896))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC30x,\n\t\t\t\t\tIC30y,\n\t\t\t\t\tcalldataload(add(pubSignals, 928))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC31x,\n\t\t\t\t\tIC31y,\n\t\t\t\t\tcalldataload(add(pubSignals, 960))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC32x,\n\t\t\t\t\tIC32y,\n\t\t\t\t\tcalldataload(add(pubSignals, 992))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC33x,\n\t\t\t\t\tIC33y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1024))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC34x,\n\t\t\t\t\tIC34y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1056))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC35x,\n\t\t\t\t\tIC35y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1088))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC36x,\n\t\t\t\t\tIC36y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1120))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC37x,\n\t\t\t\t\tIC37y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1152))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC38x,\n\t\t\t\t\tIC38y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1184))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC39x,\n\t\t\t\t\tIC39y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1216))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC40x,\n\t\t\t\t\tIC40y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1248))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC41x,\n\t\t\t\t\tIC41y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1280))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC42x,\n\t\t\t\t\tIC42y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1312))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC43x,\n\t\t\t\t\tIC43y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1344))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC44x,\n\t\t\t\t\tIC44y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1376))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC45x,\n\t\t\t\t\tIC45y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1408))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC46x,\n\t\t\t\t\tIC46y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1440))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC47x,\n\t\t\t\t\tIC47y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1472))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC48x,\n\t\t\t\t\tIC48y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1504))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC49x,\n\t\t\t\t\tIC49y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1536))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC50x,\n\t\t\t\t\tIC50y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1568))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC51x,\n\t\t\t\t\tIC51y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1600))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC52x,\n\t\t\t\t\tIC52y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1632))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC53x,\n\t\t\t\t\tIC53y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1664))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC54x,\n\t\t\t\t\tIC54y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1696))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC55x,\n\t\t\t\t\tIC55y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1728))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC56x,\n\t\t\t\t\tIC56y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1760))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC57x,\n\t\t\t\t\tIC57y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1792))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC58x,\n\t\t\t\t\tIC58y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1824))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC59x,\n\t\t\t\t\tIC59y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1856))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC60x,\n\t\t\t\t\tIC60y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1888))\n\t\t\t\t)\n\n\t\t\t\t// -A\n\t\t\t\tmstore(_pPairing, calldataload(pA))\n\t\t\t\tmstore(\n\t\t\t\t\tadd(_pPairing, 32),\n\t\t\t\t\tmod(sub(q, calldataload(add(pA, 32))), q)\n\t\t\t\t)\n\n\t\t\t\t// B\n\t\t\t\tmstore(add(_pPairing, 64), calldataload(pB))\n\t\t\t\tmstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n\t\t\t\tmstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n\t\t\t\tmstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n\t\t\t\t// alpha1\n\t\t\t\tmstore(add(_pPairing, 192), alphax)\n\t\t\t\tmstore(add(_pPairing, 224), alphay)\n\n\t\t\t\t// beta2\n\t\t\t\tmstore(add(_pPairing, 256), betax1)\n\t\t\t\tmstore(add(_pPairing, 288), betax2)\n\t\t\t\tmstore(add(_pPairing, 320), betay1)\n\t\t\t\tmstore(add(_pPairing, 352), betay2)\n\n\t\t\t\t// vk_x\n\t\t\t\tmstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n\t\t\t\tmstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\t\t\t\t// gamma2\n\t\t\t\tmstore(add(_pPairing, 448), gammax1)\n\t\t\t\tmstore(add(_pPairing, 480), gammax2)\n\t\t\t\tmstore(add(_pPairing, 512), gammay1)\n\t\t\t\tmstore(add(_pPairing, 544), gammay2)\n\n\t\t\t\t// C\n\t\t\t\tmstore(add(_pPairing, 576), calldataload(pC))\n\t\t\t\tmstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n\t\t\t\t// delta2\n\t\t\t\tmstore(add(_pPairing, 640), deltax1)\n\t\t\t\tmstore(add(_pPairing, 672), deltax2)\n\t\t\t\tmstore(add(_pPairing, 704), deltay1)\n\t\t\t\tmstore(add(_pPairing, 736), deltay2)\n\n\t\t\t\tlet success := staticcall(\n\t\t\t\t\tsub(gas(), 2000),\n\t\t\t\t\t8,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t768,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t0x20\n\t\t\t\t)\n\n\t\t\t\tisOk := and(success, mload(_pPairing))\n\t\t\t}\n\n\t\t\tlet pMem := mload(0x40)\n\t\t\tmstore(0x40, add(pMem, pLastMem))\n\n\t\t\t// Validate that all evaluations ∈ F\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 0)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 32)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 64)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 96)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 128)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 160)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 192)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 224)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 256)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 288)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 320)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 352)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 384)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 416)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 448)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 480)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 512)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 544)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 576)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 608)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 640)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 672)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 704)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 736)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 768)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 800)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 832)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 864)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 896)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 928)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 960)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 992)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1024)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1056)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1088)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1120)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1152)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1184)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1216)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1248)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1280)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1312)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1344)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1376)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1408)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1440)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1472)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1504)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1536)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1568)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1600)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1632)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1664)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1696)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1728)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1760)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1792)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1824)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1856)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1888)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1920)))\n\n\t\t\t// Validate all evaluations\n\t\t\tlet isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n\t\t\tmstore(0, isValid)\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/Poseidon.sol": { + "content": "/// SPDX-License-Identifier: MIT\npragma solidity >=0.7.0;\n\ncontract Poseidon {\n\tuint constant M00 =\n\t\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\n\tuint constant M01 =\n\t\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\n\tuint constant M10 =\n\t\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\n\tuint constant M11 =\n\t\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\n\n\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\n\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\n\tfunction hash(uint[1] memory) public pure returns (uint) {\n\t\tassembly {\n\t\t\tlet\n\t\t\t\tF\n\t\t\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\n\n\t\t\t// load the inputs from memory\n\t\t\tlet state1 := add(\n\t\t\t\tmod(mload(0x80), F),\n\t\t\t\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\n\t\t\t)\n\t\t\tlet scratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\n\t\t\t\tadd(\n\t\t\t\t\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\n\t\t\t\t\tmulmod(state1, M10, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet scratch1 := add(\n\t\t\t\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\n\t\t\t\tadd(\n\t\t\t\t\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\n\t\t\t\t\tmulmod(state1, M11, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet state0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\n\t\t\tmstore(\n\t\t\t\t0x0,\n\t\t\t\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\n\t\t\t)\n\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/solcInputs/a49b46b2dac4fcc95aea528a9c5bd270.json b/packages/hardhat/deployments/optimismSepolia/solcInputs/a49b46b2dac4fcc95aea528a9c5bd270.json new file mode 100644 index 0000000..d10049a --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/solcInputs/a49b46b2dac4fcc95aea528a9c5bd270.json @@ -0,0 +1,41 @@ +{ + "language": "Solidity", + "sources": { + "contracts/FrogCryptoSqueeze.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Poseidon.sol\";\nimport \"./Groth16Verifier.sol\";\n\nabstract contract PotionTokenContract {\n function mint(address to, uint256 amount) public virtual;\n}\n\ncontract FrogCryptoSqueeze is Groth16Verifier, Poseidon {\n // The known hash of the FrogCrypto signer\n uint256 constant FROGCRYPTO_SIGNER_HASH =\n 320469162396708332516033932244029190181315114284264408621970394677041964715;\n\n // Mapping from frogId to squeeze timestamp\n mapping(uint256 => uint256) public squeezeTimestamps;\n\n PotionTokenContract public rarityTokenContract;\n PotionTokenContract public temperamentTokenContract;\n PotionTokenContract public jumpTokenContract;\n PotionTokenContract public speedTokenContract;\n PotionTokenContract public intelligenceTokenContract;\n PotionTokenContract public beautyTokenContract;\n\n struct ProofArgs {\n uint256[2] _pA;\n uint256[2][2] _pB;\n uint256[2] _pC;\n uint256[60] _pubSignals;\n }\n\n struct FrogAttributes {\n uint256 beauty;\n uint256 biome;\n uint256 intelligence;\n uint256 jump;\n uint256 speed;\n uint256 rarity;\n uint256 owner;\n uint256 temperament;\n uint256 frogId;\n }\n\n event Squeeze(\n uint256 indexed frogId,\n address indexed owner,\n uint256 rarityReward,\n uint256 jumpReward,\n uint256 speedReward,\n uint256 intelligenceReward,\n uint256 beautyReward\n );\n\n modifier verifiedProof(ProofArgs calldata proof) {\n require(this.verifyProof(proof._pA, proof._pB, proof._pC, proof._pubSignals), \"Invalid proof\");\n _;\n }\n\n constructor(\n address rarityTokenAddress,\n address jumpTokenAddress,\n address speedTokenAddress,\n address intelligenceTokenAddress,\n address beautyTokenAddress\n ) {\n rarityTokenContract = PotionTokenContract(rarityTokenAddress);\n jumpTokenContract = PotionTokenContract(jumpTokenAddress);\n speedTokenContract = PotionTokenContract(speedTokenAddress);\n intelligenceTokenContract = PotionTokenContract(intelligenceTokenAddress);\n beautyTokenContract = PotionTokenContract(beautyTokenAddress);\n }\n\n function squeezeFrog(ProofArgs calldata proof, FrogAttributes calldata attributes, address owner) public {\n // First verify the proof and attributes\n require(verifyFrogAttributes(proof, attributes), \"Invalid frog attributes\");\n\n // TODO: change cooldown period\n require(\n squeezeTimestamps[attributes.frogId] + 1 minutes < block.timestamp,\n \"Squeeze: Cooldown period is not over yet\"\n );\n\n squeezeTimestamps[attributes.frogId] = block.timestamp;\n\n bytes32 predictableRandom = keccak256(\n abi.encodePacked(attributes.frogId, blockhash(block.number - 1), msg.sender, address(this))\n );\n\n uint8 temperamentMultiplier = 1;\n\n // cool temperament gets a bonus (we can add another bonus later)\n if (attributes.temperament == 6) {\n temperamentMultiplier = 2;\n }\n\n uint256 rarityAmount = ((uint256(uint8(predictableRandom[0])) % 10) + 1) *\n (attributes.rarity + 1) *\n temperamentMultiplier;\n uint256 jumpAmount = ((uint256(uint8(predictableRandom[2])) % 10) + 1) *\n (attributes.jump + 1) *\n temperamentMultiplier;\n uint256 speedAmount = ((uint256(uint8(predictableRandom[3])) % 10) + 1) *\n (attributes.speed + 1) *\n temperamentMultiplier;\n uint256 intelligenceAmount = ((uint256(uint8(predictableRandom[4])) % 10) + 1) *\n (attributes.intelligence + 1) *\n temperamentMultiplier;\n uint256 beautyAmount = ((uint256(uint8(predictableRandom[5])) % 10) + 1) *\n (attributes.beauty + 1) *\n temperamentMultiplier;\n\n rarityTokenContract.mint(owner, rarityAmount);\n jumpTokenContract.mint(owner, jumpAmount);\n speedTokenContract.mint(owner, speedAmount);\n intelligenceTokenContract.mint(owner, intelligenceAmount);\n beautyTokenContract.mint(owner, beautyAmount);\n\n emit Squeeze(attributes.frogId, owner, rarityAmount, jumpAmount, speedAmount, intelligenceAmount, beautyAmount);\n }\n\n function verifyFrogAttributes(ProofArgs calldata proof, FrogAttributes calldata attrs) public view returns (bool) {\n uint256[60] memory pubSignals = proof._pubSignals;\n\n // Verify FrogCrypto signer\n require(pubSignals[25] == FROGCRYPTO_SIGNER_HASH, \"Invalid signer\");\n\n uint256[1] memory input;\n\n // Verify beauty\n input[0] = attrs.beauty;\n require(this.hash(input) == pubSignals[0], \"Invalid beauty value\");\n\n // Verify biome\n input[0] = attrs.biome;\n require(this.hash(input) == pubSignals[1], \"Invalid biome value\");\n\n // verify frogId\n input[0] = attrs.frogId;\n require(this.hash(input) == pubSignals[3], \"Invalid frogId value\");\n\n // Verify intelligence\n input[0] = attrs.intelligence;\n require(this.hash(input) == pubSignals[4], \"Invalid intelligence value\");\n\n // Verify jump\n input[0] = attrs.jump;\n require(this.hash(input) == pubSignals[5], \"Invalid jump value\");\n\n // Verify owner\n input[0] = attrs.owner;\n require(this.hash(input) == pubSignals[7], \"Invalid owner value\");\n\n // Verify rarity\n input[0] = attrs.rarity;\n require(this.hash(input) == pubSignals[8], \"Invalid rarity value\");\n\n // Verify speed\n input[0] = attrs.speed;\n require(this.hash(input) == pubSignals[9], \"Invalid speed value\");\n\n input[0] = attrs.temperament;\n require(this.hash(input) == pubSignals[10], \"Invalid speed value\");\n\n return true;\n }\n}\n" + }, + "contracts/Groth16Verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n\t// Scalar field size\n\tuint256 constant r =\n\t\t21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\t// Base field size\n\tuint256 constant q =\n\t\t21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n\t// Verification Key data\n\tuint256 constant alphax =\n\t\t20491192805390485299153009773594534940189261866228447918068658471970481763042;\n\tuint256 constant alphay =\n\t\t9383485363053290200918347156157836566562967994039712273449902621266178545958;\n\tuint256 constant betax1 =\n\t\t4252822878758300859123897981450591353533073413197771768651442665752259397132;\n\tuint256 constant betax2 =\n\t\t6375614351688725206403948262868962793625744043794305715222011528459656738731;\n\tuint256 constant betay1 =\n\t\t21847035105528745403288232691147584728191162732299865338377159692350059136679;\n\tuint256 constant betay2 =\n\t\t10505242626370262277552901082094356697409835680220590971873171140371331206856;\n\tuint256 constant gammax1 =\n\t\t11559732032986387107991004021392285783925812861821192530917403151452391805634;\n\tuint256 constant gammax2 =\n\t\t10857046999023057135944570762232829481370756359578518086990519993285655852781;\n\tuint256 constant gammay1 =\n\t\t4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\tuint256 constant gammay2 =\n\t\t8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\tuint256 constant deltax1 =\n\t\t20520124732927332327873265850761449286007985884576783646471472851495393940176;\n\tuint256 constant deltax2 =\n\t\t15186265480905208282922239900328489292444307478543511518778432579560350684744;\n\tuint256 constant deltay1 =\n\t\t16439709157989854781575386903705114956127999812986029888560530272710365313983;\n\tuint256 constant deltay2 =\n\t\t4214104585402129979383307131221473200132164352817422962054819905839268800475;\n\n\tuint256 constant IC0x =\n\t\t12277324663121539084679683501505688594366597380533437740994022534746968296925;\n\tuint256 constant IC0y =\n\t\t16380671995001451342386700719067227883287820400238358061288182230554025598302;\n\n\tuint256 constant IC1x =\n\t\t5190353014499945678829068468990765742757549186510864889270232008806153087396;\n\tuint256 constant IC1y =\n\t\t19834252880244132418620519034879785076508390279933685386298170186441409909168;\n\n\tuint256 constant IC2x =\n\t\t2744387324177524065055432568462502060905874970452855629215133135989691358725;\n\tuint256 constant IC2y =\n\t\t19683497734329386289581254469251156544945887989872142897805445597996697171563;\n\n\tuint256 constant IC3x =\n\t\t16364581735408788196876671261794253330229515801819949732471870260428856164875;\n\tuint256 constant IC3y =\n\t\t5360020983625766116016458053299551190916514189424402143747655065316573073737;\n\n\tuint256 constant IC4x =\n\t\t12105401442777576022568243830504304724319835802489753305392640672905314429318;\n\tuint256 constant IC4y =\n\t\t4533767381643525748539209433291972728869771390681883411971339130788167678191;\n\n\tuint256 constant IC5x =\n\t\t14655105260061026013536435219722244582641001994548095039207403606952986548676;\n\tuint256 constant IC5y =\n\t\t6164561044598494876893634560104394990241471992383826621011589810538448632553;\n\n\tuint256 constant IC6x =\n\t\t11422538929165273292646471640436931586150243226165158258377759121207698546693;\n\tuint256 constant IC6y =\n\t\t19996118372594129253740080624681752122794924310923896590723668163609020119303;\n\n\tuint256 constant IC7x =\n\t\t1608169220478017683201283029407537404003465420344898051589898653740906874189;\n\tuint256 constant IC7y =\n\t\t4598219219881469847753617821782195429646988589418969082785191839339407067731;\n\n\tuint256 constant IC8x =\n\t\t15827337144240104434284958539474213118722302813402254231816052334889847603700;\n\tuint256 constant IC8y =\n\t\t4524272288678524202977212434542413854721939205352325806226415649043493656587;\n\n\tuint256 constant IC9x =\n\t\t12903302956025509577349732724608972753848852747646591736799284416811318356691;\n\tuint256 constant IC9y =\n\t\t1032653756669871628418431952179410642769924541469386596753111579808738155791;\n\n\tuint256 constant IC10x =\n\t\t5058294297628429474257831813564601282656608632738746636364633118084915796686;\n\tuint256 constant IC10y =\n\t\t9916588999043034758140198050858798913696272314277526355595377569882762118395;\n\n\tuint256 constant IC11x =\n\t\t5520950258000124528649959009587322206194309520867900771157489126718260495588;\n\tuint256 constant IC11y =\n\t\t13423687093301599638921916315302488464894457098480820589963235628977328873959;\n\n\tuint256 constant IC12x =\n\t\t17372417161020358511851158950579180064435550406197880511786173528653080571324;\n\tuint256 constant IC12y =\n\t\t16388281283477736785676413647165899714739561439383723924878531463253258535798;\n\n\tuint256 constant IC13x =\n\t\t11615484768784941273831902304054470951878190970768148868549524618072759518177;\n\tuint256 constant IC13y =\n\t\t2454462683711297495640450591326260718272062089549919947762999731787907307322;\n\n\tuint256 constant IC14x =\n\t\t20998123019599417074129870225407389744016263905569276719056003230750882078966;\n\tuint256 constant IC14y =\n\t\t2027449160682157357573641319743953001139995224502434755334363787127125692307;\n\n\tuint256 constant IC15x =\n\t\t20975620125341868607446197473110148889440951779129665826706258866979403571951;\n\tuint256 constant IC15y =\n\t\t9036700354882894745639015859925148940502671522437251966395307498062201300115;\n\n\tuint256 constant IC16x =\n\t\t8587069003289925272802713047590422438240603180529506394622515428975339586412;\n\tuint256 constant IC16y =\n\t\t4378223105097068792530355962047054913632602659154515398746431479792494683307;\n\n\tuint256 constant IC17x =\n\t\t10425351374487491092078025911162404974424865904747299578229309190820507362670;\n\tuint256 constant IC17y =\n\t\t7938118020641905969824944125336180473504483041687733798598901735869758550276;\n\n\tuint256 constant IC18x =\n\t\t2731447294069503101366715738330788892158751204559397907475007657161030049358;\n\tuint256 constant IC18y =\n\t\t4414384646459616947533237428069749099795594730622459314735543270574401384454;\n\n\tuint256 constant IC19x =\n\t\t12181507654019731410038372938606308249489708161279257326624219579898870156212;\n\tuint256 constant IC19y =\n\t\t18689993809764382264456275934137957896993901004031326057532324815067748979258;\n\n\tuint256 constant IC20x =\n\t\t3428093310012627190830381109488448213941407467199041818748319516567565675097;\n\tuint256 constant IC20y =\n\t\t9212363656631904394679539472256675043097198441642452923275866620632093584464;\n\n\tuint256 constant IC21x =\n\t\t18167927253289725405435989072528319789610028309675996687776482217930219097324;\n\tuint256 constant IC21y =\n\t\t11536766067781669236882843903281104178384579779772177559138730708427497071957;\n\n\tuint256 constant IC22x =\n\t\t20035810338607314323955949585659972285441022575981103656094294313909996656932;\n\tuint256 constant IC22y =\n\t\t7997562424985358365305111098343437150762605947716803920426785164718797831565;\n\n\tuint256 constant IC23x =\n\t\t9986712342698702618149186010348406416155846897870904219632010665312730756761;\n\tuint256 constant IC23y =\n\t\t20963946329982329161430750799528828110178648939369147690623681890735508473084;\n\n\tuint256 constant IC24x =\n\t\t16940190367628636615510438529595839357899514570779911633108631150606017639658;\n\tuint256 constant IC24y =\n\t\t19811948534754191487432847089954280623902539989834110172452145788629097124701;\n\n\tuint256 constant IC25x =\n\t\t1249106085684745092237253910125724951748735669738602119191760896489914096;\n\tuint256 constant IC25y =\n\t\t18177408893599232440719388554509588727793527447172049482533937110555460990841;\n\n\tuint256 constant IC26x =\n\t\t10365857423353553736405489148874295650826880157768887040509353531314321583383;\n\tuint256 constant IC26y =\n\t\t20770042327207453865166626940058297688611226609377585542598350001082817948397;\n\n\tuint256 constant IC27x =\n\t\t5736063059699666199362675961074050835883052364097807660115972868365507559013;\n\tuint256 constant IC27y =\n\t\t13643543907639316479329632939940554017983537889535117817821274723297156403963;\n\n\tuint256 constant IC28x =\n\t\t16025180862200276449259543624981925606735997363919624909545708294152472351636;\n\tuint256 constant IC28y =\n\t\t1109552921991830101042328748080272391176315562285922063015521733351877181121;\n\n\tuint256 constant IC29x =\n\t\t17682240688395550617822273512749416227712105463719965283711530657071591873729;\n\tuint256 constant IC29y =\n\t\t6868330462624654892085690822602481554757264196866113028269031649330358928973;\n\n\tuint256 constant IC30x =\n\t\t10379314116528041264715120180753972214746348102205434178712478459211919727266;\n\tuint256 constant IC30y =\n\t\t2868544592992480669628601978351264912651542308675709135346303285296832312831;\n\n\tuint256 constant IC31x =\n\t\t18301755856663451898705671831143264776087370227626870537209885753154727745135;\n\tuint256 constant IC31y =\n\t\t14989566943693248337375345382490657233151030488271584236577019477988984570667;\n\n\tuint256 constant IC32x =\n\t\t2611427460304728674512368081743588702374291565032144045509755125494172829431;\n\tuint256 constant IC32y =\n\t\t20284861001848591395643574545845384817851721085403656397055760971158683669531;\n\n\tuint256 constant IC33x =\n\t\t9994381801955638660870716129575806119951239073244977744968125742612770701964;\n\tuint256 constant IC33y =\n\t\t6134966411093459650168989683578162450448205314735925390105026767537838520837;\n\n\tuint256 constant IC34x =\n\t\t10989902820069540724912125933733153146671332874535466610661438364982363208949;\n\tuint256 constant IC34y =\n\t\t5229068301666861962954921868276695072426995494059989772856487541222100352029;\n\n\tuint256 constant IC35x =\n\t\t2212722254371299303793343402488309920014272130931170869023535773818640929570;\n\tuint256 constant IC35y =\n\t\t1060329465445567102816559472001034126110140906554484765351978517718148355198;\n\n\tuint256 constant IC36x =\n\t\t12077706967014624229026277618706342799606244159314183725710551090492280924333;\n\tuint256 constant IC36y =\n\t\t13913176388623636150479995111956344908631089983957536990999858794721298540066;\n\n\tuint256 constant IC37x =\n\t\t21703189902951736445560257737292703316136812014860113440756072187434728214251;\n\tuint256 constant IC37y =\n\t\t20216804026149183772301756194798673978326145478066942964148185194471427049500;\n\n\tuint256 constant IC38x =\n\t\t10287783606385313753228693957804848457286636182654320335342518112953843818919;\n\tuint256 constant IC38y =\n\t\t7911687969516121229905845724698683542246332278360312768599636015608269134617;\n\n\tuint256 constant IC39x =\n\t\t13969567783361525977319027962746248904987928696546960453829160539195495904734;\n\tuint256 constant IC39y =\n\t\t8226774691959374867876706802590453926240599737820644781139469760858901082046;\n\n\tuint256 constant IC40x =\n\t\t12697191759416239548120236436310291446114849792335587786166698427319674203204;\n\tuint256 constant IC40y =\n\t\t3576868414216527077611133030448465832146556559505043339767774185581059468387;\n\n\tuint256 constant IC41x =\n\t\t3652859335159578832495246405427801782343652027755250621884208881733454256186;\n\tuint256 constant IC41y =\n\t\t16152959212357630758336210305169567061764323654844642188021525025790159170529;\n\n\tuint256 constant IC42x =\n\t\t11820498121947253273708623566630026730670651510095012853447505632961521054725;\n\tuint256 constant IC42y =\n\t\t8425173595940729385440183444082426527082856656139671103060591152329269303855;\n\n\tuint256 constant IC43x =\n\t\t15208297703573936040995781936495139337521314609783232818533645617542642581767;\n\tuint256 constant IC43y =\n\t\t6603929002478023568238603869607485302965102643822082232775178803796403753253;\n\n\tuint256 constant IC44x =\n\t\t16869513925253089884764564886765646809847932834576677567710730324239424030361;\n\tuint256 constant IC44y =\n\t\t21221128175458514836954538107809973142440946772066955944605015744978703367122;\n\n\tuint256 constant IC45x =\n\t\t3664632576269586275268899307631410895325605682335945634029613546053691328156;\n\tuint256 constant IC45y =\n\t\t7474344736288316274843922281593099876544805654985985724747960087492926404850;\n\n\tuint256 constant IC46x =\n\t\t3773138018575580585374024433281480935981191438163984766886397827178228039569;\n\tuint256 constant IC46y =\n\t\t19811742704341863535165372982863825336866524862873986593851936669353129254680;\n\n\tuint256 constant IC47x =\n\t\t4580674780054124441594349666004146388709131468839778278701144566831443831794;\n\tuint256 constant IC47y =\n\t\t4384676859140385495483611633082439929576746843130514907256296890842423834381;\n\n\tuint256 constant IC48x =\n\t\t12387974119877388993893752215223895830576785638229571939661240963371031359402;\n\tuint256 constant IC48y =\n\t\t21311945906798935664679025953811701388699515681513409771402947009784886654209;\n\n\tuint256 constant IC49x =\n\t\t11211632267490412783876750476130613984493796022328990209630372870314956479826;\n\tuint256 constant IC49y =\n\t\t14531740894319885133470510720446922636333004070495706081492802440018383390840;\n\n\tuint256 constant IC50x =\n\t\t6714987073820449065380642291390555300685043249048204084269770268747301787779;\n\tuint256 constant IC50y =\n\t\t7763561248050280096095159154676766138428320406645755768068361957974882067115;\n\n\tuint256 constant IC51x =\n\t\t13056055619098914681540454317027488143392462374786003307011705246757544831587;\n\tuint256 constant IC51y =\n\t\t18313444934933122830501365064560434636312273939991982798333175598744399972595;\n\n\tuint256 constant IC52x =\n\t\t4344951956234079360961640662614567004666787873907691179692172694665726642169;\n\tuint256 constant IC52y =\n\t\t14507578567524397582957955462192850056536719401985418484169419801944018852343;\n\n\tuint256 constant IC53x =\n\t\t855550140188142399858117164334358804746643689273435028084474760058483461635;\n\tuint256 constant IC53y =\n\t\t1662209466478449172786812143176226372399042447403840480013431593274668031013;\n\n\tuint256 constant IC54x =\n\t\t5613283962972129075833205387311501596500496040148780687862709110664762261740;\n\tuint256 constant IC54y =\n\t\t15966836247521330481117830446609287521890060697578471208739251082743743838618;\n\n\tuint256 constant IC55x =\n\t\t4636150489632987218929183587987436844787933308941066908836421800220544340096;\n\tuint256 constant IC55y =\n\t\t10594320900232129426302566663957916877583440535053085183082339191464034594716;\n\n\tuint256 constant IC56x =\n\t\t8474281620870935707379122936790909527334611946198442568724838947244059965057;\n\tuint256 constant IC56y =\n\t\t2419538145415989208380804987763450818207947625964229197081105281020432534379;\n\n\tuint256 constant IC57x =\n\t\t11133736744489853771290190634021140521893271092184861404391472237936013099678;\n\tuint256 constant IC57y =\n\t\t7516679398736825245452800590216203276994861843912925631440499505593407281942;\n\n\tuint256 constant IC58x =\n\t\t1191157660205228693453984218558421426825701517352034600442070625748571980591;\n\tuint256 constant IC58y =\n\t\t20712098598797183834002713723567990918966066051166975287543977089153806042084;\n\n\tuint256 constant IC59x =\n\t\t19882465696230520674715442384672558779086822281593399553240353388492021496542;\n\tuint256 constant IC59y =\n\t\t991900654516700352789785899520776173696339481656855012321394622129641703221;\n\n\tuint256 constant IC60x =\n\t\t7086475804411478827870597169229868726186285910024168908879665198904955302786;\n\tuint256 constant IC60y =\n\t\t2691192618814776029125685779609142812764332191269301113887218595274094044958;\n\n\t// Memory data\n\tuint16 constant pVk = 0;\n\tuint16 constant pPairing = 128;\n\n\tuint16 constant pLastMem = 896;\n\n\tfunction verifyProof(\n\t\tuint[2] calldata _pA,\n\t\tuint[2][2] calldata _pB,\n\t\tuint[2] calldata _pC,\n\t\tuint[60] calldata _pubSignals\n\t) public view returns (bool) {\n\t\tassembly {\n\t\t\tfunction checkField(v) {\n\t\t\t\tif iszero(lt(v, r)) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// G1 function to multiply a G1 value(x,y) to value in an address\n\t\t\tfunction g1_mulAccC(pR, x, y, s) {\n\t\t\t\tlet success\n\t\t\t\tlet mIn := mload(0x40)\n\t\t\t\tmstore(mIn, x)\n\t\t\t\tmstore(add(mIn, 32), y)\n\t\t\t\tmstore(add(mIn, 64), s)\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\n\t\t\t\tmstore(add(mIn, 64), mload(pR))\n\t\t\t\tmstore(add(mIn, 96), mload(add(pR, 32)))\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n\t\t\t\tlet _pPairing := add(pMem, pPairing)\n\t\t\t\tlet _pVk := add(pMem, pVk)\n\n\t\t\t\tmstore(_pVk, IC0x)\n\t\t\t\tmstore(add(_pVk, 32), IC0y)\n\n\t\t\t\t// Compute the linear combination vk_x\n\n\t\t\t\tg1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC10x,\n\t\t\t\t\tIC10y,\n\t\t\t\t\tcalldataload(add(pubSignals, 288))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC11x,\n\t\t\t\t\tIC11y,\n\t\t\t\t\tcalldataload(add(pubSignals, 320))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC12x,\n\t\t\t\t\tIC12y,\n\t\t\t\t\tcalldataload(add(pubSignals, 352))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC13x,\n\t\t\t\t\tIC13y,\n\t\t\t\t\tcalldataload(add(pubSignals, 384))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC14x,\n\t\t\t\t\tIC14y,\n\t\t\t\t\tcalldataload(add(pubSignals, 416))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC15x,\n\t\t\t\t\tIC15y,\n\t\t\t\t\tcalldataload(add(pubSignals, 448))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC16x,\n\t\t\t\t\tIC16y,\n\t\t\t\t\tcalldataload(add(pubSignals, 480))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC17x,\n\t\t\t\t\tIC17y,\n\t\t\t\t\tcalldataload(add(pubSignals, 512))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC18x,\n\t\t\t\t\tIC18y,\n\t\t\t\t\tcalldataload(add(pubSignals, 544))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC19x,\n\t\t\t\t\tIC19y,\n\t\t\t\t\tcalldataload(add(pubSignals, 576))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC20x,\n\t\t\t\t\tIC20y,\n\t\t\t\t\tcalldataload(add(pubSignals, 608))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC21x,\n\t\t\t\t\tIC21y,\n\t\t\t\t\tcalldataload(add(pubSignals, 640))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC22x,\n\t\t\t\t\tIC22y,\n\t\t\t\t\tcalldataload(add(pubSignals, 672))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC23x,\n\t\t\t\t\tIC23y,\n\t\t\t\t\tcalldataload(add(pubSignals, 704))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC24x,\n\t\t\t\t\tIC24y,\n\t\t\t\t\tcalldataload(add(pubSignals, 736))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC25x,\n\t\t\t\t\tIC25y,\n\t\t\t\t\tcalldataload(add(pubSignals, 768))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC26x,\n\t\t\t\t\tIC26y,\n\t\t\t\t\tcalldataload(add(pubSignals, 800))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC27x,\n\t\t\t\t\tIC27y,\n\t\t\t\t\tcalldataload(add(pubSignals, 832))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC28x,\n\t\t\t\t\tIC28y,\n\t\t\t\t\tcalldataload(add(pubSignals, 864))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC29x,\n\t\t\t\t\tIC29y,\n\t\t\t\t\tcalldataload(add(pubSignals, 896))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC30x,\n\t\t\t\t\tIC30y,\n\t\t\t\t\tcalldataload(add(pubSignals, 928))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC31x,\n\t\t\t\t\tIC31y,\n\t\t\t\t\tcalldataload(add(pubSignals, 960))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC32x,\n\t\t\t\t\tIC32y,\n\t\t\t\t\tcalldataload(add(pubSignals, 992))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC33x,\n\t\t\t\t\tIC33y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1024))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC34x,\n\t\t\t\t\tIC34y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1056))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC35x,\n\t\t\t\t\tIC35y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1088))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC36x,\n\t\t\t\t\tIC36y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1120))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC37x,\n\t\t\t\t\tIC37y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1152))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC38x,\n\t\t\t\t\tIC38y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1184))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC39x,\n\t\t\t\t\tIC39y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1216))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC40x,\n\t\t\t\t\tIC40y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1248))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC41x,\n\t\t\t\t\tIC41y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1280))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC42x,\n\t\t\t\t\tIC42y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1312))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC43x,\n\t\t\t\t\tIC43y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1344))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC44x,\n\t\t\t\t\tIC44y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1376))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC45x,\n\t\t\t\t\tIC45y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1408))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC46x,\n\t\t\t\t\tIC46y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1440))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC47x,\n\t\t\t\t\tIC47y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1472))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC48x,\n\t\t\t\t\tIC48y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1504))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC49x,\n\t\t\t\t\tIC49y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1536))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC50x,\n\t\t\t\t\tIC50y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1568))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC51x,\n\t\t\t\t\tIC51y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1600))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC52x,\n\t\t\t\t\tIC52y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1632))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC53x,\n\t\t\t\t\tIC53y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1664))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC54x,\n\t\t\t\t\tIC54y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1696))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC55x,\n\t\t\t\t\tIC55y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1728))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC56x,\n\t\t\t\t\tIC56y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1760))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC57x,\n\t\t\t\t\tIC57y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1792))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC58x,\n\t\t\t\t\tIC58y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1824))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC59x,\n\t\t\t\t\tIC59y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1856))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC60x,\n\t\t\t\t\tIC60y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1888))\n\t\t\t\t)\n\n\t\t\t\t// -A\n\t\t\t\tmstore(_pPairing, calldataload(pA))\n\t\t\t\tmstore(\n\t\t\t\t\tadd(_pPairing, 32),\n\t\t\t\t\tmod(sub(q, calldataload(add(pA, 32))), q)\n\t\t\t\t)\n\n\t\t\t\t// B\n\t\t\t\tmstore(add(_pPairing, 64), calldataload(pB))\n\t\t\t\tmstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n\t\t\t\tmstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n\t\t\t\tmstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n\t\t\t\t// alpha1\n\t\t\t\tmstore(add(_pPairing, 192), alphax)\n\t\t\t\tmstore(add(_pPairing, 224), alphay)\n\n\t\t\t\t// beta2\n\t\t\t\tmstore(add(_pPairing, 256), betax1)\n\t\t\t\tmstore(add(_pPairing, 288), betax2)\n\t\t\t\tmstore(add(_pPairing, 320), betay1)\n\t\t\t\tmstore(add(_pPairing, 352), betay2)\n\n\t\t\t\t// vk_x\n\t\t\t\tmstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n\t\t\t\tmstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\t\t\t\t// gamma2\n\t\t\t\tmstore(add(_pPairing, 448), gammax1)\n\t\t\t\tmstore(add(_pPairing, 480), gammax2)\n\t\t\t\tmstore(add(_pPairing, 512), gammay1)\n\t\t\t\tmstore(add(_pPairing, 544), gammay2)\n\n\t\t\t\t// C\n\t\t\t\tmstore(add(_pPairing, 576), calldataload(pC))\n\t\t\t\tmstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n\t\t\t\t// delta2\n\t\t\t\tmstore(add(_pPairing, 640), deltax1)\n\t\t\t\tmstore(add(_pPairing, 672), deltax2)\n\t\t\t\tmstore(add(_pPairing, 704), deltay1)\n\t\t\t\tmstore(add(_pPairing, 736), deltay2)\n\n\t\t\t\tlet success := staticcall(\n\t\t\t\t\tsub(gas(), 2000),\n\t\t\t\t\t8,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t768,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t0x20\n\t\t\t\t)\n\n\t\t\t\tisOk := and(success, mload(_pPairing))\n\t\t\t}\n\n\t\t\tlet pMem := mload(0x40)\n\t\t\tmstore(0x40, add(pMem, pLastMem))\n\n\t\t\t// Validate that all evaluations ∈ F\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 0)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 32)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 64)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 96)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 128)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 160)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 192)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 224)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 256)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 288)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 320)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 352)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 384)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 416)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 448)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 480)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 512)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 544)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 576)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 608)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 640)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 672)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 704)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 736)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 768)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 800)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 832)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 864)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 896)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 928)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 960)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 992)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1024)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1056)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1088)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1120)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1152)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1184)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1216)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1248)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1280)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1312)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1344)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1376)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1408)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1440)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1472)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1504)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1536)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1568)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1600)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1632)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1664)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1696)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1728)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1760)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1792)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1824)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1856)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1888)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1920)))\n\n\t\t\t// Validate all evaluations\n\t\t\tlet isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n\t\t\tmstore(0, isValid)\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/Poseidon.sol": { + "content": "/// SPDX-License-Identifier: MIT\npragma solidity >=0.7.0;\n\ncontract Poseidon {\n\tuint constant M00 =\n\t\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\n\tuint constant M01 =\n\t\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\n\tuint constant M10 =\n\t\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\n\tuint constant M11 =\n\t\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\n\n\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\n\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\n\tfunction hash(uint[1] memory) public pure returns (uint) {\n\t\tassembly {\n\t\t\tlet\n\t\t\t\tF\n\t\t\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\n\n\t\t\t// load the inputs from memory\n\t\t\tlet state1 := add(\n\t\t\t\tmod(mload(0x80), F),\n\t\t\t\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\n\t\t\t)\n\t\t\tlet scratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\n\t\t\t\tadd(\n\t\t\t\t\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\n\t\t\t\t\tmulmod(state1, M10, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet scratch1 := add(\n\t\t\t\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\n\t\t\t\tadd(\n\t\t\t\t\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\n\t\t\t\t\tmulmod(state1, M11, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet state0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\n\t\t\tmstore(\n\t\t\t\t0x0,\n\t\t\t\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\n\t\t\t)\n\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/solcInputs/d25771cc29acf018fbcd36358c01e4b1.json b/packages/hardhat/deployments/optimismSepolia/solcInputs/d25771cc29acf018fbcd36358c01e4b1.json new file mode 100644 index 0000000..ee54c77 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/solcInputs/d25771cc29acf018fbcd36358c01e4b1.json @@ -0,0 +1,74 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(account),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\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 amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` 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(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "contracts/FrogCryptoSqueeze.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Poseidon.sol\";\nimport \"./Groth16Verifier.sol\";\n\nabstract contract PotionTokenContract {\n function mint(address to, uint256 amount) public virtual;\n}\n\ncontract FrogCryptoSqueeze is Groth16Verifier, Poseidon {\n // The known hash of the FrogCrypto signer\n uint256 constant FROGCRYPTO_SIGNER_HASH =\n 320469162396708332516033932244029190181315114284264408621970394677041964715;\n\n // Mapping from frogId to squeeze timestamp\n mapping(uint256 => uint256) public squeezeTimestamps;\n\n PotionTokenContract public rarityTokenContract;\n PotionTokenContract public temperamentTokenContract;\n PotionTokenContract public jumpTokenContract;\n PotionTokenContract public speedTokenContract;\n PotionTokenContract public intelligenceTokenContract;\n PotionTokenContract public beautyTokenContract;\n\n struct ProofArgs {\n uint256[2] _pA;\n uint256[2][2] _pB;\n uint256[2] _pC;\n uint256[56] _pubSignals;\n }\n\n struct FrogAttributes {\n // uint256 id;\n uint256 beauty;\n uint256 biome;\n uint256 intelligence;\n uint256 jump;\n uint256 speed;\n uint256 rarity;\n uint256 owner;\n }\n\n event Squeeze(\n uint256 indexed frogId,\n address indexed owner,\n uint256 rarityReward,\n uint256 temperamentReward,\n uint256 jummpReward,\n uint256 speedReward,\n uint256 intelligenceReward,\n uint256 beautyReward\n );\n\n modifier verifiedProof(ProofArgs calldata proof) {\n require(this.verifyProof(proof._pA, proof._pB, proof._pC, proof._pubSignals), \"Invalid proof\");\n _;\n }\n\n constructor(\n address rarityTokenAddress,\n address temperamentTokenAddress,\n address jumpTokenAddress,\n address speedTokenAddress,\n address intelligenceTokenAddress,\n address beautyTokenAddress\n ) {\n rarityTokenContract = PotionTokenContract(rarityTokenAddress);\n temperamentTokenContract = PotionTokenContract(temperamentTokenAddress);\n jumpTokenContract = PotionTokenContract(jumpTokenAddress);\n speedTokenContract = PotionTokenContract(speedTokenAddress);\n intelligenceTokenContract = PotionTokenContract(intelligenceTokenAddress);\n beautyTokenContract = PotionTokenContract(beautyTokenAddress);\n }\n\n function squeezeFrog(ProofArgs calldata proof, FrogAttributes calldata attributes) public {\n // First verify the proof and attributes\n require(verifyFrogAttributes(proof, attributes), \"Invalid frog attributes\");\n\n // TODO: change cooldown period and owner to frogId\n require(\n squeezeTimestamps[attributes.owner] + 1 minutes < block.timestamp,\n \"Squeeze: Cooldown period is not over yet\"\n );\n\n // TODO: change owner to frogId\n squeezeTimestamps[attributes.owner] = block.timestamp;\n\n // TODO: change owner to frogId\n bytes32 predictableRandom = keccak256(\n abi.encodePacked(attributes.owner, blockhash(block.number - 1), msg.sender, address(this))\n );\n\n uint256 rarityAmount = ((uint256(uint8(predictableRandom[0])) % 10) + 1) * (attributes.rarity + 1);\n // uint256 temperamentAmount = ((uint256(uint8(predictableRandom[1])) % 10) + 1) * (attributes.temperament + 1);\n uint256 jumpAmount = ((uint256(uint8(predictableRandom[2])) % 10) + 1) * (attributes.jump + 1);\n uint256 speedAmount = ((uint256(uint8(predictableRandom[3])) % 10) + 1) * (attributes.speed + 1);\n uint256 intelligenceAmount = ((uint256(uint8(predictableRandom[4])) % 10) + 1) * (attributes.intelligence + 1);\n uint256 beautyAmount = ((uint256(uint8(predictableRandom[5])) % 10) + 1) * (attributes.beauty + 1);\n\n rarityTokenContract.mint(msg.sender, rarityAmount);\n // temperamentTokenContract.mint(msg.sender, temperamentAmount);\n jumpTokenContract.mint(msg.sender, jumpAmount);\n speedTokenContract.mint(msg.sender, speedAmount);\n intelligenceTokenContract.mint(msg.sender, intelligenceAmount);\n beautyTokenContract.mint(msg.sender, beautyAmount);\n\n // TODO: change owner to frogId\n emit Squeeze(\n attributes.owner,\n msg.sender,\n rarityAmount,\n 0,\n jumpAmount,\n speedAmount,\n intelligenceAmount,\n beautyAmount\n );\n }\n\n function verifyFrogAttributes(ProofArgs calldata proof, FrogAttributes calldata attrs) public view returns (bool) {\n uint256[56] memory pubSignals = proof._pubSignals;\n\n // Verify FrogCrypto signer\n require(pubSignals[23] == FROGCRYPTO_SIGNER_HASH, \"Invalid signer\");\n\n uint256[1] memory input;\n\n // Verify beauty\n input[0] = attrs.beauty;\n require(this.hash(input) == pubSignals[0], \"Invalid beauty value\");\n\n // Verify biome\n input[0] = attrs.biome;\n require(this.hash(input) == pubSignals[1], \"Invalid biome value\");\n\n // Verify intelligence\n input[0] = attrs.intelligence;\n require(this.hash(input) == pubSignals[3], \"Invalid intelligence value\");\n\n // Verify jump\n input[0] = attrs.jump;\n require(this.hash(input) == pubSignals[4], \"Invalid jump value\");\n\n // Verify owner\n input[0] = attrs.owner;\n require(this.hash(input) == pubSignals[6], \"Invalid owner value\");\n\n // Verify rarity\n input[0] = attrs.rarity;\n require(this.hash(input) == pubSignals[7], \"Invalid rarity value\");\n\n // Verify speed\n input[0] = attrs.speed;\n require(this.hash(input) == pubSignals[8], \"Invalid speed value\");\n\n // TODO: Verify frogId\n\n return true;\n }\n}\n" + }, + "contracts/Groth16Verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n\t// Scalar field size\n\tuint256 constant r =\n\t\t21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\t// Base field size\n\tuint256 constant q =\n\t\t21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n\t// Verification Key data\n\tuint256 constant alphax =\n\t\t20491192805390485299153009773594534940189261866228447918068658471970481763042;\n\tuint256 constant alphay =\n\t\t9383485363053290200918347156157836566562967994039712273449902621266178545958;\n\tuint256 constant betax1 =\n\t\t4252822878758300859123897981450591353533073413197771768651442665752259397132;\n\tuint256 constant betax2 =\n\t\t6375614351688725206403948262868962793625744043794305715222011528459656738731;\n\tuint256 constant betay1 =\n\t\t21847035105528745403288232691147584728191162732299865338377159692350059136679;\n\tuint256 constant betay2 =\n\t\t10505242626370262277552901082094356697409835680220590971873171140371331206856;\n\tuint256 constant gammax1 =\n\t\t11559732032986387107991004021392285783925812861821192530917403151452391805634;\n\tuint256 constant gammax2 =\n\t\t10857046999023057135944570762232829481370756359578518086990519993285655852781;\n\tuint256 constant gammay1 =\n\t\t4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\tuint256 constant gammay2 =\n\t\t8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\tuint256 constant deltax1 =\n\t\t1866766967684475077026429609556327106093807957741725946793964808023715990993;\n\tuint256 constant deltax2 =\n\t\t4659311190982864441450729518864924847905216029076592248289990634575680082687;\n\tuint256 constant deltay1 =\n\t\t21724169671419676774033717936126866779574439945101235323290178202491573424937;\n\tuint256 constant deltay2 =\n\t\t18110855247484914672502198436947586961718950553755585790284240244644051838539;\n\n\tuint256 constant IC0x =\n\t\t18309573688944280386125138623088688452809083872692035376744546048640448830013;\n\tuint256 constant IC0y =\n\t\t8252545664804877655090584019431224476651831706926205661274438486717503078517;\n\n\tuint256 constant IC1x =\n\t\t13724968256971608639683042303568749222860593419566750935710775838848837986435;\n\tuint256 constant IC1y =\n\t\t15381662839978225352321616022337218020109204566049031666416886460526425965869;\n\n\tuint256 constant IC2x =\n\t\t6658337158533056435209096505560783453195590085837382213813946443291522907745;\n\tuint256 constant IC2y =\n\t\t9306572662774936565995161999022633816072552576090366864841219594069985311045;\n\n\tuint256 constant IC3x =\n\t\t3016212379656281472280944594543865425517575371433088764117523134258049272378;\n\tuint256 constant IC3y =\n\t\t2602541768252815682625947578833586588696693258602863952863513327213075022415;\n\n\tuint256 constant IC4x =\n\t\t9816742021460791515218039132784611020094104961681834748400830069126900470998;\n\tuint256 constant IC4y =\n\t\t10348426808259784844463456918035576955520609745619107315011093049401321052907;\n\n\tuint256 constant IC5x =\n\t\t12390552360156525734091763827502679328587811743107273011015150606880160766528;\n\tuint256 constant IC5y =\n\t\t183638701568878646260356724728606591551612270852066271019765173548740571911;\n\n\tuint256 constant IC6x =\n\t\t18835793819754396966418324264338243421396665011470795519919492253397941511415;\n\tuint256 constant IC6y =\n\t\t16276864664271038368712888193551459260270588753753324433645906101416426262868;\n\n\tuint256 constant IC7x =\n\t\t17694389750473427714713340305217978269360025960743432126841431716792259216553;\n\tuint256 constant IC7y =\n\t\t9650947012756037818471691383867973710225705683344930781931870909910681707965;\n\n\tuint256 constant IC8x =\n\t\t681023809986507260745544777274775765194577408747661170783243702960142805219;\n\tuint256 constant IC8y =\n\t\t1932661796175590584789349969886643788412159408887985979675775490813383802431;\n\n\tuint256 constant IC9x =\n\t\t21017849571203201162910042984857063559850050358879473333160388606658656055561;\n\tuint256 constant IC9y =\n\t\t3911553907221003467466493259384657847945603900216601273901250192843649327135;\n\n\tuint256 constant IC10x =\n\t\t4697167604081360102767597310388954224248974287943019142969867281938252033279;\n\tuint256 constant IC10y =\n\t\t20914530672636702782558652284783707697405729135251189269702367472029790810871;\n\n\tuint256 constant IC11x =\n\t\t7369949482368171676645913938455574124222481706187847883741316060813160352388;\n\tuint256 constant IC11y =\n\t\t4727140828630085863185239991710228583927761523693680497222423087252568656621;\n\n\tuint256 constant IC12x =\n\t\t14064206758912584845837663247671777117618297224535288981280182234011836042358;\n\tuint256 constant IC12y =\n\t\t2471602382851033672482675609087779227944480110933367708761146613365806260639;\n\n\tuint256 constant IC13x =\n\t\t10736269799746324370561665190090163352937604329850809414102258159966416105084;\n\tuint256 constant IC13y =\n\t\t19020761783205714677938272320357485323859845690764961473649357529923739843742;\n\n\tuint256 constant IC14x =\n\t\t15341136362541358347806190520786075906481708522139600214759885728822520600097;\n\tuint256 constant IC14y =\n\t\t12763186920235818095034854522833621355232606893991661714344676885217537892439;\n\n\tuint256 constant IC15x =\n\t\t578923187875322718929551148864821444409122480112505090445143545076478253219;\n\tuint256 constant IC15y =\n\t\t7225896456622788032015215894875412641425708855961584676292424041024877345434;\n\n\tuint256 constant IC16x =\n\t\t18658344448625472361514517723847121242242621605616951126291199815235032180726;\n\tuint256 constant IC16y =\n\t\t809276442226723012951716236123315663471583381870386200917746106613185945511;\n\n\tuint256 constant IC17x =\n\t\t5982511498346272830450928090657905047310027938091831616388986968174660586744;\n\tuint256 constant IC17y =\n\t\t15509127295444748557090617809365430814867930584899709527225185467490860295086;\n\n\tuint256 constant IC18x =\n\t\t15365343054745101753330314041829116085855183564203118460990124415505406826969;\n\tuint256 constant IC18y =\n\t\t17550334504170479775394246899009393639023697741142100255396130594222187928235;\n\n\tuint256 constant IC19x =\n\t\t7866355633237906295444698578127110324394052841768366342612858876150827405474;\n\tuint256 constant IC19y =\n\t\t21464430858041884878748298065323900366619776908859780580478489782011725400869;\n\n\tuint256 constant IC20x =\n\t\t11409965274336198784885022968006318806697639878378509836184034039018205539006;\n\tuint256 constant IC20y =\n\t\t2443082599914764314285778254288797740317850473858339183835017083972658705816;\n\n\tuint256 constant IC21x =\n\t\t20631196981412679591470644564470136894629638047203062147303028037747691665185;\n\tuint256 constant IC21y =\n\t\t16030610042702802775194942172772282453105682971282460674664358376585398028650;\n\n\tuint256 constant IC22x =\n\t\t5932873505001011489814504863389327841014515111140308423692006170058593510855;\n\tuint256 constant IC22y =\n\t\t17566953660226211786235303649779767015859352055560931781743606930162242017339;\n\n\tuint256 constant IC23x =\n\t\t3570407908188742187942244566545561532804329313116603204071955254293457835048;\n\tuint256 constant IC23y =\n\t\t888957545326078483334559831881533014254240676372674098014547184419455701116;\n\n\tuint256 constant IC24x =\n\t\t3277288689053454364185820642980692937625084036430455814141706935377344738916;\n\tuint256 constant IC24y =\n\t\t2696579421093670315121077129338319488278396897166913536990931383538616930167;\n\n\tuint256 constant IC25x =\n\t\t8817735724143429914354176447563561385550814562843114609784812848112341015983;\n\tuint256 constant IC25y =\n\t\t13601212939446098126684839800441456907956559897949946002758742646493707282910;\n\n\tuint256 constant IC26x =\n\t\t242520524804255889063254246699618495647968774167019791729252562138656964225;\n\tuint256 constant IC26y =\n\t\t16973052504220229148399058252278309977055266771019496607437733674562578695485;\n\n\tuint256 constant IC27x =\n\t\t9013440492883720882679839217393830253117904651891690131192913212688263035425;\n\tuint256 constant IC27y =\n\t\t2315255966339599410626919212510568554886702627946488701592576459930568620330;\n\n\tuint256 constant IC28x =\n\t\t20679024761061200931816572597032340280314547584004877718544566240873670628592;\n\tuint256 constant IC28y =\n\t\t18414855204652616530204390391588003816097467665749731519336041029937302999453;\n\n\tuint256 constant IC29x =\n\t\t15072238453926190207791223017865893501821923615348984249884825516230481256082;\n\tuint256 constant IC29y =\n\t\t8895769322320811707816032509589818173329092645233968889885933660205774178706;\n\n\tuint256 constant IC30x =\n\t\t8094336611135960044601785233929226833486685560260660169986135663954428520824;\n\tuint256 constant IC30y =\n\t\t8369015164321101629728699871242940331641480615160209965994546508586139206741;\n\n\tuint256 constant IC31x =\n\t\t7731401541551544766699504483993337254794583686019158504985376407109162651461;\n\tuint256 constant IC31y =\n\t\t6875232187288241504932091965559094778639331441478864488775043444383484728099;\n\n\tuint256 constant IC32x =\n\t\t15499568761668065997918859624568562489526362773924227148983177629553450965712;\n\tuint256 constant IC32y =\n\t\t37183277849483539583991543127527538945636653775623877772561407984346105078;\n\n\tuint256 constant IC33x =\n\t\t4830297224837660087468639850081711742034935708467584422471158078126920708577;\n\tuint256 constant IC33y =\n\t\t3176598632718619413479684717877505425106590182052247940017298335183173430555;\n\n\tuint256 constant IC34x =\n\t\t10903574547819748549732540241229407360774915035217537369261916171194637443689;\n\tuint256 constant IC34y =\n\t\t8858084338009697021205337490679360111246956214665724578280033119614287642646;\n\n\tuint256 constant IC35x =\n\t\t15154785802553093403431522473988497260639725114747604440906057109686573477260;\n\tuint256 constant IC35y =\n\t\t17795783893908215353511907097930773017805088530085337443958991067967762102655;\n\n\tuint256 constant IC36x =\n\t\t2877376750994603714365289452890690316758364618871559804575161188222888112659;\n\tuint256 constant IC36y =\n\t\t21735034166232609946148691607738854948236880094749663970921800614808406570078;\n\n\tuint256 constant IC37x =\n\t\t3106333406220985162662100498986097229503869771836880247449360175981334157219;\n\tuint256 constant IC37y =\n\t\t17865223479402419176248696836928756900496547663372228667207093311437768295043;\n\n\tuint256 constant IC38x =\n\t\t697616770606607558981076211967433584976298008163992912003754086388870284439;\n\tuint256 constant IC38y =\n\t\t11906015812090725752663954648490567553779437355520102774022319868767187695689;\n\n\tuint256 constant IC39x =\n\t\t3066310853266947605681856994423652372406552925855313167141079102185871744170;\n\tuint256 constant IC39y =\n\t\t7626480973749375313659327633446078949888566319591497861831619014932519116751;\n\n\tuint256 constant IC40x =\n\t\t15547701183470494067964667727872231581260922370486244851758214336411550884118;\n\tuint256 constant IC40y =\n\t\t17254233622002752357409825536770526543691283207810763163037848030419243484107;\n\n\tuint256 constant IC41x =\n\t\t148292111307819306551390818446543424926350137834811534314052769163101561615;\n\tuint256 constant IC41y =\n\t\t5500278154531033306799803347968647249419995483363964893976872863860493675643;\n\n\tuint256 constant IC42x =\n\t\t12743968346040894236883464766141708515376809290327284933867605208542292732858;\n\tuint256 constant IC42y =\n\t\t8018727597120067346853370292627401274187160859591238514067106241642604330800;\n\n\tuint256 constant IC43x =\n\t\t691582148862529301778359900102607488395950567870758626909238499283070907403;\n\tuint256 constant IC43y =\n\t\t8322981267261297384216741120713931240448479642727454047966782335276500598941;\n\n\tuint256 constant IC44x =\n\t\t9278556347697362408180475360650302879696956102573343825404708863886542469887;\n\tuint256 constant IC44y =\n\t\t9707313610712975990137006496452650791189150375669922886361334038088982701633;\n\n\tuint256 constant IC45x =\n\t\t16829628853824851952140218215780485977108634939746967111056084269789078029054;\n\tuint256 constant IC45y =\n\t\t4014469364669616007649171544577204356746921930709274053313209030043418033476;\n\n\tuint256 constant IC46x =\n\t\t6641507292884053256398842662760831671384924006947363057533254043701551586373;\n\tuint256 constant IC46y =\n\t\t7538020194481282455458251442306108143426114350545149178408028117651220441472;\n\n\tuint256 constant IC47x =\n\t\t12391637512080499257662827283609890066662280564827165438208548685097578037073;\n\tuint256 constant IC47y =\n\t\t19437801841177143231245408244309863501557488312715256561188881154500655967430;\n\n\tuint256 constant IC48x =\n\t\t2890419354616910106196901223286921838329798511800552609084640710443390163241;\n\tuint256 constant IC48y =\n\t\t17975752498184815248395543766804130572102816400153672759006930380470336365869;\n\n\tuint256 constant IC49x =\n\t\t6356005874902387613526417303680497717538411035346314609640597118219882038318;\n\tuint256 constant IC49y =\n\t\t8302058795733576312472765323167781290091115643523515316545093550229011458540;\n\n\tuint256 constant IC50x =\n\t\t11467131470051250993846835458840241675362424681819054061438248446919198169881;\n\tuint256 constant IC50y =\n\t\t3871876403715839319031033065719065817272850181251392446785808539701071977102;\n\n\tuint256 constant IC51x =\n\t\t15418086696872287571839851755232562114887233182615521852215658895185306876954;\n\tuint256 constant IC51y =\n\t\t15382077575814602641342651729699573330025044617981182458503295491525153173084;\n\n\tuint256 constant IC52x =\n\t\t3518987841129817544165039005314383353101340037797957633052466976442785122773;\n\tuint256 constant IC52y =\n\t\t13837229004430570059744211328338876274484428344134154507669720190847659718233;\n\n\tuint256 constant IC53x =\n\t\t7836949953256230571863851319029582093455769148252637278978059072186916563644;\n\tuint256 constant IC53y =\n\t\t16016031450925672052785771223602323332437162896094661214304742145432039577613;\n\n\tuint256 constant IC54x =\n\t\t20068450523518386339209415533919057643114001865737097665607475828358564264945;\n\tuint256 constant IC54y =\n\t\t16421501709602348379027099074800499750625346088991760891399592152922510486159;\n\n\tuint256 constant IC55x =\n\t\t6956561678992452882033176540383047718724367746360885744508319174475838500863;\n\tuint256 constant IC55y =\n\t\t852570432177137889322374252700826029568865060946246166272021327148649269580;\n\n\tuint256 constant IC56x =\n\t\t19239577481052852428204088163978921314665017300758086261251463662450612991642;\n\tuint256 constant IC56y =\n\t\t3132276701298581485739714988349614613303009325166772769288844918814734649647;\n\n\t// Memory data\n\tuint16 constant pVk = 0;\n\tuint16 constant pPairing = 128;\n\n\tuint16 constant pLastMem = 896;\n\n\tfunction verifyProof(\n\t\tuint[2] calldata _pA,\n\t\tuint[2][2] calldata _pB,\n\t\tuint[2] calldata _pC,\n\t\tuint[56] calldata _pubSignals\n\t) public view returns (bool) {\n\t\tassembly {\n\t\t\tfunction checkField(v) {\n\t\t\t\tif iszero(lt(v, r)) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// G1 function to multiply a G1 value(x,y) to value in an address\n\t\t\tfunction g1_mulAccC(pR, x, y, s) {\n\t\t\t\tlet success\n\t\t\t\tlet mIn := mload(0x40)\n\t\t\t\tmstore(mIn, x)\n\t\t\t\tmstore(add(mIn, 32), y)\n\t\t\t\tmstore(add(mIn, 64), s)\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\n\t\t\t\tmstore(add(mIn, 64), mload(pR))\n\t\t\t\tmstore(add(mIn, 96), mload(add(pR, 32)))\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n\t\t\t\tlet _pPairing := add(pMem, pPairing)\n\t\t\t\tlet _pVk := add(pMem, pVk)\n\n\t\t\t\tmstore(_pVk, IC0x)\n\t\t\t\tmstore(add(_pVk, 32), IC0y)\n\n\t\t\t\t// Compute the linear combination vk_x\n\n\t\t\t\tg1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC10x,\n\t\t\t\t\tIC10y,\n\t\t\t\t\tcalldataload(add(pubSignals, 288))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC11x,\n\t\t\t\t\tIC11y,\n\t\t\t\t\tcalldataload(add(pubSignals, 320))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC12x,\n\t\t\t\t\tIC12y,\n\t\t\t\t\tcalldataload(add(pubSignals, 352))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC13x,\n\t\t\t\t\tIC13y,\n\t\t\t\t\tcalldataload(add(pubSignals, 384))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC14x,\n\t\t\t\t\tIC14y,\n\t\t\t\t\tcalldataload(add(pubSignals, 416))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC15x,\n\t\t\t\t\tIC15y,\n\t\t\t\t\tcalldataload(add(pubSignals, 448))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC16x,\n\t\t\t\t\tIC16y,\n\t\t\t\t\tcalldataload(add(pubSignals, 480))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC17x,\n\t\t\t\t\tIC17y,\n\t\t\t\t\tcalldataload(add(pubSignals, 512))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC18x,\n\t\t\t\t\tIC18y,\n\t\t\t\t\tcalldataload(add(pubSignals, 544))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC19x,\n\t\t\t\t\tIC19y,\n\t\t\t\t\tcalldataload(add(pubSignals, 576))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC20x,\n\t\t\t\t\tIC20y,\n\t\t\t\t\tcalldataload(add(pubSignals, 608))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC21x,\n\t\t\t\t\tIC21y,\n\t\t\t\t\tcalldataload(add(pubSignals, 640))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC22x,\n\t\t\t\t\tIC22y,\n\t\t\t\t\tcalldataload(add(pubSignals, 672))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC23x,\n\t\t\t\t\tIC23y,\n\t\t\t\t\tcalldataload(add(pubSignals, 704))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC24x,\n\t\t\t\t\tIC24y,\n\t\t\t\t\tcalldataload(add(pubSignals, 736))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC25x,\n\t\t\t\t\tIC25y,\n\t\t\t\t\tcalldataload(add(pubSignals, 768))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC26x,\n\t\t\t\t\tIC26y,\n\t\t\t\t\tcalldataload(add(pubSignals, 800))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC27x,\n\t\t\t\t\tIC27y,\n\t\t\t\t\tcalldataload(add(pubSignals, 832))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC28x,\n\t\t\t\t\tIC28y,\n\t\t\t\t\tcalldataload(add(pubSignals, 864))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC29x,\n\t\t\t\t\tIC29y,\n\t\t\t\t\tcalldataload(add(pubSignals, 896))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC30x,\n\t\t\t\t\tIC30y,\n\t\t\t\t\tcalldataload(add(pubSignals, 928))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC31x,\n\t\t\t\t\tIC31y,\n\t\t\t\t\tcalldataload(add(pubSignals, 960))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC32x,\n\t\t\t\t\tIC32y,\n\t\t\t\t\tcalldataload(add(pubSignals, 992))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC33x,\n\t\t\t\t\tIC33y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1024))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC34x,\n\t\t\t\t\tIC34y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1056))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC35x,\n\t\t\t\t\tIC35y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1088))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC36x,\n\t\t\t\t\tIC36y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1120))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC37x,\n\t\t\t\t\tIC37y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1152))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC38x,\n\t\t\t\t\tIC38y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1184))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC39x,\n\t\t\t\t\tIC39y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1216))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC40x,\n\t\t\t\t\tIC40y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1248))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC41x,\n\t\t\t\t\tIC41y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1280))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC42x,\n\t\t\t\t\tIC42y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1312))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC43x,\n\t\t\t\t\tIC43y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1344))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC44x,\n\t\t\t\t\tIC44y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1376))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC45x,\n\t\t\t\t\tIC45y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1408))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC46x,\n\t\t\t\t\tIC46y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1440))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC47x,\n\t\t\t\t\tIC47y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1472))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC48x,\n\t\t\t\t\tIC48y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1504))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC49x,\n\t\t\t\t\tIC49y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1536))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC50x,\n\t\t\t\t\tIC50y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1568))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC51x,\n\t\t\t\t\tIC51y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1600))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC52x,\n\t\t\t\t\tIC52y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1632))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC53x,\n\t\t\t\t\tIC53y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1664))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC54x,\n\t\t\t\t\tIC54y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1696))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC55x,\n\t\t\t\t\tIC55y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1728))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC56x,\n\t\t\t\t\tIC56y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1760))\n\t\t\t\t)\n\n\t\t\t\t// -A\n\t\t\t\tmstore(_pPairing, calldataload(pA))\n\t\t\t\tmstore(\n\t\t\t\t\tadd(_pPairing, 32),\n\t\t\t\t\tmod(sub(q, calldataload(add(pA, 32))), q)\n\t\t\t\t)\n\n\t\t\t\t// B\n\t\t\t\tmstore(add(_pPairing, 64), calldataload(pB))\n\t\t\t\tmstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n\t\t\t\tmstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n\t\t\t\tmstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n\t\t\t\t// alpha1\n\t\t\t\tmstore(add(_pPairing, 192), alphax)\n\t\t\t\tmstore(add(_pPairing, 224), alphay)\n\n\t\t\t\t// beta2\n\t\t\t\tmstore(add(_pPairing, 256), betax1)\n\t\t\t\tmstore(add(_pPairing, 288), betax2)\n\t\t\t\tmstore(add(_pPairing, 320), betay1)\n\t\t\t\tmstore(add(_pPairing, 352), betay2)\n\n\t\t\t\t// vk_x\n\t\t\t\tmstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n\t\t\t\tmstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\t\t\t\t// gamma2\n\t\t\t\tmstore(add(_pPairing, 448), gammax1)\n\t\t\t\tmstore(add(_pPairing, 480), gammax2)\n\t\t\t\tmstore(add(_pPairing, 512), gammay1)\n\t\t\t\tmstore(add(_pPairing, 544), gammay2)\n\n\t\t\t\t// C\n\t\t\t\tmstore(add(_pPairing, 576), calldataload(pC))\n\t\t\t\tmstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n\t\t\t\t// delta2\n\t\t\t\tmstore(add(_pPairing, 640), deltax1)\n\t\t\t\tmstore(add(_pPairing, 672), deltax2)\n\t\t\t\tmstore(add(_pPairing, 704), deltay1)\n\t\t\t\tmstore(add(_pPairing, 736), deltay2)\n\n\t\t\t\tlet success := staticcall(\n\t\t\t\t\tsub(gas(), 2000),\n\t\t\t\t\t8,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t768,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t0x20\n\t\t\t\t)\n\n\t\t\t\tisOk := and(success, mload(_pPairing))\n\t\t\t}\n\n\t\t\tlet pMem := mload(0x40)\n\t\t\tmstore(0x40, add(pMem, pLastMem))\n\n\t\t\t// Validate that all evaluations ∈ F\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 0)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 32)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 64)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 96)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 128)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 160)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 192)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 224)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 256)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 288)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 320)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 352)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 384)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 416)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 448)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 480)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 512)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 544)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 576)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 608)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 640)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 672)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 704)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 736)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 768)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 800)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 832)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 864)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 896)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 928)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 960)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 992)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1024)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1056)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1088)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1120)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1152)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1184)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1216)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1248)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1280)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1312)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1344)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1376)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1408)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1440)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1472)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1504)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1536)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1568)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1600)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1632)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1664)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1696)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1728)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1760)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1792)))\n\n\t\t\t// Validate all evaluations\n\t\t\tlet isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n\t\t\tmstore(0, isValid)\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/Poseidon.sol": { + "content": "/// SPDX-License-Identifier: MIT\npragma solidity >=0.7.0;\n\ncontract Poseidon {\n\tuint constant M00 =\n\t\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\n\tuint constant M01 =\n\t\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\n\tuint constant M10 =\n\t\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\n\tuint constant M11 =\n\t\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\n\n\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\n\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\n\tfunction hash(uint[1] memory) public pure returns (uint) {\n\t\tassembly {\n\t\t\tlet\n\t\t\t\tF\n\t\t\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\n\n\t\t\t// load the inputs from memory\n\t\t\tlet state1 := add(\n\t\t\t\tmod(mload(0x80), F),\n\t\t\t\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\n\t\t\t)\n\t\t\tlet scratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\n\t\t\t\tadd(\n\t\t\t\t\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\n\t\t\t\t\tmulmod(state1, M10, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet scratch1 := add(\n\t\t\t\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\n\t\t\t\tadd(\n\t\t\t\t\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\n\t\t\t\t\tmulmod(state1, M11, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet state0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\n\t\t\tmstore(\n\t\t\t\t0x0,\n\t\t\t\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\n\t\t\t)\n\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/PotionToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.0 <0.9.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\n\n/**\n * ERC20 potion token contract\n */\ncontract PotionToken is ERC20, AccessControl {\n bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\n\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\n }\n\n function decimals() public pure override returns (uint8) {\n return 0;\n }\n\n function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\n require(!hasRole(DEFAULT_ADMIN_ROLE, newOwner), \"Ownable: new owner already have admin role\");\n\n grantRole(DEFAULT_ADMIN_ROLE, newOwner);\n renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);\n }\n\n function grantMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\n grantRole(MINTER_ROLE, account);\n }\n\n function revokeMinterRole(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {\n revokeRole(MINTER_ROLE, account);\n }\n\n function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {\n _mint(to, amount);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/hardhat/deployments/optimismSepolia/solcInputs/f11f926ae4f4bca312ca3f2182859797.json b/packages/hardhat/deployments/optimismSepolia/solcInputs/f11f926ae4f4bca312ca3f2182859797.json new file mode 100644 index 0000000..1be9e34 --- /dev/null +++ b/packages/hardhat/deployments/optimismSepolia/solcInputs/f11f926ae4f4bca312ca3f2182859797.json @@ -0,0 +1,71 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n * that `ownerOf(tokenId)` is `a`.\n */\n // solhint-disable-next-line func-name-mixedcase\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\n _balances[account] += amount;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\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, it is bubbled up by this\n * function (like regular Solidity function calls).\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 * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\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 * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "contracts/Groth16Verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n\t// Scalar field size\n\tuint256 constant r =\n\t\t21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\t// Base field size\n\tuint256 constant q =\n\t\t21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n\t// Verification Key data\n\tuint256 constant alphax =\n\t\t20491192805390485299153009773594534940189261866228447918068658471970481763042;\n\tuint256 constant alphay =\n\t\t9383485363053290200918347156157836566562967994039712273449902621266178545958;\n\tuint256 constant betax1 =\n\t\t4252822878758300859123897981450591353533073413197771768651442665752259397132;\n\tuint256 constant betax2 =\n\t\t6375614351688725206403948262868962793625744043794305715222011528459656738731;\n\tuint256 constant betay1 =\n\t\t21847035105528745403288232691147584728191162732299865338377159692350059136679;\n\tuint256 constant betay2 =\n\t\t10505242626370262277552901082094356697409835680220590971873171140371331206856;\n\tuint256 constant gammax1 =\n\t\t11559732032986387107991004021392285783925812861821192530917403151452391805634;\n\tuint256 constant gammax2 =\n\t\t10857046999023057135944570762232829481370756359578518086990519993285655852781;\n\tuint256 constant gammay1 =\n\t\t4082367875863433681332203403145435568316851327593401208105741076214120093531;\n\tuint256 constant gammay2 =\n\t\t8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\tuint256 constant deltax1 =\n\t\t1866766967684475077026429609556327106093807957741725946793964808023715990993;\n\tuint256 constant deltax2 =\n\t\t4659311190982864441450729518864924847905216029076592248289990634575680082687;\n\tuint256 constant deltay1 =\n\t\t21724169671419676774033717936126866779574439945101235323290178202491573424937;\n\tuint256 constant deltay2 =\n\t\t18110855247484914672502198436947586961718950553755585790284240244644051838539;\n\n\tuint256 constant IC0x =\n\t\t18309573688944280386125138623088688452809083872692035376744546048640448830013;\n\tuint256 constant IC0y =\n\t\t8252545664804877655090584019431224476651831706926205661274438486717503078517;\n\n\tuint256 constant IC1x =\n\t\t13724968256971608639683042303568749222860593419566750935710775838848837986435;\n\tuint256 constant IC1y =\n\t\t15381662839978225352321616022337218020109204566049031666416886460526425965869;\n\n\tuint256 constant IC2x =\n\t\t6658337158533056435209096505560783453195590085837382213813946443291522907745;\n\tuint256 constant IC2y =\n\t\t9306572662774936565995161999022633816072552576090366864841219594069985311045;\n\n\tuint256 constant IC3x =\n\t\t3016212379656281472280944594543865425517575371433088764117523134258049272378;\n\tuint256 constant IC3y =\n\t\t2602541768252815682625947578833586588696693258602863952863513327213075022415;\n\n\tuint256 constant IC4x =\n\t\t9816742021460791515218039132784611020094104961681834748400830069126900470998;\n\tuint256 constant IC4y =\n\t\t10348426808259784844463456918035576955520609745619107315011093049401321052907;\n\n\tuint256 constant IC5x =\n\t\t12390552360156525734091763827502679328587811743107273011015150606880160766528;\n\tuint256 constant IC5y =\n\t\t183638701568878646260356724728606591551612270852066271019765173548740571911;\n\n\tuint256 constant IC6x =\n\t\t18835793819754396966418324264338243421396665011470795519919492253397941511415;\n\tuint256 constant IC6y =\n\t\t16276864664271038368712888193551459260270588753753324433645906101416426262868;\n\n\tuint256 constant IC7x =\n\t\t17694389750473427714713340305217978269360025960743432126841431716792259216553;\n\tuint256 constant IC7y =\n\t\t9650947012756037818471691383867973710225705683344930781931870909910681707965;\n\n\tuint256 constant IC8x =\n\t\t681023809986507260745544777274775765194577408747661170783243702960142805219;\n\tuint256 constant IC8y =\n\t\t1932661796175590584789349969886643788412159408887985979675775490813383802431;\n\n\tuint256 constant IC9x =\n\t\t21017849571203201162910042984857063559850050358879473333160388606658656055561;\n\tuint256 constant IC9y =\n\t\t3911553907221003467466493259384657847945603900216601273901250192843649327135;\n\n\tuint256 constant IC10x =\n\t\t4697167604081360102767597310388954224248974287943019142969867281938252033279;\n\tuint256 constant IC10y =\n\t\t20914530672636702782558652284783707697405729135251189269702367472029790810871;\n\n\tuint256 constant IC11x =\n\t\t7369949482368171676645913938455574124222481706187847883741316060813160352388;\n\tuint256 constant IC11y =\n\t\t4727140828630085863185239991710228583927761523693680497222423087252568656621;\n\n\tuint256 constant IC12x =\n\t\t14064206758912584845837663247671777117618297224535288981280182234011836042358;\n\tuint256 constant IC12y =\n\t\t2471602382851033672482675609087779227944480110933367708761146613365806260639;\n\n\tuint256 constant IC13x =\n\t\t10736269799746324370561665190090163352937604329850809414102258159966416105084;\n\tuint256 constant IC13y =\n\t\t19020761783205714677938272320357485323859845690764961473649357529923739843742;\n\n\tuint256 constant IC14x =\n\t\t15341136362541358347806190520786075906481708522139600214759885728822520600097;\n\tuint256 constant IC14y =\n\t\t12763186920235818095034854522833621355232606893991661714344676885217537892439;\n\n\tuint256 constant IC15x =\n\t\t578923187875322718929551148864821444409122480112505090445143545076478253219;\n\tuint256 constant IC15y =\n\t\t7225896456622788032015215894875412641425708855961584676292424041024877345434;\n\n\tuint256 constant IC16x =\n\t\t18658344448625472361514517723847121242242621605616951126291199815235032180726;\n\tuint256 constant IC16y =\n\t\t809276442226723012951716236123315663471583381870386200917746106613185945511;\n\n\tuint256 constant IC17x =\n\t\t5982511498346272830450928090657905047310027938091831616388986968174660586744;\n\tuint256 constant IC17y =\n\t\t15509127295444748557090617809365430814867930584899709527225185467490860295086;\n\n\tuint256 constant IC18x =\n\t\t15365343054745101753330314041829116085855183564203118460990124415505406826969;\n\tuint256 constant IC18y =\n\t\t17550334504170479775394246899009393639023697741142100255396130594222187928235;\n\n\tuint256 constant IC19x =\n\t\t7866355633237906295444698578127110324394052841768366342612858876150827405474;\n\tuint256 constant IC19y =\n\t\t21464430858041884878748298065323900366619776908859780580478489782011725400869;\n\n\tuint256 constant IC20x =\n\t\t11409965274336198784885022968006318806697639878378509836184034039018205539006;\n\tuint256 constant IC20y =\n\t\t2443082599914764314285778254288797740317850473858339183835017083972658705816;\n\n\tuint256 constant IC21x =\n\t\t20631196981412679591470644564470136894629638047203062147303028037747691665185;\n\tuint256 constant IC21y =\n\t\t16030610042702802775194942172772282453105682971282460674664358376585398028650;\n\n\tuint256 constant IC22x =\n\t\t5932873505001011489814504863389327841014515111140308423692006170058593510855;\n\tuint256 constant IC22y =\n\t\t17566953660226211786235303649779767015859352055560931781743606930162242017339;\n\n\tuint256 constant IC23x =\n\t\t3570407908188742187942244566545561532804329313116603204071955254293457835048;\n\tuint256 constant IC23y =\n\t\t888957545326078483334559831881533014254240676372674098014547184419455701116;\n\n\tuint256 constant IC24x =\n\t\t3277288689053454364185820642980692937625084036430455814141706935377344738916;\n\tuint256 constant IC24y =\n\t\t2696579421093670315121077129338319488278396897166913536990931383538616930167;\n\n\tuint256 constant IC25x =\n\t\t8817735724143429914354176447563561385550814562843114609784812848112341015983;\n\tuint256 constant IC25y =\n\t\t13601212939446098126684839800441456907956559897949946002758742646493707282910;\n\n\tuint256 constant IC26x =\n\t\t242520524804255889063254246699618495647968774167019791729252562138656964225;\n\tuint256 constant IC26y =\n\t\t16973052504220229148399058252278309977055266771019496607437733674562578695485;\n\n\tuint256 constant IC27x =\n\t\t9013440492883720882679839217393830253117904651891690131192913212688263035425;\n\tuint256 constant IC27y =\n\t\t2315255966339599410626919212510568554886702627946488701592576459930568620330;\n\n\tuint256 constant IC28x =\n\t\t20679024761061200931816572597032340280314547584004877718544566240873670628592;\n\tuint256 constant IC28y =\n\t\t18414855204652616530204390391588003816097467665749731519336041029937302999453;\n\n\tuint256 constant IC29x =\n\t\t15072238453926190207791223017865893501821923615348984249884825516230481256082;\n\tuint256 constant IC29y =\n\t\t8895769322320811707816032509589818173329092645233968889885933660205774178706;\n\n\tuint256 constant IC30x =\n\t\t8094336611135960044601785233929226833486685560260660169986135663954428520824;\n\tuint256 constant IC30y =\n\t\t8369015164321101629728699871242940331641480615160209965994546508586139206741;\n\n\tuint256 constant IC31x =\n\t\t7731401541551544766699504483993337254794583686019158504985376407109162651461;\n\tuint256 constant IC31y =\n\t\t6875232187288241504932091965559094778639331441478864488775043444383484728099;\n\n\tuint256 constant IC32x =\n\t\t15499568761668065997918859624568562489526362773924227148983177629553450965712;\n\tuint256 constant IC32y =\n\t\t37183277849483539583991543127527538945636653775623877772561407984346105078;\n\n\tuint256 constant IC33x =\n\t\t4830297224837660087468639850081711742034935708467584422471158078126920708577;\n\tuint256 constant IC33y =\n\t\t3176598632718619413479684717877505425106590182052247940017298335183173430555;\n\n\tuint256 constant IC34x =\n\t\t10903574547819748549732540241229407360774915035217537369261916171194637443689;\n\tuint256 constant IC34y =\n\t\t8858084338009697021205337490679360111246956214665724578280033119614287642646;\n\n\tuint256 constant IC35x =\n\t\t15154785802553093403431522473988497260639725114747604440906057109686573477260;\n\tuint256 constant IC35y =\n\t\t17795783893908215353511907097930773017805088530085337443958991067967762102655;\n\n\tuint256 constant IC36x =\n\t\t2877376750994603714365289452890690316758364618871559804575161188222888112659;\n\tuint256 constant IC36y =\n\t\t21735034166232609946148691607738854948236880094749663970921800614808406570078;\n\n\tuint256 constant IC37x =\n\t\t3106333406220985162662100498986097229503869771836880247449360175981334157219;\n\tuint256 constant IC37y =\n\t\t17865223479402419176248696836928756900496547663372228667207093311437768295043;\n\n\tuint256 constant IC38x =\n\t\t697616770606607558981076211967433584976298008163992912003754086388870284439;\n\tuint256 constant IC38y =\n\t\t11906015812090725752663954648490567553779437355520102774022319868767187695689;\n\n\tuint256 constant IC39x =\n\t\t3066310853266947605681856994423652372406552925855313167141079102185871744170;\n\tuint256 constant IC39y =\n\t\t7626480973749375313659327633446078949888566319591497861831619014932519116751;\n\n\tuint256 constant IC40x =\n\t\t15547701183470494067964667727872231581260922370486244851758214336411550884118;\n\tuint256 constant IC40y =\n\t\t17254233622002752357409825536770526543691283207810763163037848030419243484107;\n\n\tuint256 constant IC41x =\n\t\t148292111307819306551390818446543424926350137834811534314052769163101561615;\n\tuint256 constant IC41y =\n\t\t5500278154531033306799803347968647249419995483363964893976872863860493675643;\n\n\tuint256 constant IC42x =\n\t\t12743968346040894236883464766141708515376809290327284933867605208542292732858;\n\tuint256 constant IC42y =\n\t\t8018727597120067346853370292627401274187160859591238514067106241642604330800;\n\n\tuint256 constant IC43x =\n\t\t691582148862529301778359900102607488395950567870758626909238499283070907403;\n\tuint256 constant IC43y =\n\t\t8322981267261297384216741120713931240448479642727454047966782335276500598941;\n\n\tuint256 constant IC44x =\n\t\t9278556347697362408180475360650302879696956102573343825404708863886542469887;\n\tuint256 constant IC44y =\n\t\t9707313610712975990137006496452650791189150375669922886361334038088982701633;\n\n\tuint256 constant IC45x =\n\t\t16829628853824851952140218215780485977108634939746967111056084269789078029054;\n\tuint256 constant IC45y =\n\t\t4014469364669616007649171544577204356746921930709274053313209030043418033476;\n\n\tuint256 constant IC46x =\n\t\t6641507292884053256398842662760831671384924006947363057533254043701551586373;\n\tuint256 constant IC46y =\n\t\t7538020194481282455458251442306108143426114350545149178408028117651220441472;\n\n\tuint256 constant IC47x =\n\t\t12391637512080499257662827283609890066662280564827165438208548685097578037073;\n\tuint256 constant IC47y =\n\t\t19437801841177143231245408244309863501557488312715256561188881154500655967430;\n\n\tuint256 constant IC48x =\n\t\t2890419354616910106196901223286921838329798511800552609084640710443390163241;\n\tuint256 constant IC48y =\n\t\t17975752498184815248395543766804130572102816400153672759006930380470336365869;\n\n\tuint256 constant IC49x =\n\t\t6356005874902387613526417303680497717538411035346314609640597118219882038318;\n\tuint256 constant IC49y =\n\t\t8302058795733576312472765323167781290091115643523515316545093550229011458540;\n\n\tuint256 constant IC50x =\n\t\t11467131470051250993846835458840241675362424681819054061438248446919198169881;\n\tuint256 constant IC50y =\n\t\t3871876403715839319031033065719065817272850181251392446785808539701071977102;\n\n\tuint256 constant IC51x =\n\t\t15418086696872287571839851755232562114887233182615521852215658895185306876954;\n\tuint256 constant IC51y =\n\t\t15382077575814602641342651729699573330025044617981182458503295491525153173084;\n\n\tuint256 constant IC52x =\n\t\t3518987841129817544165039005314383353101340037797957633052466976442785122773;\n\tuint256 constant IC52y =\n\t\t13837229004430570059744211328338876274484428344134154507669720190847659718233;\n\n\tuint256 constant IC53x =\n\t\t7836949953256230571863851319029582093455769148252637278978059072186916563644;\n\tuint256 constant IC53y =\n\t\t16016031450925672052785771223602323332437162896094661214304742145432039577613;\n\n\tuint256 constant IC54x =\n\t\t20068450523518386339209415533919057643114001865737097665607475828358564264945;\n\tuint256 constant IC54y =\n\t\t16421501709602348379027099074800499750625346088991760891399592152922510486159;\n\n\tuint256 constant IC55x =\n\t\t6956561678992452882033176540383047718724367746360885744508319174475838500863;\n\tuint256 constant IC55y =\n\t\t852570432177137889322374252700826029568865060946246166272021327148649269580;\n\n\tuint256 constant IC56x =\n\t\t19239577481052852428204088163978921314665017300758086261251463662450612991642;\n\tuint256 constant IC56y =\n\t\t3132276701298581485739714988349614613303009325166772769288844918814734649647;\n\n\t// Memory data\n\tuint16 constant pVk = 0;\n\tuint16 constant pPairing = 128;\n\n\tuint16 constant pLastMem = 896;\n\n\tfunction verifyProof(\n\t\tuint[2] calldata _pA,\n\t\tuint[2][2] calldata _pB,\n\t\tuint[2] calldata _pC,\n\t\tuint[56] calldata _pubSignals\n\t) public view returns (bool) {\n\t\tassembly {\n\t\t\tfunction checkField(v) {\n\t\t\t\tif iszero(lt(v, r)) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// G1 function to multiply a G1 value(x,y) to value in an address\n\t\t\tfunction g1_mulAccC(pR, x, y, s) {\n\t\t\t\tlet success\n\t\t\t\tlet mIn := mload(0x40)\n\t\t\t\tmstore(mIn, x)\n\t\t\t\tmstore(add(mIn, 32), y)\n\t\t\t\tmstore(add(mIn, 64), s)\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\n\t\t\t\tmstore(add(mIn, 64), mload(pR))\n\t\t\t\tmstore(add(mIn, 96), mload(add(pR, 32)))\n\n\t\t\t\tsuccess := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n\t\t\t\tif iszero(success) {\n\t\t\t\t\tmstore(0, 0)\n\t\t\t\t\treturn(0, 0x20)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n\t\t\t\tlet _pPairing := add(pMem, pPairing)\n\t\t\t\tlet _pVk := add(pMem, pVk)\n\n\t\t\t\tmstore(_pVk, IC0x)\n\t\t\t\tmstore(add(_pVk, 32), IC0y)\n\n\t\t\t\t// Compute the linear combination vk_x\n\n\t\t\t\tg1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n\t\t\t\tg1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC10x,\n\t\t\t\t\tIC10y,\n\t\t\t\t\tcalldataload(add(pubSignals, 288))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC11x,\n\t\t\t\t\tIC11y,\n\t\t\t\t\tcalldataload(add(pubSignals, 320))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC12x,\n\t\t\t\t\tIC12y,\n\t\t\t\t\tcalldataload(add(pubSignals, 352))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC13x,\n\t\t\t\t\tIC13y,\n\t\t\t\t\tcalldataload(add(pubSignals, 384))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC14x,\n\t\t\t\t\tIC14y,\n\t\t\t\t\tcalldataload(add(pubSignals, 416))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC15x,\n\t\t\t\t\tIC15y,\n\t\t\t\t\tcalldataload(add(pubSignals, 448))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC16x,\n\t\t\t\t\tIC16y,\n\t\t\t\t\tcalldataload(add(pubSignals, 480))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC17x,\n\t\t\t\t\tIC17y,\n\t\t\t\t\tcalldataload(add(pubSignals, 512))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC18x,\n\t\t\t\t\tIC18y,\n\t\t\t\t\tcalldataload(add(pubSignals, 544))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC19x,\n\t\t\t\t\tIC19y,\n\t\t\t\t\tcalldataload(add(pubSignals, 576))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC20x,\n\t\t\t\t\tIC20y,\n\t\t\t\t\tcalldataload(add(pubSignals, 608))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC21x,\n\t\t\t\t\tIC21y,\n\t\t\t\t\tcalldataload(add(pubSignals, 640))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC22x,\n\t\t\t\t\tIC22y,\n\t\t\t\t\tcalldataload(add(pubSignals, 672))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC23x,\n\t\t\t\t\tIC23y,\n\t\t\t\t\tcalldataload(add(pubSignals, 704))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC24x,\n\t\t\t\t\tIC24y,\n\t\t\t\t\tcalldataload(add(pubSignals, 736))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC25x,\n\t\t\t\t\tIC25y,\n\t\t\t\t\tcalldataload(add(pubSignals, 768))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC26x,\n\t\t\t\t\tIC26y,\n\t\t\t\t\tcalldataload(add(pubSignals, 800))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC27x,\n\t\t\t\t\tIC27y,\n\t\t\t\t\tcalldataload(add(pubSignals, 832))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC28x,\n\t\t\t\t\tIC28y,\n\t\t\t\t\tcalldataload(add(pubSignals, 864))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC29x,\n\t\t\t\t\tIC29y,\n\t\t\t\t\tcalldataload(add(pubSignals, 896))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC30x,\n\t\t\t\t\tIC30y,\n\t\t\t\t\tcalldataload(add(pubSignals, 928))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC31x,\n\t\t\t\t\tIC31y,\n\t\t\t\t\tcalldataload(add(pubSignals, 960))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC32x,\n\t\t\t\t\tIC32y,\n\t\t\t\t\tcalldataload(add(pubSignals, 992))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC33x,\n\t\t\t\t\tIC33y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1024))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC34x,\n\t\t\t\t\tIC34y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1056))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC35x,\n\t\t\t\t\tIC35y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1088))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC36x,\n\t\t\t\t\tIC36y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1120))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC37x,\n\t\t\t\t\tIC37y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1152))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC38x,\n\t\t\t\t\tIC38y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1184))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC39x,\n\t\t\t\t\tIC39y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1216))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC40x,\n\t\t\t\t\tIC40y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1248))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC41x,\n\t\t\t\t\tIC41y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1280))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC42x,\n\t\t\t\t\tIC42y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1312))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC43x,\n\t\t\t\t\tIC43y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1344))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC44x,\n\t\t\t\t\tIC44y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1376))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC45x,\n\t\t\t\t\tIC45y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1408))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC46x,\n\t\t\t\t\tIC46y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1440))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC47x,\n\t\t\t\t\tIC47y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1472))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC48x,\n\t\t\t\t\tIC48y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1504))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC49x,\n\t\t\t\t\tIC49y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1536))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC50x,\n\t\t\t\t\tIC50y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1568))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC51x,\n\t\t\t\t\tIC51y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1600))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC52x,\n\t\t\t\t\tIC52y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1632))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC53x,\n\t\t\t\t\tIC53y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1664))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC54x,\n\t\t\t\t\tIC54y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1696))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC55x,\n\t\t\t\t\tIC55y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1728))\n\t\t\t\t)\n\n\t\t\t\tg1_mulAccC(\n\t\t\t\t\t_pVk,\n\t\t\t\t\tIC56x,\n\t\t\t\t\tIC56y,\n\t\t\t\t\tcalldataload(add(pubSignals, 1760))\n\t\t\t\t)\n\n\t\t\t\t// -A\n\t\t\t\tmstore(_pPairing, calldataload(pA))\n\t\t\t\tmstore(\n\t\t\t\t\tadd(_pPairing, 32),\n\t\t\t\t\tmod(sub(q, calldataload(add(pA, 32))), q)\n\t\t\t\t)\n\n\t\t\t\t// B\n\t\t\t\tmstore(add(_pPairing, 64), calldataload(pB))\n\t\t\t\tmstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n\t\t\t\tmstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n\t\t\t\tmstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n\t\t\t\t// alpha1\n\t\t\t\tmstore(add(_pPairing, 192), alphax)\n\t\t\t\tmstore(add(_pPairing, 224), alphay)\n\n\t\t\t\t// beta2\n\t\t\t\tmstore(add(_pPairing, 256), betax1)\n\t\t\t\tmstore(add(_pPairing, 288), betax2)\n\t\t\t\tmstore(add(_pPairing, 320), betay1)\n\t\t\t\tmstore(add(_pPairing, 352), betay2)\n\n\t\t\t\t// vk_x\n\t\t\t\tmstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n\t\t\t\tmstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\t\t\t\t// gamma2\n\t\t\t\tmstore(add(_pPairing, 448), gammax1)\n\t\t\t\tmstore(add(_pPairing, 480), gammax2)\n\t\t\t\tmstore(add(_pPairing, 512), gammay1)\n\t\t\t\tmstore(add(_pPairing, 544), gammay2)\n\n\t\t\t\t// C\n\t\t\t\tmstore(add(_pPairing, 576), calldataload(pC))\n\t\t\t\tmstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n\t\t\t\t// delta2\n\t\t\t\tmstore(add(_pPairing, 640), deltax1)\n\t\t\t\tmstore(add(_pPairing, 672), deltax2)\n\t\t\t\tmstore(add(_pPairing, 704), deltay1)\n\t\t\t\tmstore(add(_pPairing, 736), deltay2)\n\n\t\t\t\tlet success := staticcall(\n\t\t\t\t\tsub(gas(), 2000),\n\t\t\t\t\t8,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t768,\n\t\t\t\t\t_pPairing,\n\t\t\t\t\t0x20\n\t\t\t\t)\n\n\t\t\t\tisOk := and(success, mload(_pPairing))\n\t\t\t}\n\n\t\t\tlet pMem := mload(0x40)\n\t\t\tmstore(0x40, add(pMem, pLastMem))\n\n\t\t\t// Validate that all evaluations ∈ F\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 0)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 32)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 64)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 96)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 128)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 160)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 192)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 224)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 256)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 288)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 320)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 352)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 384)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 416)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 448)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 480)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 512)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 544)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 576)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 608)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 640)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 672)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 704)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 736)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 768)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 800)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 832)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 864)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 896)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 928)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 960)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 992)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1024)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1056)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1088)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1120)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1152)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1184)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1216)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1248)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1280)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1312)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1344)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1376)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1408)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1440)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1472)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1504)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1536)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1568)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1600)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1632)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1664)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1696)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1728)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1760)))\n\n\t\t\tcheckField(calldataload(add(_pubSignals, 1792)))\n\n\t\t\t// Validate all evaluations\n\t\t\tlet isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n\t\t\tmstore(0, isValid)\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/Poseidon.sol": { + "content": "/// SPDX-License-Identifier: MIT\npragma solidity >=0.7.0;\n\ncontract Poseidon {\n\tuint constant M00 =\n\t\t0x066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5;\n\tuint constant M01 =\n\t\t0x0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff9;\n\tuint constant M10 =\n\t\t0x2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8;\n\tuint constant M11 =\n\t\t0x1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8;\n\n\t// See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\n\t// Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\n\tfunction hash(uint[1] memory) public pure returns (uint) {\n\t\tassembly {\n\t\t\tlet\n\t\t\t\tF\n\t\t\t:= 21888242871839275222246405745257275088548364400416034343698204186575808495617\n\n\t\t\t// load the inputs from memory\n\t\t\tlet state1 := add(\n\t\t\t\tmod(mload(0x80), F),\n\t\t\t\t0x0c0356530896eec42a97ed937f3135cfc5142b3ae405b8343c1d83ffa604cb81\n\t\t\t)\n\t\t\tlet scratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e28a1d935698ad1142e51182bb54cf4a00ea5aabd6268bd317ea977cc154a30,\n\t\t\t\tadd(\n\t\t\t\t\t2135211596334038589877319861485022046541061518379136709265746501298180122869,\n\t\t\t\t\tmulmod(state1, M10, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet scratch1 := add(\n\t\t\t\t0x27af2d831a9d2748080965db30e298e40e5757c3e008db964cf9e2b12b91251f,\n\t\t\t\tadd(\n\t\t\t\t\t14770526369429531795265880089668477939070475643153877209429555040029415045210,\n\t\t\t\t\tmulmod(state1, M11, F)\n\t\t\t\t)\n\t\t\t)\n\t\t\tlet state0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1e6f11ce60fc8f513a6a3cfe16ae175a41291462f214cd0879aaf43545b74e03,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2a67384d3bbd5e438541819cb681f0be04462ed14c3613d8f719206268d142d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0b66fdf356093a611609f8e12fbfecf0b985e381f025188936408f5d5c9f45d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x012ee3ec1e78d470830c61093c2ade370b26c83cc5cebeeddaa6852dbdb09e21,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0252ba5f6760bfbdfd88f67f8175e3fd6cd1c431b099b6bb2d108e7b445bb1b9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x179474cceca5ff676c6bec3cef54296354391a8935ff71d6ef5aeaad7ca932f1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2c24261379a51bfa9228ff4a503fd4ed9c1f974a264969b37e1a2589bbed2b91,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1cc1d7b62692e63eac2f288bd0695b43c2f63f5001fc0fc553e66c0551801b05,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x255059301aada98bb2ed55f852979e9600784dbf17fbacd05d9eff5fd9c91b56,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x28437be3ac1cb2e479e1f5c0eccd32b3aea24234970a8193b11c29ce7e59efd9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x28216a442f2e1f711ca4fa6b53766eb118548da8fb4f78d4338762c37f5f2043,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c1f47cd17fa5adf1f39f4e7056dd03feee1efce03094581131f2377323482c9,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x07abad02b7a5ebc48632bcc9356ceb7dd9dafca276638a63646b8566a621afc9,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0230264601ffdf29275b33ffaab51dfe9429f90880a69cd137da0c4d15f96c3c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1bc973054e51d905a0f168656497ca40a864414557ee289e717e5d66899aa0a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2e1c22f964435008206c3157e86341edd249aff5c2d8421f2a6b22288f0a67fc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1224f38df67c5378121c1d5f461bbc509e8ea1598e46c9f7a70452bc2bba86b8,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x02e4e69d8ba59e519280b4bd9ed0068fd7bfe8cd9dfeda1969d2989186cde20e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1f1eccc34aaba0137f5df81fc04ff3ee4f19ee364e653f076d47e9735d98018e,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1672ad3d709a353974266c3039a9a7311424448032cd1819eacb8a4d4284f582,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x283e3fdc2c6e420c56f44af5192b4ae9cda6961f284d24991d2ed602df8c8fc7,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1c2a3d120c550ecfd0db0957170fa013683751f8fdff59d6614fbd69ff394bcc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x216f84877aac6172f7897a7323456efe143a9a43773ea6f296cb6b8177653fbd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2c0d272becf2a75764ba7e8e3e28d12bceaa47ea61ca59a411a1f51552f94788,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x16e34299865c0e28484ee7a74c454e9f170a5480abe0508fcb4a6c3d89546f43,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x175ceba599e96f5b375a232a6fb9cc71772047765802290f48cd939755488fc5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0c7594440dc48c16fead9e1758b028066aa410bfbc354f54d8c5ffbb44a1ee32,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a3c29bc39f21bb5c466db7d7eb6fd8f760e20013ccf912c92479882d919fd8d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ccfdd906f3426e5c0986ea049b253400855d349074f5a6695c8eeabcd22e68f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x14f6bc81d9f186f62bdb475ce6c9411866a7a8a3fd065b3ce0e699b67dd9e796,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0962b82789fb3d129702ca70b2f6c5aacc099810c9c495c888edeb7386b97052,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a880af7074d18b3bf20c79de25127bc13284ab01ef02575afef0c8f6a31a86d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x10cba18419a6a332cd5e77f0211c154b20af2924fc20ff3f4c3012bb7ae9311b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x057e62a9a8f89b3ebdc76ba63a9eaca8fa27b7319cae3406756a2849f302f10d,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x287c971de91dc0abd44adf5384b4988cb961303bbf65cff5afa0413b44280cee,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21df3388af1687bbb3bca9da0cca908f1e562bc46d4aba4e6f7f7960e306891d,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1be5c887d25bce703e25cc974d0934cd789df8f70b498fd83eff8b560e1682b3,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x268da36f76e568fb68117175cea2cd0dd2cb5d42fda5acea48d59c2706a0d5c1,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0e17ab091f6eae50c609beaf5510ececc5d8bb74135ebd05bd06460cc26a5ed6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x04d727e728ffa0a67aee535ab074a43091ef62d8cf83d270040f5caa1f62af40,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0ddbd7bf9c29341581b549762bc022ed33702ac10f1bfd862b15417d7e39ca6e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2790eb3351621752768162e82989c6c234f5b0d1d3af9b588a29c49c8789654b,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1e457c601a63b73e4471950193d8a570395f3d9ab8b2fd0984b764206142f9e9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x21ae64301dca9625638d6ab2bbe7135ffa90ecd0c43ff91fc4c686fc46e091b0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0379f63c8ce3468d4da293166f494928854be9e3432e09555858534eed8d350b,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x002d56420359d0266a744a080809e054ca0e4921a46686ac8c9f58a324c35049,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x123158e5965b5d9b1d68b3cd32e10bbeda8d62459e21f4090fc2c5af963515a6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0be29fc40847a941661d14bbf6cbe0420fbb2b6f52836d4e60c80eb49cad9ec1,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ac96991dec2bb0557716142015a453c36db9d859cad5f9a233802f24fdf4c1a,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1596443f763dbcc25f4964fc61d23b3e5e12c9fa97f18a9251ca3355bcb0627e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x12e0bcd3654bdfa76b2861d4ec3aeae0f1857d9f17e715aed6d049eae3ba3212,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0fc92b4f1bbea82b9ea73d4af9af2a50ceabac7f37154b1904e6c76c7cf964ba,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1f9c0b1610446442d6f2e592a8013f40b14f7c7722236f4f9c7e965233872762,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0ebd74244ae72675f8cde06157a782f4050d914da38b4c058d159f643dbbf4d3,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2cb7f0ed39e16e9f69a9fafd4ab951c03b0671e97346ee397a839839dccfc6d1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1a9d6e2ecff022cc5605443ee41bab20ce761d0514ce526690c72bca7352d9bf,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2a115439607f335a5ea83c3bc44a9331d0c13326a9a7ba3087da182d648ec72f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x23f9b6529b5d040d15b8fa7aee3e3410e738b56305cd44f29535c115c5a4c060,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x05872c16db0f72a2249ac6ba484bb9c3a3ce97c16d58b68b260eb939f0e6e8a7,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1300bdee08bb7824ca20fb80118075f40219b6151d55b5c52b624a7cdeddf6a7,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x19b9b63d2f108e17e63817863a8f6c288d7ad29916d98cb1072e4e7b7d52b376,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x015bee1357e3c015b5bda237668522f613d1c88726b5ec4224a20128481b4f7f,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2953736e94bb6b9f1b9707a4f1615e4efe1e1ce4bab218cbea92c785b128ffd1,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0b069353ba091618862f806180c0385f851b98d372b45f544ce7266ed6608dfc,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x304f74d461ccc13115e4e0bcfb93817e55aeb7eb9306b64e4f588ac97d81f429,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x15bbf146ce9bca09e8a33f5e77dfe4f5aad2a164a4617a4cb8ee5415cde913fc,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0ab4dfe0c2742cde44901031487964ed9b8f4b850405c10ca9ff23859572c8c6,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0e32db320a044e3197f45f7649a19675ef5eedfea546dea9251de39f9639779a,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0a1756aa1f378ca4b27635a78b6888e66797733a82774896a3078efa516da016,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x044c4a33b10f693447fd17177f952ef895e61d328f85efa94254d6a2a25d93ef,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x2ed3611b725b8a70be655b537f66f700fe0879d79a496891d37b07b5466c4b8b,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f9ba4e8bab7ce42c8ecc3d722aa2e0eadfdeb9cfdd347b5d8339ea7120858aa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1b233043052e8c288f7ee907a84e518aa38e82ac4502066db74056f865c5d3da,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2431e1cc164bb8d074031ab72bd55b4c902053bfc0f14db0ca2f97b020875954,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x082f934c91f5aac330cd6953a0a7db45a13e322097583319a791f273965801fd,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2b9a0a223e7538b0a34be074315542a3c77245e2ae7cbe999ad6bb930c48997c,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0e1cd91edd2cfa2cceb85483b887a9be8164163e75a8a00eb0b589cc70214e7d,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e1eac0f2bfdfd63c951f61477e3698999774f19854d00f588d324601cebe2f9,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0cbfa95f37fb74060c76158e769d6d157345784d8efdb33c23d748115b500b83,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x08f05b3be923ed44d65ad49d8a61e9a676d991e3a77513d9980c232dfa4a4f84,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x22719e2a070bcd0852bf8e21984d0443e7284925dc0758a325a2dd510c047ef6,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x041f596a9ee1cb2bc060f7fcc3a1ab4c7bdbf036119982c0f41f62b2f26830c0,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x233fd35de1be520a87628eb06f6b1d4c021be1c2d0dc464a19fcdd0986b10f89,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x0524b46d1aa87a5e4325e0a423ebc810d31e078aa1b4707eefcb453c61c9c267,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2c34f424c81e5716ce47fcac894b85824227bb954b0f3199cc4486237c515211,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0b5f2a4b63387819207effc2b5541fb72dd2025b5457cc97f33010327de4915e,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22207856082ccc54c5b72fe439d2cfd6c17435d2f57af6ceaefac41fe05c659f,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x24d57a8bf5da63fe4e24159b7f8950b5cdfb210194caf79f27854048ce2c8171,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0afab181fdd5e0583b371d75bd693f98374ad7097bb01a8573919bb23b79396e,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2dba9b108f208772998a52efac7cbd5676c0057194c16c0bf16290d62b1128ee,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x26349b66edb8b16f56f881c788f53f83cbb83de0bd592b255aff13e6bce420b3,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x25af7ce0e5e10357685e95f92339753ad81a56d28ecc193b235288a3e6f137db,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x25b4ce7bd2294390c094d6a55edd68b970eed7aae88b2bff1f7c0187fe35011f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x22c543f10f6c89ec387e53f1908a88e5de9cef28ebdf30b18cb9d54c1e02b631,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0236f93e7789c4724fc7908a9f191e1e425e906a919d7a34df668e74882f87a9,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x29350b401166ca010e7d27e37d05da99652bdae114eb01659cb497af980c4b52,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0eed787d65820d3f6bd31bbab547f75a65edb75d844ebb89ee1260916652363f,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07cc1170f13b46f2036a753f520b3291fdcd0e99bd94297d1906f656f4de6fad,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x22b939233b1d7205f49bcf613a3d30b1908786d7f9f5d10c2059435689e8acea,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x01451762a0aab81c8aad1dc8bc33e870740f083a5aa85438add650ace60ae5a6,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x23506bb5d8727d4461fabf1025d46d1fe32eaa61dec7da57e704fec0892fce89,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x2e484c44e838aea0bac06ae3f71bdd092a3709531e1efea97f8bd68907355522,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x0f4bc7d07ebafd64379e78c50bd2e42baf4a594545cedc2545418da26835b54c,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1f4d3c8f6583e9e5fa76637862faaee851582388725df460e620996d50d8e74e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x093514e0c70711f82660d07be0e4a988fae02abc7b681d9153eb9bcb48fe7389,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1adab0c8e2b3bad346699a2b5f3bc03643ee83ece47228f24a58e0a347e153d8,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1672b1726057d99dd14709ebb474641a378c1b94b8072bac1a22dbef9e80dad2,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1dfd53d4576af2e38f44f53fdcab468cc5d8e2fae0acc4ee30d47b239b479c14,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x0c6888a10b75b0f3a70a36263a37e17fe6d77d640f6fc3debc7f207753205c60,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x1addb933a65be77092b34a7e77d12fe8611a61e00ee6848b85091ecca9d1e508,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x00d7540dcd268a845c10ae18d1de933cf638ff5425f0afff7935628e299d1791,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x140c0e42687e9ead01b2827a5664ca9c26fedde4acd99db1d316939d20b82c0e,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x2f0c3a115d4317d191ba89b8d13d1806c20a0f9b24f8c5edc091e2ae56565984,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0c4ee778ff7c14553006ed220cf9c81008a0cff670b22b82d8c538a1dc958c61,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1704f2766d46f82c3693f00440ccc3609424ed26c0acc66227c3d7485de74c69,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x2f2d19cc3ea5d78ea7a02c1b51d244abf0769c9f8544e40239b66fe9009c3cfa,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x1ae03853b75fcaba5053f112e2a8e8dcdd7ee6cb9cfed9c7d6c766a806fc6629,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x0971aabf795241df51d131d0fa61aa5f3556921b2d6f014e4e41a86ddaf056d5,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1408c316e6014e1a91d4cf6b6e0de73eda624f8380df1c875f5c29f7bfe2f646,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x1667f3fe2edbe850248abe42b543093b6c89f1f773ef285341691f39822ef5bd,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\t\t\tstate0 := add(\n\t\t\t\t0x13bf7c5d0d2c4376a48b0a03557cdf915b81718409e5c133424c69576500fe37,\n\t\t\t\tadd(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F))\n\t\t\t)\n\t\t\tstate1 := add(\n\t\t\t\t0x07620a6dfb0b6cec3016adf3d3533c24024b95347856b79719bc0ba743a62c2c,\n\t\t\t\tadd(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F))\n\t\t\t)\n\t\t\tscratch0 := mulmod(state0, state0, F)\n\t\t\tstate0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\n\t\t\tscratch0 := mulmod(state1, state1, F)\n\t\t\tstate1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\n\t\t\tscratch0 := add(\n\t\t\t\t0x1574c7ef0c43545f36a8ca08bdbdd8b075d2959e2f322b731675de3e1982b4d0,\n\t\t\t\tadd(mulmod(state0, M00, F), mulmod(state1, M10, F))\n\t\t\t)\n\t\t\tscratch1 := add(\n\t\t\t\t0x269e4b5b7a2eb21afd567970a717ceec5bd4184571c254fdc06e03a7ff8378f0,\n\t\t\t\tadd(mulmod(state0, M01, F), mulmod(state1, M11, F))\n\t\t\t)\n\t\t\tstate0 := mulmod(scratch0, scratch0, F)\n\t\t\tscratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\n\t\t\tstate0 := mulmod(scratch1, scratch1, F)\n\t\t\tscratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\n\n\t\t\tmstore(\n\t\t\t\t0x0,\n\t\t\t\tmod(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), F)\n\t\t\t)\n\n\t\t\treturn(0, 0x20)\n\t\t}\n\t}\n}\n" + }, + "contracts/YourContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"./Poseidon.sol\";\nimport \"./Groth16Verifier.sol\";\n\ncontract YourContract is ERC721, Groth16Verifier, Poseidon {\n\t// The known hash of the FrogCrypto signer\n\tuint256 constant FROGCRYPTO_SIGNER_HASH =\n\t\t320469162396708332516033932244029190181315114284264408621970394677041964715;\n\n\tuint256 private _nextTokenId;\n\t// Mapping from address to whether they've minted\n\tmapping(address => bool) public minted;\n\t// Mapping from token ID to owner address\n\tmapping(uint256 => address) public frogOwners;\n\n\tstruct ProofArgs {\n\t\tuint256[2] _pA;\n\t\tuint256[2][2] _pB;\n\t\tuint256[2] _pC;\n\t\tuint256[56] _pubSignals;\n\t}\n\n\tstruct FrogAttributes {\n\t\tuint256 beauty;\n\t\tuint256 biome;\n\t\tuint256 intelligence;\n\t\tuint256 jump;\n\t\tuint256 speed;\n\t\tuint256 rarity;\n\t\tuint256 owner;\n\t}\n\n\tevent FrogMinted(uint256 tokenId, address owner, FrogAttributes attributes);\n\n\tmodifier verifiedProof(ProofArgs calldata proof) {\n\t\trequire(\n\t\t\tthis.verifyProof(\n\t\t\t\tproof._pA,\n\t\t\t\tproof._pB,\n\t\t\t\tproof._pC,\n\t\t\t\tproof._pubSignals\n\t\t\t),\n\t\t\t\"Invalid proof\"\n\t\t);\n\t\t_;\n\t}\n\n\tmodifier notMinted() {\n\t\trequire(!minted[msg.sender], \"Already minted\");\n\t\t_;\n\t}\n\n\tconstructor() ERC721(\"FrogCrypto\", \"FROG\") {}\n\n\tfunction mintFrog(\n\t\tProofArgs calldata proof,\n\t\tFrogAttributes calldata attributes\n\t) public notMinted returns (uint256) {\n\t\t// First verify the proof and attributes\n\t\trequire(\n\t\t\tverifyFrogAttributes(proof, attributes),\n\t\t\t\"Invalid frog attributes\"\n\t\t);\n\n\t\t// Mint the NFT\n\t\tuint256 tokenId = _nextTokenId++;\n\t\tminted[msg.sender] = true;\n\t\tfrogOwners[tokenId] = msg.sender;\n\t\t_safeMint(msg.sender, tokenId);\n\n\t\temit FrogMinted(tokenId, msg.sender, attributes);\n\n\t\treturn tokenId;\n\t}\n\n\tfunction verifyFrogAttributes(\n\t\tProofArgs calldata proof,\n\t\tFrogAttributes calldata attrs\n\t) public view returns (bool) {\n\t\tuint256[56] memory pubSignals = proof._pubSignals;\n\n\t\t// Verify FrogCrypto signer\n\t\trequire(pubSignals[23] == FROGCRYPTO_SIGNER_HASH, \"Invalid signer\");\n\n\t\tuint256[1] memory input;\n\n\t\t// Verify beauty\n\t\tinput[0] = attrs.beauty;\n\t\trequire(this.hash(input) == pubSignals[0], \"Invalid beauty value\");\n\n\t\t// Verify biome\n\t\tinput[0] = attrs.biome;\n\t\trequire(this.hash(input) == pubSignals[1], \"Invalid biome value\");\n\n\t\t// Verify intelligence\n\t\tinput[0] = attrs.intelligence;\n\t\trequire(\n\t\t\tthis.hash(input) == pubSignals[2],\n\t\t\t\"Invalid intelligence value\"\n\t\t);\n\n\t\t// Verify jump\n\t\tinput[0] = attrs.jump;\n\t\trequire(this.hash(input) == pubSignals[3], \"Invalid jump value\");\n\n\t\t// Verify owner\n\t\tinput[0] = attrs.owner;\n\t\trequire(this.hash(input) == pubSignals[5], \"Invalid owner value\");\n\n\t\t// Verify rarity\n\t\tinput[0] = attrs.rarity;\n\t\trequire(this.hash(input) == pubSignals[6], \"Invalid rarity value\");\n\n\t\t// Verify speed\n\t\tinput[0] = attrs.speed;\n\t\trequire(this.hash(input) == pubSignals[7], \"Invalid speed value\");\n\n\t\treturn true;\n\t}\n\n\tfunction tokenURI(\n\t\tuint256 _tokenId\n\t) public view override returns (string memory) {\n\t\trequire(_exists(_tokenId), \"Token does not exist\");\n\t\t// customize this to return your frog metadata\n\t\treturn \"https://bg/frog-metadata/\";\n\t}\n\n\tfunction getFrogOwner(uint256 tokenId) public view returns (address) {\n\t\trequire(_exists(tokenId), \"Token does not exist\");\n\t\treturn frogOwners[tokenId];\n\t}\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/nextjs/app/api/squeeze/route.ts b/packages/nextjs/app/api/squeeze/route.ts index 2728b99..b89fcc1 100644 --- a/packages/nextjs/app/api/squeeze/route.ts +++ b/packages/nextjs/app/api/squeeze/route.ts @@ -1,11 +1,12 @@ // app/api/mint/route.ts import { NextResponse } from "next/server"; import OpenAI from "openai"; -import { createWalletClient, fallback, http, verifyMessage } from "viem"; +import { createPublicClient, createWalletClient, fallback, http, parseEventLogs, verifyMessage } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import deployedContracts from "~~/contracts/deployedContracts"; import scaffoldConfig from "~~/scaffold.config"; import { getAlchemyHttpUrl, getParsedError } from "~~/utils/scaffold-eth"; +import { SqueezeReward } from "~~/types/frog"; const wallet_private_key = (process.env.WALLET_PRIVATE_KEY || "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") as `0x${string}`; @@ -22,6 +23,11 @@ const walletClient = createWalletClient({ account: privateKeyToAccount(wallet_private_key), }); +const publicClient = createPublicClient({ + chain: mainNetwork, + transport: http(), +}); + const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); @@ -178,12 +184,33 @@ export async function POST(req: Request) { description, }); + const transaction = await publicClient.waitForTransactionReceipt( + { hash } + ); + console.log("Transaction: ", transaction); + + const logs = parseEventLogs({ + abi: contractAbi, + logs: transaction.logs, + }); + + console.log("The logs are: ", logs); + + const rewards: SqueezeReward = { + beauty: logs[0].args.beautyReward.toString(), + intelligence: logs[0].args.intelligenceReward.toString(), + jump: logs[0].args.jumpReward.toString(), + speed: logs[0].args.speedReward.toString(), + rarity: logs[0].args.rarityReward.toString(), + } + return NextResponse.json( { success: true, message: "Frog squeezed successfully", txHash: hash, story, + rewards, }, { status: 200 }, ); diff --git a/packages/nextjs/app/page.tsx b/packages/nextjs/app/page.tsx index 73e3c8c..6ae4956 100644 --- a/packages/nextjs/app/page.tsx +++ b/packages/nextjs/app/page.tsx @@ -10,8 +10,9 @@ import { PartialDeep } from "type-fest"; import { useAccount, useSignMessage } from "wagmi"; import { getParsedError, notification } from "~~/utils/scaffold-eth"; import { replacer } from "~~/utils/scaffold-eth/common"; -import { TokensBalances } from "~~/components/TokensBalances"; import { RainbowKitCustomConnectButton } from "~~/components/scaffold-eth"; +import { SqueezeReward } from "~~/types/frog"; +import { TokensRewards } from "~~/components/TokensRewards"; export interface PODData { entries: PODEntries; @@ -81,6 +82,7 @@ const Home = () => { const [isLoading, setIsLoading] = useState(false); const [story, setStory] = useState(null); const [squeezedFrogName, setSqueezedFrogName] = useState(null); + const [squeezeReward, setSqueezeReward] = useState(null); const { signMessageAsync } = useSignMessage(); @@ -215,6 +217,7 @@ const Home = () => { console.log("The data is", data); setStory(data.story); setSqueezedFrogName(frogName as string); + setSqueezeReward(data.rewards); notification.success(`Successfully squeezed Frog: ${frogName}`); } } catch (e) { @@ -250,7 +253,7 @@ const Home = () => { {isLoading ? "Squeezing..." : (story && squeezedFrogName ? "Squeeze Another Frog" : "Squeeze Frog")} )} - {story && squeezedFrogName && ( + {story && squeezedFrogName && squeezeReward && ( <>
@@ -263,14 +266,14 @@ const Home = () => {

Rewards

- +
)}
- {story && squeezedFrogName ? ( + {story && squeezedFrogName && squeezeReward ? ( ) : ( <> diff --git a/packages/nextjs/app/rewards/page.tsx b/packages/nextjs/app/rewards/page.tsx new file mode 100644 index 0000000..7404c4b --- /dev/null +++ b/packages/nextjs/app/rewards/page.tsx @@ -0,0 +1,41 @@ +"use client"; + +import { useAccount } from "wagmi"; +import { RainbowKitCustomConnectButton } from "~~/components/scaffold-eth"; +import { TokensBalances } from "~~/components/TokensBalances"; + +const Rewards = () => { + const { address: connectedAddress } = useAccount(); + + + if (!connectedAddress) { + return ( +
+
+ + +
+
+ ); + } + + return ( +
+
+
+
+
+

Rewards Balance

+
+ +
+
+
+ + +
+
+ ); +}; + +export default Rewards; diff --git a/packages/nextjs/components/Header.tsx b/packages/nextjs/components/Header.tsx index 697f43f..235a5df 100644 --- a/packages/nextjs/components/Header.tsx +++ b/packages/nextjs/components/Header.tsx @@ -4,9 +4,10 @@ import React, { useCallback, useRef, useState } from "react"; import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { Bars3Icon } from "@heroicons/react/24/outline"; +import { Bars3Icon, BanknotesIcon } from "@heroicons/react/24/outline"; import { FaucetButton, RainbowKitCustomConnectButton } from "~~/components/scaffold-eth"; import { useOutsideClick } from "~~/hooks/scaffold-eth"; +import { useAccount } from "wagmi"; type HeaderMenuLink = { label: string; @@ -15,14 +16,21 @@ type HeaderMenuLink = { }; export const menuLinks: HeaderMenuLink[] = [ + { + label: "Rewards", + href: "/rewards", + icon: , + }, ]; export const HeaderMenuLinks = () => { const pathname = usePathname(); + const { address: connectedAddress } = useAccount(); + return ( <> - {menuLinks.map(({ label, href, icon }) => { + {connectedAddress && menuLinks.map(({ label, href, icon }) => { const isActive = pathname === href; return (
  • diff --git a/packages/nextjs/components/TokensRewards.tsx b/packages/nextjs/components/TokensRewards.tsx new file mode 100644 index 0000000..1188492 --- /dev/null +++ b/packages/nextjs/components/TokensRewards.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import scaffoldConfig from "~~/scaffold.config"; +import { SqueezeReward } from "~~/types/frog"; + +export const TokensRewards = ({ rewards }: { rewards: SqueezeReward }) => { + return ( +
    + + + + + + + + + {scaffoldConfig.tokens.map(token => ( + + + + + ))} + +
    TokenReward
    {token.symbol} {token.name}{rewards[token.attribute.toLowerCase()]}
    +
    + ); +}; diff --git a/packages/nextjs/types/frog.d.ts b/packages/nextjs/types/frog.d.ts index c4a2aba..cb792b6 100644 --- a/packages/nextjs/types/frog.d.ts +++ b/packages/nextjs/types/frog.d.ts @@ -1,5 +1,13 @@ export type TTokenInfo = { - attribute: string; - name: string; - symbol: string; - }; \ No newline at end of file + attribute: string; + name: string; + symbol: string; +}; + +export type SqueezeReward = { + beauty: string; + intelligence: string; + jump: string; + speed: string; + rarity: string; +} \ No newline at end of file